Bil*_*ill 19 facebook ios facebook-ios-sdk
正如facebook-ios-sdk的自述文件中所述,我的应用程序在执行任何API调用之前调用Facebook#authorize:delegate:
此方法要求用户进行身份验证(在Facebook应用程序或Safari中),然后将控制权交还给我的iPhone应用程序.问题是它每次调用方法时都要求用户进行身份验证.如果他们已经授予我的应用程序权限,他们会收到一条消息,说该应用程序已经获得授权,他们必须按Okay才能返回我的应用程序.它看起来不太专业.
所以我有两个问题:
用户是否总是必须重新授权才能拨打Facebook电话?我一直以为它会将访问令牌保存在某处,也许是在用户默认值中,这样您就不需要重新授权了.
如果用户不必每次都重新授权,有没有办法检查我的应用程序是否已经拥有权限,那么用户不必看到该消息并按下确定?
Dan*_*tay 23
不幸的是,Facebook SDK不会自动为我们处理它.除了自己构建SDK之外,最简单的方法是:
每次分配_facebook:
_facebook = [[Facebook alloc] initWithAppId:@"SuperDuperAppID"];
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *accessToken = [prefs stringForKey:@"facebook-accessToken"];
NSString *expirationDate = [prefs stringForKey:@"facebook-expirationDate"];
_facebook.accessToken = accessToken;
_facebook.expirationDate = expirationDate;
Run Code Online (Sandbox Code Playgroud)
如果您从未在NSUserDefaults中保存任何内容,则将设置nil值.什么都没发生.否则,将设置true值,并[_facebook isSessionValid];应返回TRUE,表示良好的值.继续进行Facebook SDK调用,就好像他们已登录(他们是).如果为false,则调用
[facebook authorize:permissions delegate:self];
Run Code Online (Sandbox Code Playgroud)
照常.
然后确保支持以下Facebook委托方法:
- (void)fbDidLogin {
NSString *accessToken = _facebook.accessToken;
NSString *expirationDate = _facebook.expirationDate;
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:accessToken forKey:@"facebook-accessToken"];
[prefs expirationDate forKey:@"facebook-expirationDate"];
[prefs synchronize];
}
Run Code Online (Sandbox Code Playgroud)
我在我的应用程序中使用此代码,它完美地运行.我是从内存中做到的,所以如果它不能用于复制和粘贴,我会道歉.某处可能存在错误,加上不正确的内存管理.除非获得脱机许可,否则不要忘记访问令牌过期.无论如何,上面的代码处理一切.
问题是它每次调用方法时都要求用户进行身份验证.如果他们已经授予我的应用程序权限,他们会收到一条消息,说该应用程序已经获得授权,他们必须按Okay才能返回我的应用程序.
1)用户是否总是需要重新授权才能拨打Facebook电话?我一直以为它会将访问令牌保存在某处,也许是在用户默认值中,这样您就不需要重新授权了.
每次必须经历登录过程的原因是,在第一次成功签名后,Facebook SDK不会以持久的方式保存访问令牌.
2)如果用户不必每次都重新授权,有没有办法检查我的应用程序是否已经拥有权限,那么用户不必看到该消息并按下确定?
Facebook SDK不保存访问令牌这一事实并不意味着您不能自己动手.以下代码说明了如何从NSUserDefaults保存/检索访问令牌.
-(void)login {
// on login, use the stored access token and see if it still works
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
facebook.accessToken = [defaults objectForKey:ACCESS_TOKEN_KEY];
facebook.expirationDate = [defaults objectForKey:EXPIRATION_DATE_KEY];
// only authorize if the access token isn't valid
// if it *is* valid, no need to authenticate. just move on
if (![facebook isSessionValid]) {
NSArray * permissions = [NSArray arrayWithObjects:@"read_stream", @"offline_access", @"email", nil];
[facebook authorize:permissions delegate:self];
}
}
/**
* Called when the user has logged in successfully.
*/
- (void)fbDidLogin {
// store the access token and expiration date to the user defaults
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:facebook.accessToken forKey:ACCESS_TOKEN_KEY];
[defaults setObject:facebook.expirationDate forKey:EXPIRATION_DATE_KEY];
[defaults synchronize];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10043 次 |
| 最近记录: |