SDK Configuration
Point the Grovs mobile SDKs at your self-hosted backend and wire up Universal Links / App Links.
By default the Grovs SDKs connect to the managed Grovs cloud. To use your self-hosted backend, pass your SDK host as the baseURL when you initialize the SDK.
Deploy your stack first, then create a project in the dashboard to get an API key. There is a separate key per environment (test vs production).
The base URL is your SDK host
Pass baseURL = https://<SDK_HOST> — e.g. https://sdk.example.com. This is the sdk. subdomain of your production domain, not the bare domain.
Pass baseURL in every configure(...) call, including release/production builds. If you omit it (a common mistake in an #else / release branch), the SDK falls back to the hosted Grovs cloud (sqd.link) and your self-hosted links won't resolve. Also match useTestEnvironment to the API key's environment: test key → true, production key → false. A production link opened by a test-mode app (or vice-versa) won't resolve its payload.
iOS
import Grovs
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
Grovs.configure(
APIKey: "your-api-key",
useTestEnvironment: false,
baseURL: "https://sdk.example.com", // your SDK_HOST
delegate: self
)
return true
}Android
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
Grovs.configure(this, "your-api-key", useTestEnvironment = false, baseURL = "https://sdk.example.com")
}
}Flutter
<application>
<meta-data android:name="grovs_api_key" android:value="YOUR_API_KEY" />
<meta-data android:name="grovs_use_test_environment" android:value="false" />
<meta-data android:name="grovs_base_url" android:value="https://sdk.example.com" />
</application>React Native
Grovs.configure(
APIKey: "your-api-key",
useTestEnvironment: false,
baseURL: "https://sdk.example.com",
delegate: self
)Web
import Grovs from 'grovs';
const grovs = new Grovs('your-api-key', (data) => {
console.log('Link data:', data);
}, { baseURL: 'https://sdk.example.com' });
grovs.start();Server-to-server
Use the same host with header auth:
POST https://sdk.example.com/...
PROJECT-KEY: your-api-key
ENVIRONMENT: production # or "test"
Universal Links & App Links
Your deep links live on per-project subdomains of your two domains (random subdomains like a1b2c3d4.example.com), so your app must associate with the wildcards, not a single subdomain.
Associated Domains (iOS)
In Xcode → Signing & Capabilities → Associated Domains, add the wildcard for both domains:
applinks:*.example.com
applinks:*.example-test.com
App Links (Android)
Add intent filters for your link hosts in AndroidManifest.xml (Android verifies App Links per concrete host; add the link hosts you generate, or use your go. host for short links):
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" android:host="go.example.com" />
</intent-filter>The backend serves the /.well-known/apple-app-site-association and /.well-known/assetlinks.json files automatically on each link host — you don't host them yourself.
TLS for reliable Universal Links. Per-project link subdomains get their TLS certificate on demand on first request (≈ a few seconds). Apple's association CDN can time out during that cold-start and cache the failure for ~1 hour, so the app won't open the link. For production, pre-issue a wildcard certificate (*.example.com, *.example-test.com) via your DNS provider's API so every subdomain has TLS instantly. For development, you can append ?mode=developer to an applinks: entry and enable Settings → Developer → Associated Domains Development to fetch the association directly from your server, bypassing Apple's CDN.
After installing the app, delete-and-reinstall when you change Associated Domains — iOS caches the association at install time.
Verifying the connection
Enable debug logging and confirm the SDK talks to your sdk. host:
Grovs.setDebug(level: .info)