如何在 iOS 应用程序中集成 Facebook/Google+ 而无需重定向 Safari 浏览器
Posted
技术标签:
【中文标题】如何在 iOS 应用程序中集成 Facebook/Google+ 而无需重定向 Safari 浏览器【英文标题】:How to integrate Facebook/Google+ without redirect Safari browser in iOS app 【发布时间】:2015-05-15 07:47:31 【问题描述】:我尝试将 Facebook/Google+ 集成到我的应用中。我可以通过 ios 应用程序中的内置 Facebook 框架、Google Plus 框架、Google 开源框架来做到这一点,方法是从设备的设置应用程序中添加的帐户获取详细信息。我也可以通过打开 Safari 浏览器并在登录 Facebook 和 Goolge+ 后重定向到我的应用程序来做到这一点。所以,我需要不重定向 Safari 浏览器。
【问题讨论】:
只需删除 .Plist 中的URL Schema
你可以使用 UIWebView 而不是重定向到 Safari。
@Ritu - 你的答案是第二个选项,如果你删除了 plist 中的URL schema
,Facebook 会在应用程序内部提供弹出屏幕
@Anbu.Karthik 但 google+ 并非如此。
UIWebView 的任何示例应用程序,而不是重定向到 safari?
【参考方案1】:
使用新的 Google+ SDK,用户无需在 safari 或任何浏览器中重新输入密码。 看看这个: https://developers.google.com/+/mobile/ios/sign-in
如果用户安装了原生 Google 或 Google+ 移动应用,则用户无需重新输入其 Google 凭据即可授权您的应用。
或
试试GTMOAuth2ViewControllerTouch
- (id)initWithScope:(NSString *)scope
clientID:(NSString *)clientID
clientSecret:(NSString *)clientSecret
keychainItemName:(NSString *)keychainItemName
completionHandler:(GTMOAuth2ViewControllerCompletionHandler)handler
在线提供大量参考资料。 Google Drive iOS SDK: Display Cancel Login Button
【讨论】:
我认为,你应该检查谷歌链接:code.google.com/p/google-plus-platform/issues/detail?id=900 感谢@Ritu 提供的链接。让我直接与谷歌开发人员核实。我会根据他的意见更新我的答案。【参考方案2】:不要使用 Google-Plus,使用 GoogleSignIn。 Google 刚刚发布了这个解决方案:
fa...@google.com 对问题 900 的评论 #109:iOS SDK 登录不 离开应用 [Apple appstore 拒绝] https://code.google.com/p/google-plus-platform/issues/detail?id=900
大家好,
我很高兴地宣布此问题的更新。今天,我们推出了 Google 登录 2.0 版,具有完整的内置支持 通过 WebView 登录。我们希望此更新将最终解决 由于使用我们的 SDK 而导致 App Store 被拒绝的问题。
完整的文档在这里: https://developers.google.com/identity/sign-in/ios
我们在此处从 G+ Sign In 编写了迁移指南: https://developers.google.com/identity/sign-in/ios/quick-migration-guide
【讨论】:
【参考方案3】:您可以使用以下代码使用 Webview 通过 Google+ 登录:
初始化 UIWebview:
NSString *url = [NSString stringWithFormat:@"https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=%@&redirect_uri=%@&scope=%@",client_id,callbakc,scope];
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[webView setDelegate:self];
[self.view addSubview:webView];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];
委托方法的实现:
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
// [indicator startAnimating];
if ([[[request URL] host] isEqualToString:@"localhost"])
// Extract oauth_verifier from URL query
NSString* verifier = nil;
NSArray* urlParams = [[[request URL] query] componentsSeparatedByString:@"&"];
for (NSString* param in urlParams)
NSArray* keyValue = [param componentsSeparatedByString:@"="];
NSString* key = [keyValue objectAtIndex:0];
if ([key isEqualToString:@"code"])
verifier = [keyValue objectAtIndex:1];
break;
if (verifier)
NSString *authToken = [NSString stringWithFormat:@"code=%@&client_id=%@&client_secret=%@&redirect_uri=%@&grant_type=authorization_code", verifier,client_id,secret,callbakc];
//Use Token to Login
else
// ERROR!
[webView removeFromSuperview];
webView = nil;
return NO;
return YES;
【讨论】:
此代码只会返回 authToken 而不是 homeServerAuthorizationCode。需要服务器代码才能为应用启用服务器端 API 访问。【参考方案4】:使用 Scocial.framework https://developer.apple.com/library/ios/documentation/Social/Reference/Social_Framework/
__block ACAccount * facebookAccount;
ACAccountStore *accountStore = [[ACAccountStore alloc] init];
NSDictionary *emailReadPermisson = @
ACFacebookAppIdKey : @"YOUR_API_KEY",
ACFacebookPermissionsKey : @[@"email"],
ACFacebookAudienceKey : ACFacebookAudienceEveryone,
;
NSDictionary *publishWritePermisson = @
ACFacebookAppIdKey : @"YOUR_API_KEY",
ACFacebookPermissionsKey : @[@"publish_actions"],
ACFacebookAudienceKey : ACFacebookAudienceEveryone
;
ACAccountType *facebookAccountType = [accountStore
accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
//Request for Read permission
[accountStore requestAccessToAccountsWithType:facebookAccountType options:emailReadPermisson completion:^(BOOL granted, NSError *error) if(granted) // Enter your code];
【讨论】:
以上是关于如何在 iOS 应用程序中集成 Facebook/Google+ 而无需重定向 Safari 浏览器的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SLRequest 在 iOS 6 中集成 Facebook?
在我的 iOS 应用程序中集成 Facebook 应用程序时出现重定向问题
在 xcode4.3.2 的 ios App 中集成 facebook API 后出错
我们可以在 IOS 5.0 中集成 Facebook SDK 3.1 吗? [复制]