我正在尝试使用自定义方案从网页上打开我的应用程序。该应用已打开,但未调用以下方法:
func application(_ app: UIApplication, open url: URL, options [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
// This is not called
}
我的info.plist
如下所示:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>MyApp</string>
</array>
<key>CFBundleURLName</key>
<string>url here</string>
</dict>
</array>
该项目是使用Xcode 11.1创建的,我正在iOS 13上进行测试。
答案 0 :(得分:8)
在场景委托中实施scene(_:openURLContexts:)
。
如果该网址启动了您的应用,则您将获得scene(_:willConnectTo:options:)
且位于options
中。
答案 1 :(得分:1)
我遇到了同样的问题,scene(_ scene:, continue userActivity:)
和scene(_ scene:, openURLContexts URLContexts:)
都没有被呼叫。
当我检查传递给方法connectionOptions
的{{1}}时,它进行了具有预期URL的用户活动。因此,我最终手动调用了该方法:
scene(_ scene:, willConnectTo session, options connectionOptions:)
答案 2 :(得分:0)
感谢@Matt,这就是我解决问题的方式。
在SceneDelegate.m
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions { NSURL *url = connectionOptions.URLContexts.allObjects.firstObject.URL; NSLog(@"When app is not on memory ::::: %@",url); } - (void)scene:(UIScene *)scene openURLContexts:(NSSet *)URLContexts { NSURL *url = URLContexts.allObjects.firstObject.URL; NSLog(@"When app is on memory ::::: %@",url); }
答案 3 :(得分:0)
这是SceneDelegate.swift中的方法。适用于 iOS13
的Swift版本
@available(iOS 13.0, *)
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
if let url = URLContexts.first?.url {
// Handle URL
WXApi.handleOpen(url, delegate: AppDelegate.shared)
}
}
答案 4 :(得分:0)
使用最新的SDK,如果您不使用SceneDelegate,则可以正常工作。
如果使用的是SceneDelegate,则不会调用以下AppDelegate方法,因此无法处理登录。
func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
let handled = ApplicationDelegate.shared.application(
application,
open: url,
sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,
annotation: options[UIApplication.OpenURLOptionsKey.annotation])
return handled
}
这是因为(可以理解)将此方法推迟到SceneDelegate中的以下方法:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
...
}
我可以确认适用于实现SceneDelegate的iOS 13应用程序的解决方案是:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
guard let url = URLContexts.first?.url else {
return
}
let _ = ApplicationDelegate.shared.application(
UIApplication.shared,
open: url,
sourceApplication: nil,
annotation: [UIApplication.OpenURLOptionsKey.annotation])
}
答案 5 :(得分:0)
我遇到了一个问题,使用Safari浏览器快捷方式启动应用程序,多次调用openURLContexts。
std::vector<TextComponent>&
答案 6 :(得分:0)
iOS 14
MyApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
RootView()
.onOpenURL(perform: handleURL)
}
}
func handleURL(_ url: URL) {
}
}
答案 7 :(得分:-3)
Refer this apple documentation
如果您的实现从application:willFinishLaunchingWithOptions:和application:didFinishLaunchingWithOptions:方法返回否,则不调用此方法。 (如果仅实现这两种方法之一,则其返回值确定是否调用此方法。)如果您的应用实现了applicationDidFinishLaunching:方法,而不是application:didFinishLaunchingWithOptions :,则调用此方法以在应用程序打开后打开指定的URL。已初始化。 如果在您的应用暂停或在后台运行时到达URL,则系统会在调用此方法之前将您的应用移到前台。 此委派方法没有等效的通知。