ADVANCED
iOS Universal Links
When using External Browser flows, returning from Pay Station to your app via a custom URL scheme can trigger an iOS confirmation dialog (for example, βOpen this page in App Name?β). Using Universal Links (HTTPS) avoids this prompt and provides a smoother redirect back to the game.
The SDK supports Universal Links for redirecting back to your app.
Requirementsβ
To use Universal Links, you must configure your iOS project and your domain:
- Associated Domains: enable and configure in Xcode. See Apple docs: Supporting Associated Domains.
- Universal Links support. See Apple docs: Supporting universal links in your app.
SDK handling (automatic vs manual)β
If the SDK's automatic URL handling (swizzling) is enabled, Universal Links are handled automatically.
If you disabled automatic URL handling, you must forward the Universal Link to the SDK so it can process the callback (same idea as manual deep link handling, but the URL comes from NSUserActivity.webpageURL).
AppDelegateβ
- Objective-C
- Swift
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary<UIApplicationLaunchOptionsKey, id> *)launchOptions {
// Cold start (optional): app was launched by a Universal Link
NSDictionary *userActivityDict = launchOptions[UIApplicationLaunchOptionsUserActivityDictionaryKey];
NSUserActivity *activity = userActivityDict[UIApplicationLaunchOptionsUserActivityKey];
NSURL *url = activity.webpageURL;
if (url) {
[[SKPaymentQueue defaultQueue] openWithUrl:url];
}
return YES;
}
// Warm start: app receives a Universal Link while running/suspended
- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
NSURL *url = userActivity.webpageURL;
if (!url) { return NO; }
// Forward to SDK
BOOL handledBySDK = [[SKPaymentQueue defaultQueue] openWithUrl:url];
return handledBySDK;
}
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Cold start (optional): app was launched by a Universal Link
if let userActivityDict = launchOptions?[.userActivityDictionary] as? [AnyHashable: Any],
let activity = userActivityDict["UIApplicationLaunchOptionsUserActivityKey"] as? NSUserActivity,
let url = activity.webpageURL {
_ = SKPaymentQueue.default().open(url: url)
}
return true
}
// Warm start: app receives a Universal Link while running/suspended
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
guard let url = userActivity.webpageURL else { return false }
// Forward to SDK
let handledBySDK = SKPaymentQueue.default().open(url: url)
return handledBySDK
}
SceneDelegateβ
- Objective-C
- Swift
// Cold start: app was launched by a Universal Link
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
for (NSUserActivity *activity in connectionOptions.userActivities) {
NSURL *url = activity.webpageURL;
if (!url) { continue; }
// Forward to SDK
[[SKPaymentQueue defaultQueue] openWithUrl:url];
break;
}
}
// Warm start: app receives a Universal Link while running/suspended
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity {
NSURL *url = userActivity.webpageURL;
if (!url) { return; }
// Forward to SDK
[[SKPaymentQueue defaultQueue] openWithUrl:url];
}
// Cold start: app was launched by a Universal Link
func scene(_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions) {
if let userActivity = connectionOptions.userActivities.first,
let url = userActivity.webpageURL {
_ = SKPaymentQueue.default().open(url: url)
}
}
// Warm start: app receives a Universal Link while running/suspended
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
guard let url = userActivity.webpageURL else { return }
// Forward to SDK
_ = SKPaymentQueue.default().open(url: url)
}