iOS: 在应用内连接Facebook进行授权,无需离开应用程序

7
我知道在Graph API之前是有可能实现的。
我正在开发一个iPhone应用,该应用可能不在后台运行(其中一个要求)。此外,在应用启动时会出现登录界面。因此,为了认证Facebook并返回到应用程序并再次登录,每次用户想要分享内容时都不适合进入后台。
所以,我的问题是是否有一种方法可以在不离开应用程序的情况下进行Facebook认证。
顺便说一句,我已经尝试使用旧的API。一开始它是有效的,但昨天它停止工作了。我只看到旧的Facebook登录网页视图中的空白屏幕。我还检查了一个使用旧的Facebook Connect API的旧应用程序,并在该应用程序中获得了相同的空白登录屏幕。
任何想法将不胜感激。
提前感谢您。
-- Michael.
2个回答

8
在 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的支持后,这仍将继续工作? - Jane Sales
我认为应该可以正常工作,但如果出现与FB有关的问题,建议您更新应用程序。 - Marko Hlebar
我无法在ARC中使其工作,一旦我包含facebook.m文件以便进行编辑,就会出现各种与ARC相关的问题。 - Jimmy
@James,尝试使用下面Lio的SSOExtension解决方案。这比编辑Facebook.m文件更好。 - Marko Hlebar

6

这里提供了一种替代方案。

如果您不喜欢更改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代码需要更多的工作,但是如果他们重命名authorizeWithFBAppAuth:safariAuth:你的扩展将不起作用,请使用asserts快速检测此问题,则你将能够更新facebook-sdk而不会遇到大问题。此外,如果您正在构建一个可重复使用的组件来与Facebook互动而不重复做同样的事情,这也将为您节省一些工作。
干杯!

目前 - setPermissions 导致崩溃。[Facebook setPermissions:]: 未识别的选择器。 - Sebastian Bean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接