iOS:使用Facebook和Google,Google Plus登录
早上好 我正在尝试在同一视图中实现Facebook登录(工作正常)和google plus登录。我遵循官方网站(Google)的指南,但Facebook按钮和Google plus按钮之间存在一个问题: Facebook让我输入以下代码:iOS:使用Facebook和Google,Google Plus登录,ios,swift,facebook,google-plus,google-signin,Ios,Swift,Facebook,Google Plus,Google Signin,早上好 我正在尝试在同一视图中实现Facebook登录(工作正常)和google plus登录。我遵循官方网站(Google)的指南,但Facebook按钮和Google plus按钮之间存在一个问题: Facebook让我输入以下代码: -(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(i
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
return [FBAppCall handleOpenURL:url
sourceApplication:sourceApplication];
}
谷歌还告诉我要放以下内容:
- (BOOL)application: (UIApplication *)application
openURL: (NSURL *)url
sourceApplication: (NSString *)sourceApplication
annotation: (id)annotation {
return [GPPURLHandler handleURL:url
sourceApplication:sourceApplication
annotation:annotation];
}
我不能用同一个名字拥有相同的函数,也不能将一个函数集成到另一个函数中。这就是为什么我需要你的帮助,因为我不知道如何在这些指南之间处理这个问题
提前感谢。在这里,您必须在返回之前检查[url方案]。下面是示例代码
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
NSLog("%@", [url scheme]);
if([[url scheme] isEqualToString:FACEBOOK_SCHEME])
{
return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication];
}
else if([[url scheme] isEqualToString:GOOGLE_PLUS_SCHEME])
{
return [GPPURLHandler handleURL:url sourceApplication:sourceApplication annotation:annotation];
}
}
希望它能解决您的问题。这是Swift中的版本 首先,您应该了解如何看待Google和Facebook返回url之间的差异。检测算法为:
fb1106884526040279://authorize/…
withfb1106884526040279
是您的应用程序id。因此您只需检查此URL是否以您的应用程序id开头,主机是否等于authorize
(在/
之后的字符串和第一个//code>)
com.googleusercontent.apps.803921065829-m34o26vcj57oirk1oa8pqve5o22qdihn
,因此您只需检查此URL是否以com.googleusercontent.apps
开头GoogleAuth
和FacebookAuth
utils类,并使用了一些小方法,如注销、检查登录
这里是Google认证Utils
import Google
class GoogleAuth {
static func getInstance() -> GIDSignIn {
return GIDSignIn.sharedInstance()
}
static func isLogin() -> Bool {
return getInstance().hasAuthInKeychain()
}
static func signOut() {
getInstance().signOut()
}
static func isValidatedWithUrl(url: NSURL) -> Bool {
return url.scheme.hasPrefix(NSBundle.mainBundle().bundleIdentifier!) || url.scheme.hasPrefix("com.googleusercontent.apps.")
}
}
import FBSDKLoginKit
class FacebookAuth {
static func isLogin() -> Bool {
return FBSDKAccessToken.currentAccessToken() != nil
}
static func signOut() {
FBSDKLoginManager().logOut()
}
static func isValidatedWithUrl(url: NSURL) -> Bool {
return url.scheme.hasPrefix("fb\(FBSDKSettings.appID())") && url.host == "authorize"
}
}
其次是Facebook身份验证Utils
import Google
class GoogleAuth {
static func getInstance() -> GIDSignIn {
return GIDSignIn.sharedInstance()
}
static func isLogin() -> Bool {
return getInstance().hasAuthInKeychain()
}
static func signOut() {
getInstance().signOut()
}
static func isValidatedWithUrl(url: NSURL) -> Bool {
return url.scheme.hasPrefix(NSBundle.mainBundle().bundleIdentifier!) || url.scheme.hasPrefix("com.googleusercontent.apps.")
}
}
import FBSDKLoginKit
class FacebookAuth {
static func isLogin() -> Bool {
return FBSDKAccessToken.currentAccessToken() != nil
}
static func signOut() {
FBSDKLoginManager().logOut()
}
static func isValidatedWithUrl(url: NSURL) -> Bool {
return url.scheme.hasPrefix("fb\(FBSDKSettings.appID())") && url.host == "authorize"
}
}
这里是主要部分。在AppDelegate
中,调用isvalidatewithur
方法检查此url是否来自Google或Facebook
func application(application: UIApplication, openURL url: NSURL, options: [String: AnyObject]) -> Bool {
print("step 2 of OAuth2. Url: \(url)")
// url from google
if GoogleAuth.isValidatedWithUrl(url) {
return GIDSignIn.sharedInstance().handleURL(
url,
sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as? String,
annotation: options[UIApplicationOpenURLOptionsAnnotationKey])
}
// url from facebook
else if FacebookAuth.isValidatedWithUrl(url) {
return FBSDKApplicationDelegate.sharedInstance().application(application,
openURL: url,
sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String,
annotation: options [UIApplicationOpenURLOptionsAnnotationKey])
}
// application hasn't supported this url yet
else {
return false
}
}
希望能帮上忙:)谢谢你的帮助。你能解释一下你的代码吗?因为这是我的第一个应用,我有点迷路了。。。非常感谢。如果您在执行facebook登录或google登录后,只在
-(BOOL)应用程序:(UIApplication*)应用程序openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation
,请登录NSLog url方案或url。你将能够检查后,facebook登录和谷歌登录将是不同的url方案。希望你明白我的意思。如果您有疑问,请回复。再次感谢您。我必须在“FACEBOOK\u方案”中添加什么?这里FACEBOOK\u方案和GOOGLE\u PLUS\u方案是常量。FACEBOOK\u方案将像fb一样附加您的FACEBOOK api密钥,GOOGLE\u PLUS\u方案将是您的捆绑包id。希望您在登录时显示。