如何在 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 吗? [复制]

如何在 Rails 应用程序中集成 facebook 评论?

如何在 iPhone 应用程序中集成 Facebook 聊天