diff options
author | Juha Vuolle <[email protected]> | 2024-12-03 10:11:11 +0200 |
---|---|---|
committer | Juha Vuolle <[email protected]> | 2024-12-04 12:53:39 +0200 |
commit | c81f805817c82018e133ca140183f7ecee9d6130 (patch) | |
tree | e988382403b826b756da6221daf809d13a5f21cd | |
parent | 64590233aff4f7e9797f37484dbdd6d8465a1ea9 (diff) |
Add iOS UIScene related URL handling
Qt adopted UIScene lifecycle in Qt 6.8. As part of that switch,
the application URL delivery also changes to scene-specific, and the
previous QIOSApplicationDelegate URL handling callbacks aren't invoked
anymore.
This commit adds the URL handling to these scene-based callbacks:
willConnectToSession, openURLContexts, and continueUserActivity.
The older callbacks are removed as unnecessary.
With these additions, the application is capable of handling
custom-uri-schemes and https universal links, both when it's already
running, and when it needs to be launched.
Amends: 76ebf51bc08f6af624a8540e7af88b9129b22ae1
Pick-to: 6.8
Fixes: QTBUG-131741
Change-Id: Icacd76e9769f0a559b2052dfb60466a871187321
Reviewed-by: Tor Arne Vestbø <[email protected]>
-rw-r--r-- | src/plugins/platforms/ios/qiosapplicationdelegate.mm | 65 |
1 files changed, 29 insertions, 36 deletions
diff --git a/src/plugins/platforms/ios/qiosapplicationdelegate.mm b/src/plugins/platforms/ios/qiosapplicationdelegate.mm index c6e5a838741..088d48fc9ff 100644 --- a/src/plugins/platforms/ios/qiosapplicationdelegate.mm +++ b/src/plugins/platforms/ios/qiosapplicationdelegate.mm @@ -20,42 +20,6 @@ @implementation QIOSApplicationDelegate -- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> *restorableObjects))restorationHandler -{ - Q_UNUSED(application); - Q_UNUSED(restorationHandler); - - if (!QGuiApplication::instance()) - return NO; - - if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) { - QIOSIntegration *iosIntegration = QIOSIntegration::instance(); - Q_ASSERT(iosIntegration); - - QIOSServices *iosServices = static_cast<QIOSServices *>(iosIntegration->services()); - - return iosServices->handleUrl(QUrl::fromNSURL(userActivity.webpageURL)); - } - - return NO; -} - -- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options -{ - Q_UNUSED(application); - Q_UNUSED(options); - - if (!QGuiApplication::instance()) - return NO; - - QIOSIntegration *iosIntegration = QIOSIntegration::instance(); - Q_ASSERT(iosIntegration); - - QIOSServices *iosServices = static_cast<QIOSServices *>(iosIntegration->services()); - - return iosServices->handleUrl(QUrl::fromNSURL(url)); -} - - (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options @@ -94,6 +58,35 @@ window.rootViewController = [[[QIOSViewController alloc] initWithWindow:window andScreen:screen] autorelease]; + + if (connectionOptions.URLContexts.count > 0) + [self scene:scene openURLContexts:connectionOptions.URLContexts]; +} + +- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts +{ + qCDebug(lcQpaWindowScene) << "Handling openURLContexts for scene" << scene; + + QIOSIntegration *iosIntegration = QIOSIntegration::instance(); + Q_ASSERT(iosIntegration); + + QIOSServices *iosServices = static_cast<QIOSServices *>(iosIntegration->services()); + + for (UIOpenURLContext *urlContext in URLContexts) + iosServices->handleUrl(QUrl::fromNSURL(urlContext.URL)); +} + +- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity +{ + qCDebug(lcQpaWindowScene) << "Handling continueUserActivity for scene" << scene; + + if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) { + QIOSIntegration *iosIntegration = QIOSIntegration::instance(); + Q_ASSERT(iosIntegration); + + QIOSServices *iosServices = static_cast<QIOSServices *>(iosIntegration->services()); + iosServices->handleUrl(QUrl::fromNSURL(userActivity.webpageURL)); + } } @end |