添加 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
}
我使用 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
}