Module 10 — Testing
With the app running on a simulator, trigger links from the terminal and watch the console.
Fire links from the terminal
# Custom scheme
xcrun simctl openurl booted "yourapp://products/42"
# Nested screen
xcrun simctl openurl booted "yourapp://products/42/reviews"
# Campaign key (resolves campaign data from the backend)
xcrun simctl openurl booted "yourapp://products?keyName=YOUR_CAMPAIGN_KEY&source=instagram"
# Universal Link (opens the app once the association file lists your appID)
xcrun simctl openurl booted "https://link.paylisher.com/c/YOUR_CAMPAIGN_KEY"
The simulator may show an "Open in App?" confirmation for custom schemes — that prompt does not appear on a real cross-app tap.
Watch the logs
Set deepLinkConfig.debugLogging = true and look for this line in the Xcode console for every incoming link:
[PaylisherDeepLink] Handling URL: <incoming-url>
| Symptom | Likely cause |
|---|---|
| The line never appears | iOS isn't delivering the link → Module 2 (scheme / entitlements / AASA). |
| The line appears but you land on Home | Path ↔ parseTarget mismatch → Module 9 / Module 5. |
| Universal Link opens Safari instead | AASA missing or appID wrong → fix it and reinstall the app. |
The four scenarios to cover
- Warm start — app open, tap a link → correct screen.
- Cold start — kill the app, tap a link → app launches and lands on the target screen.
- Auth-gate — log out, open a protected link (
wallet) → login screen → after login, the target opens (Module 6). - Deferred — delete the app, tap a link, install from the App Store, open → target screen (Module 7).
Verify attribution
Open a campaign link, then fire any of your own events and confirm they carry campaign_key / deeplink_key / jid for that session (Module 8).
Next: Module 11 — Reference →