我使用URL方案从今天的小部件打开应用程序。 一切正常 - 当轻触小部件,加载应用程序并执行AppDelegate中的此方法时。
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {}
后来我添加了facebook登录的url方案,app仍然是从widget打开的,但AppDelegate的这个方法没有被执行。 Facebook登录工作正常。
关于网址方案的我的info.plist部分现在看起来像这样。
<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)
}
因此它也捕获了从小部件启动。我应该如何使用这两种方法?
答案 0 :(得分:1)
在让facebook处理网址之前,你可以检查它是不是你的fb方案:
if (url?.scheme == "your_fb_scheme") {
return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}
//have your own logic here
答案 1 :(得分:1)
我们无法在AppDelegate中实现这两种方法。从iOS 9.0开始,引入了以下方法。
这个代表在选项词典中有一堆键,如&#34; UIApplicationOpenURLOptionsKey&#34;,&#34; UIApplicationOpenURLOptionsAnnotationKey&#34;等你可以根据自己的需要使用。 你可以使用字典&#34;选项&#34;用这样的方法给出: -
-(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
}