Ios 处理openURL:使用Facebook和Google
我的应用程序中的用户可以使用两种服务登录:Facebook或Google 但是,在以下情况下,一切正常:Ios 处理openURL:使用Facebook和Google,ios,facebook,cocoa-touch,oauth-2.0,Ios,Facebook,Cocoa Touch,Oauth 2.0,我的应用程序中的用户可以使用两种服务登录:Facebook或Google 但是,在以下情况下,一切正常: - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation: (id)annotation { ... } 我应该决定调用Facebook回调或Google回调 如果用户有应用程序,这比
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation: (id)annotation {
...
}
我应该决定调用Facebook回调或Google回调
如果用户有应用程序,这比我根据sourceApplication决定的要简单
但如果没有(没有本地Facebook账户链接,没有FB应用,没有GooglePlus应用),它会链接到浏览器:(我不知道它是来自Facebook还是谷歌
有没有办法决定打什么电话?比如
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation: (id)annotation {
// how to decide?
if (facebook) {
return [FBSession.activeSession handleOpenURL:url];
} else if (google) {
return [GPPURLHandler handleURL:url sourceApplication:sourceApplication annotation:annotation];
}
}
您将要使用您可以尝试以下操作:
if ([[url absoluteString] rangeOfString:@"<Your Google Bundle ID>"].location == NSNotFound)
{
// Call FBAppCall's handleOpenURL:sourceApplication to handle Facebook app responses
BOOL wasHandled = [FBAppCall handleOpenURL:url sourceApplication:sourceApplication];
// You can add your app-specific url handling code here if needed
return wasHandled;
}
else
{
return [GPPURLHandler handleURL:url
sourceApplication:sourceApplication
annotation:annotation];
}
return YES;
在您的appdelegate.m
基本上,这将要做的是检查url前缀,然后调用google+方法(如果url前缀是ur google+bundle id),如果不是,它将调用fb方法。
希望这对我们有所帮助,我们不需要显式地检查URL,下面的代码可以做到这一点:-
- (BOOL)application: (UIApplication *)application openURL: (NSURL *)url sourceApplication: (NSString *)sourceApplication annotation: (id)annotation
{
if ([GPPURLHandler handleURL:url sourceApplication:sourceApplication annotation:annotation]) {
return YES;
}else if([FBAppCall handleOpenURL:url sourceApplication:sourceApplication]){
return YES;
}
return NO;
}
对于Swift用户,(来自user2144179的想法)
在框架下导入
import Firebase
import GoogleSignIn
import FacebookCore // (FBSDKCore's alternative for swift)
在您的委托方法中
// when your target is under iOS 9.0
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
let isFBOpenUrl = SDKApplicationDelegate.shared.application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
let isGoogleOpenUrl = GIDSignIn.sharedInstance().handle(url, sourceApplication: sourceApplication, annotation: annotation)
if isFBOpenUrl { return true }
if isGoogleOpenUrl { return true }
return false
}
或者,如果您的目标是9.0+,则可以使用另一个“open url:”方法。SDK也包括一个方法
Firebase参考:
Facebook参考:iOS9不推荐使用“application:openURL:sourceApplication:annotation:”方法。因此,现在您可以使用like
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary *)options {
// For Google sign in SDK
if ([[GIDSignIn sharedInstance] handleURL:url
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]]) {
return YES;
// For Facebook SDK
}else if ( [[FBSDKApplicationDelegate sharedInstance] application:app
openURL:url
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]]){
return YES;
//For Google plus SDK
}else if ([GPPURLHandler handleURL:url
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]]){
return YES;
}
return NO;
}
您可以在Swift 4.2版本中尝试以下操作:
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool
{
if (url.scheme?.hasPrefix("fb"))! {
return SDKApplicationDelegate.shared.application(app, open: url, options: options)
}
else
{
return GIDSignIn.sharedInstance().handle(url as URL?, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
annotation: options[UIApplicationOpenURLOptionsKey.annotation])
}
}
您可以让Google SDK或Facebook SDK尝试处理,如果SDK不处理,则允许其他SDK尝试:
@available(iOS 9.0, *)
private func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any])
-> Bool {
let handled: Bool = SDKApplicationDelegate.shared.application(application, open: url, options: options)
if handled { return handled }
return GIDSignIn.sharedInstance().handle(url,
sourceApplication:options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,
annotation: [:])
}
//deprecated method iOS 8 and older
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
let handled: Bool = SDKApplicationDelegate.shared.application(application,
open: url,
sourceApplication: sourceApplication,
annotation: annotation)
if handled { return handled }
return GIDSignIn.sharedInstance().handle(url,
sourceApplication: sourceApplication,
annotation: annotation)
}
iOS 9.0及以上版本的公认答案的Swift版本可能是这样的:
import FacebookCore
[...]
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
if (GIDSignIn.sharedInstance().handle(url)) {
return true
} else if (ApplicationDelegate.shared.application(app, open: url, options: options)) {
return true
}
return false
}
尝试用每个SDK处理URL,第一个识别URL的SDK在执行结束时返回true。如果没有SDK可以处理URL,则返回false
我希望它能帮助别人
哈维这可能是最简单的解决方案
import GoogleSignIn
import FBSDKCoreKit
func application(_ application: UIApplication,
open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
if GIDSignIn.sharedInstance().handle(url) {
return true
} else if ApplicationDelegate.shared.application(application, open: url, sourceApplication: sourceApplication, annotation: annotation) {
return true
}
return false
}
@available(iOS 9.0, *)
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool {
if GIDSignIn.sharedInstance().handle(url) {
return true
} else if ApplicationDelegate.shared.application(app, open: url, sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String, annotation: options[UIApplication.OpenURLOptionsKey.annotation]
) {
return true
}
return false
}
canOpenURL
首先,允许您判断设备上安装了哪些应用程序。您可以检查URL的前缀以确定它来自哪个服务。Facebook应用程序的URL将以fb:
@Idles开头请记住,这是回调方法。如果您的应用程序同时支持Facebook和google URL,canOpenURL
总是为这两个返回YES
。您可以检查url,这是对的,但通常库有一个handleURL:方法可以为您返回布尔值。除非您想自己变魔术,否则您不必自找麻烦。您可以交替测试url的方案是否以“fb”开头,这将使代码应用程序ID独立。天才,我一辈子都不明白为什么只有FB或G+在工作,尽管它给出了答案的解决方案,但从来都不能同时工作。最好解释一下我认为错误的代码,因为谷歌和Facebook在所有情况下都处理url…这应该是条件al,就像在接受回答中为facebook URL添加前缀检查一样
import FacebookCore
[...]
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
if (GIDSignIn.sharedInstance().handle(url)) {
return true
} else if (ApplicationDelegate.shared.application(app, open: url, options: options)) {
return true
}
return false
}
import GoogleSignIn
import FBSDKCoreKit
func application(_ application: UIApplication,
open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
if GIDSignIn.sharedInstance().handle(url) {
return true
} else if ApplicationDelegate.shared.application(application, open: url, sourceApplication: sourceApplication, annotation: annotation) {
return true
}
return false
}
@available(iOS 9.0, *)
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool {
if GIDSignIn.sharedInstance().handle(url) {
return true
} else if ApplicationDelegate.shared.application(app, open: url, sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String, annotation: options[UIApplication.OpenURLOptionsKey.annotation]
) {
return true
}
return false
}