Imprivata GroundControl

iOS Universal Link Callback Validator

This tool is intended for developers to validate Universal Link Callbacks implementation in apps.

Please review all the steps below before validating. You may test using either a physical device or using Xcode's iOS Simulator.

  1. Sign into your app as usual
  2. Important: Force quit your app. Do not skip this step, since it is part of the standard "check-in" process by Imprivata GroundControl.
  3. Load this web page in Safari on the device you are testing.
  4. In the box below, enter your app's universal link for logout. The tool will automatically add the correct ?ulc-success=... parameters.
  5. Tap the Validate button. Your app should briefly open, then open the Maps app.
  6. Verify the Maps app opens, showing Success, Arkansas.
  7. Open your app and confirm that the logout occurred as expected. Your app should prompt for the next sign-in.
  8. If your app has a back-end, ensure that the session has closed cleanly as expected, the user is marked as offline, etc.
Result Interpretation
Safari opens with an unknown page and your app never opens ❌ Your app is not configured properly with an associated domain. Please refer to Apple's documentation.
Your app opens but Maps never opens ❌ After opening, your app must call either &ulc-success or &ulc-error using open(_:options:completionHandler:).
Your app opens, then Apple Maps opens, showing Success, Arkansas ✅ Your app parsed the ULC, then triggered the &ulc-success link.
Your app opens, then Apple Maps opens, showing Error Island, Alaska ✅ Your app parsed the ULC, then triggered the &ulc-error link. If you intended to generate an error, then this worked as expected. Otherwise, examine your app's code to understand why your app called the ulc-error link.
Your app opens, then Apple Maps opens, showing Success, Arkansas, but your app has not logged out, especially if you force-quit as recommended in our instructions. ❌ This is a common issue with apps, where on "cold start" they experience a race condition. The app tries to start up (perhaps re-establishing a server session), while at the same time it processes the universal link callback. It is important to process the callback only after your app has fully executed its startup sequence.