iOS:连接到Facebook而无需离开应用程序进行授权

Mic*_*ler 7 iphone facebook background facebook-graph-api ios

我知道在Graph API之前有可能.

我在一个可能不在后台的iPhone应用程序上工作(其中一个要求).
此外,应用程序启动时还有一个登录屏幕.
因此,每次用户想要分享内容时,不适合前往Facebook进行身份验证,然后返回应用并再次登录.

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

顺便说一下,我曾尝试使用旧的API.
它起初工作但昨天它停止工作.
我只是在旧的Facebook登录网页视图中看到一个空白屏幕.
我还检查了一个使用旧版Facebook Connect API的旧应用程序,我也在该应用程序中获得了相同的空白登录屏幕.

任何想法将不胜感激.

先感谢您.

-
迈克尔

Mar*_*bar 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];
Run Code Online (Sandbox Code Playgroud)

方法注释掉这个

 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]];
    }
  }
Run Code Online (Sandbox Code Playgroud)

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


Lio*_*Lio 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
Run Code Online (Sandbox Code Playgroud)

即使这需要更多的工作而不是注释掉sso代码,你将能够更新facebook-sdk而不会出现重大问题(如果他们重命名authorizeWithFBAppAuth:safariAuth:你的扩展将不起作用,使用asserts快速检测这个问题).此外,如果您正在构建一个可重用的组件来与Facebook进行交互而不会一遍又一遍地重复,那么这也将为您节省一些工作.

干杯.