iOS:无需离开应用授权即可连接 Facebook

Posted

技术标签:

【中文标题】iOS:无需离开应用授权即可连接 Facebook【英文标题】:iOS: Connect to Facebook without leaving the app for authorization 【发布时间】:2011-04-14 16:36:03 【问题描述】:

我知道在 Graph API 之前这是可能的。

我正在开发可能不在后台的 iPhone 应用程序(要求之一)。 此外,应用启动时还有一个登录屏幕。 因此,每次用户想要分享某些内容时,不适合去后台进行 Facebook 身份验证,然后返回应用程序并再次登录。

所以,我的问题是,是否有一种方法可以在不离开应用的情况下通过 Facebook 进行身份验证。

顺便说一句,我已尝试使用旧 API。 一开始它有效,但昨天它停止了工作。 我只是在旧的 Facebook 登录 Web 视图中看到一个空白屏幕。 我还检查了我的一个使用旧 Facebook Connect API 的旧应用程序,我在该应用程序中也看到了相同的空白登录屏幕。

任何想法都会受到赞赏。

提前谢谢你。

-- 迈克尔。

【问题讨论】:

【参考方案1】:

在 Facebook.m 中

- (void)authorizeWithFBAppAuth:(BOOL)tryFBAppAuth
                    safariAuth:(BOOL)trySafariAuth 
  NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                 _appId, @"client_id",
                                 @"user_agent", @"type",
                                 kRedirectURL, @"redirect_uri",
                                 @"touch", @"display",
                                 kSDKVersion, @"sdk",
                                 nil];

方法注释掉这个

 UIDevice *device = [UIDevice currentDevice];
  if ([device respondsToSelector:@selector(isMultitaskingSupported)] && [device isMultitaskingSupported]) 
    if (tryFBAppAuth) 
      NSString *fbAppUrl = [FBRequest serializeURL:kFBAppAuthURL params:params];
      didOpenOtherApp = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:fbAppUrl]];
    

    if (trySafariAuth && !didOpenOtherApp) 
      NSString *nextUrl = [NSString stringWithFormat:@"fb%@://authorize", _appId];
      [params setValue:nextUrl forKey:@"redirect_uri"];

      NSString *fbAppUrl = [FBRequest serializeURL:loginDialogURL params:params];
      didOpenOtherApp = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:fbAppUrl]];
    
  

这将阻止应用程序进入后台并向您显示标准的 fb 对话框。

【讨论】:

我也非常感谢您 - 一位客户迫切需要这个而不是单点登录,它为我节省了很多工作。您能否确认在 Facebook 取消对 OAUTH 1 和旧版 SDK 的支持后这将继续有效? 我认为应该可以,但如果 FB 出现问题,我建议您更新应用程序。 我无法让它与 ARC 一起使用,当我包含 facebook.m 文件以便我可以编辑时,就会出现各种与 ARC 相关的问题 @James,尝试从下面使用 Lio 的 SSOExtension 解决方案。编辑 Facebook.m 文件是一个更好的主意。【参考方案2】:

这里有一个替代解决方案。

如果您不喜欢更改 facebook sdk 代码并想要一个允许您在 SSO 或老式机制之间进行选择的解决方案,您可以实现这样的扩展:

//Facebook_SSOExtension.h
--------------------------------------------------------

@interface Facebook(SSOExtension)
-(void) authorize:(NSArray*)permissions useSSO:(BOOL) useSSO;
@end

//Facebook_SSOExtension.m
--------------------------------------------------------

//So warnings do not appear
@interface Facebook(PrivateSSOExtension)
- (void)authorizeWithFBAppAuth:(BOOL)tryFBAppAuth
                    safariAuth:(BOOL)trySafariAuth;
-(void) setPermissions:(NSArray*) permissions;
@end 

@implementation Facebook(SSOExtension)
-(void) authorize:(NSArray*)permissions useSSO:(BOOL) useSSO

    [self setPermissions: permissions];
    [self authorizeWithFBAppAuth:useSSO safariAuth:useSSO];

@end

尽管这需要比注释掉 sso 代码更多的工作,但您将能够更新 facebook-sdk 而不会出现重大问题(如果他们重命名 authorizeWithFBAppAuth:safariAuth:您的扩展将不起作用,请使用断言来检测此问题迅速地)。此外,如果您正在构建一个可重用的组件来与 facebook 交互而无需一遍又一遍地重复,这也将为您节省一些工作。

干杯。

【讨论】:

当前 - setPermissions 导致崩溃。 [Facebook setPermissions:]:无法识别的选择器

以上是关于iOS:无需离开应用授权即可连接 Facebook的主要内容,如果未能解决你的问题,请参考以下文章

Facebook SDK iOS - 授权应用内?

使用 Facebook 和 iOS 自定义应用内登录和授权

Facebook PHP SDK - 无需 Facebook 连接即可获取我的应用用户的用户名和个人资料图片

授权应用程序时不再识别 Facebook 连接 publish_stream (iOS)

无需登录即可查看 Facebook 用户的帖子和分享 [关闭]

Ad hoc iOS 应用程序 - 无需 iTunes 即可分发