Register the custom URL scheme
Update yourInfo.plist to register the scheme. Replace APP_TOKEN with your app’s Userpilot token, which you can obtain from your Environments Page.
For example, if your token is NX-12345678, your scheme value is userpilot-nx-12345678.
Use the token exactly as passed to the SDK, in lowercase. Keep the
STG- prefix
for staging: STG-NX-12345678 uses userpilot-stg-nx-12345678, while
NX-12345678 uses userpilot-nx-12345678.
Handle the custom URL scheme
Forward incoming URLs withfilterAndHandle(_:) or didHandleURL(_:).
filterAndHandle(_:) returns the set of URL contexts that Userpilot did not handle;
didHandleURL(_:) returns true when Userpilot handled a single URL. Pass unhandled
URLs to your own routing logic.
Scene delegate
Handle both entry points.scene(_:willConnectTo:options:) covers a cold launch from a link, and scene(_:openURLContexts:) covers a link that arrives while your app is already running. Miss the first and links only work when the app is already open.
App delegate
If your app uses only an app delegate, add the following:SwiftUI
A SwiftUI app handles the scheme in theonOpenURL modifier attached to the Scene of your main App:
Supported links
The SDK only claims a URL when the scheme matches your token and the host issdk. Every other URL is passed back to your app.
Push notifications on iOS do not arrive through the URL scheme. The SDK receives them natively, so follow Push Notifications for that setup. On Android the notification tap is a deep link, which is why the Android guide covers an extra
sdk/notification path.Preview an experience with a QR code
Userpilot can render a draft experience on your device before you publish it, so you can check layout, copy, and behavior on a real screen. Preview is supported for Flows and Surveys. The preview is delivered over the custom URL scheme. It works once your app is installed on the device and the scheme is registered and handled as described above.1
Open the experience
Open a Flow or Survey in the Experience Builder and enter Edit Mode.
2
Start the preview
Select Preview in the top-right corner of the builder. A popup with a QR code appears.
3
Scan the QR code
Scan the code with your device camera. Your app opens and the experience appears.
- You don’t need to apply or save your changes before previewing them.
- The experience doesn’t need to be live.
- A preview bypasses the experience’s targeting and frequency settings, so it appears even when the current user wouldn’t normally qualify for it.
- Once you close the experience, the app resumes normal behavior.
Test push notifications
You can send a test push to a specific user from the Userpilot dashboard and verify delivery and tap handling on a real device without sending anything to your wider audience. The notification doesn’t need to be live, so you can test it while it’s still a draft.- Test pushes work in both the staging and production environments.
- Test pushes are not counted as real sends, and they’re excluded from analytics.
- Test pushes bypass the notification’s targeting and frequency settings.
Test a deep link from the command line
Open a link against the iOS Simulator to confirm your scheme is registered and your handler runs, without going through the Builder:12345 with a real experience ID. Enable SDK logging during setup to see the SDK report which link it received and what it did with it.
Troubleshooting
Nothing happens when I scan the QR code
Nothing happens when I scan the QR code
Confirm the scheme in
Info.plist matches your token exactly, lowercased. A mismatched scheme means iOS never routes the link to your app, so your handler is not called at all. Verify the registration with the xcrun simctl openurl command above.The app opens but the experience doesn't appear
The app opens but the experience doesn't appear
iOS routed the link, so registration is correct and the problem is in the handling step. Check that you call
filterAndHandle(_:) or didHandleURL(_:) on every entry point your app uses, including scene(_:willConnectTo:options:) for cold launches. Also confirm the SDK is set up with the same token that generated the QR code.Preview works in production but not in staging
Preview works in production but not in staging
Each environment has its own token, and the scheme follows the token. Confirm the staging build registers the scheme for the token it initializes the SDK with.
My own deep links stopped working
My own deep links stopped working
Both handling methods report whether Userpilot claimed the URL. Make sure you still process the URLs they hand back: the contexts returned by
filterAndHandle(_:), or any URL where didHandleURL(_:) returned false.