Facebook总是在每次推出应用程序时重新授权?

时间:2012-04-14 18:19:53

标签: iphone facebook facebook-graph-api

我最近在我的应用程序中添加了Facebook集成,除非用户重新启动应用程序,否则一切正常。每次重新启动应用程序时,Facebook都必须返回其授权过程。这涉及将应用程序切换到Safari / Facebook,然后再切换回我的应用程序。如何让Facebook保存信息,或者能够获得我的应用程序的一揽子权限,以便我不会不断重新授权?

以下是applicationDidFinishLaunchingWithOptions:方法的代码:

facebook = [[Facebook alloc] initWithAppId:@"203604286395694" andDelegate:self];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"FBAccessTokenKey"] 
    && [defaults objectForKey:@"FBExpirationDateKey"]) {
    facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
    facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
}
if (![facebook isSessionValid]) {
    [facebook authorize:nil];
}

相关Facebook委托方法:

- (void)fbDidLogin {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];

}

- (void) requestDialogButtonClicked {
    NSMutableDictionary* params = 
    [NSMutableDictionary dictionaryWithObjectsAndKeys:
     @"invites you to check out cool stuff",  @"message",
     @"Check this out", @"notification_text",
     nil];  
    [facebook dialog:@"apprequests"
           andParams:params
         andDelegate:self];
}

- (void)dialogDidComplete:(FBDialog *)dialog {
    NSLog(@"dialog completed successfully");
}

2 个答案:

答案 0 :(得分:0)

你打电话给Facebook授权:某个地方?这就是fbDidLogin将被触发的方式。假设你是,行为表明令牌或日期(或两者)都是零,或者日期已过期(不太可能)。

在写入和读取用户默认值时记录值。我的猜测是授权要么未被调用,要么失败(由于app键或代码中未显示的其他问题),使得fbDidLogin方法无法调用或保存nil值。

答案 1 :(得分:0)

这是因为您在授权应用时没有要求权限。“offline_access”提供长期访问令牌,因此每次用户想要使用Facebook时都不需要获取新的访问令牌。所以您需要如何授权您的应用

if (![facebook isSessionValid]) {
    NSArray *permissions = [[NSArray alloc] initWithObjects:
            @"user_likes", 
            @"read_stream",
            @"offline_access"
            nil];
        [facebook authorize:permissions];
        [permissions release];
}

修改: 请在实施中检查以下内容:

1.您需要在应用程序委托中添加以下函数(此处的Facebook对象是FaceBook类的实例值)。

// Pre 4.2 support
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 
{
   return [facebook handleOpenURL:url]; 
}

// For 4.2+ support
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
   return [facebook handleOpenURL:url]; 
}

2.在您的info.plist中添加网址类型>网址方案>你的Facebook应用程序ID带有fb前缀(最后你的值将是这样的,例如fb313714 ***)。