我使用URL方案从“今日”小部件打开应用程序。
一切工作正常-当小部件被点击,应用程序加载,这个方法从AppDelegate被执行。
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {}
后来我添加了facebook登录的url方案,应用程序仍然从widget打开,但是AppDelegate的这个方法没有被执行。Facebook登录可以正常工作。
我的info.plist关于url方案的部分现在看起来是这样的。
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>MY_URL_SCHEME</string>
<string>fb{someid}</string>
</array>
</dict>
</array>
更新:
我发现Facebook在AppDelegate中也需要这个方法
@available(iOS 9.0, *)
func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
return SDKApplicationDelegate.shared.application(application, open: url, options: options)
}
因此,它还捕获了从widget启动。我应该如何使用这两种方法?
最佳答案
我们不能在AppDelegate中同时实现这两个方法。从iOS 9.0开始,引入了以下方法。
此委托在选项字典中有许多键,如“uiapplicationopenurlpoptionskey”、“uiapplicationopenurlpoptionsannotationkey”等,您可以根据需要使用这些键。
您可以使用如下方法中提供的字典“选项”:-
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
if ([url.scheme isEqualToString:@"YOUR_FACEBOOK_ID"]){
return [[FBSDKApplicationDelegate sharedInstance] application:app openURL:url sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
}
return NO;
}
SWIFT代码:-
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
if url.scheme == "YOUR_FACEBOOK_ID"{
return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[.sourceApplication] as! String!, annotation: options[.annotation])
}
return false
}