添加 Facebook URL 方案后 URL 方案停止工作

URLScheme stopped working after adding Facebook URLScheme

我使用 URL 方案从今天的小部件打开应用程序。 一切正常 - 当小部件被点击时,应用程序加载并执行了 AppDelegate 中的这个方法。

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {}

后来我为 facebook 登录添加了 url 方案,应用程序仍然从小部件打开,但是 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)
}

所以它也捕获从小部件启动。我该如何使用这两种方法?

在让 facebook 处理 url 之前,您可以检查它是 fb 方案还是您的方案:

    if (url?.scheme == "your_fb_scheme") {
        return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
    }
    //have your own logic here

我们不能在 AppDelegate 中实现这两种方法。从 iOS 9.0 开始,引入了以下方法。

这个代表在选项字典中有一堆键,如"UIApplicationOpenURLOptionsKey"、"UIApplicationOpenURLOptionsAnnotationKey"等,你可以根据需要使用。 您可以使用像这样的方法中给出的字典 "options" :-

-(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

}