我使用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

}

10-05 20:05