Mik*_*e M 6 facebook ios facebook-ios-sdk
我有一个后端服务,它将在我的应用程序中登录并从之前的登录中返回扩展的facebook令牌,可能来自另一台设备(因此此设备上没有缓存凭据).我想使用此令牌来启动Facebook会话.我使用的是:
FBSession* session = [[FBSession alloc] initWithPermissions:@[@"publish_actions"]];
FBAccessTokenData* tokenData =
[FBAccessTokenData createTokenFromString:token
permissions:@[@"publish_actions"]
expirationDate:nil
loginType:FBSessionLoginTypeTestUser
refreshDate:nil];
[session openFromAccessTokenData:tokenData completionHandler:nil];
Run Code Online (Sandbox Code Playgroud)
为了清楚起见,我在这里传递'nil',在我的代码中,我处理完成并返回返回的会话对象,该对象看起来处于打开状态且没有错误.当我尝试使用会话时,我收到如下错误:
Error Domain=com.facebook.sdk Code=5 "The operation couldn’t be completed. (com.facebook.sdk error 5.)" UserInfo=0xb8b1680 {com.facebook.sdk:HTTPStatusCode=403, com.facebook.sdk:ParsedJSONResponseKey={
body = {
error = {
code = 200;
message = "(#200) The user hasn't authorized the application to perform this action";
type = OAuthException;
};
};
code = 403;
}, com.facebook.sdk:ErrorSessionKey=<FBSession: 0xa2b62a0, state: FBSessionStateOpen, loginHandler: 0xa29e9b0, appID: 131721883664256, urlSchemeSuffix: , tokenCachingStrategy:<FBSessionTokenCachingStrategy: 0xa273f60>, expirationDate: 4001-01-01 00:00:00 +0000, refreshDate: 2013-07-26 16:21:10 +0000, attemptedRefreshDate: 0001-12-30 00:00:00 +0000, permissions:(
email,
"publish_actions"
)>}
Run Code Online (Sandbox Code Playgroud)
有什么建议...?
我找到了一个解决方案:(前提是你有一个现有的令牌)
首先将FBSessionTokenCachingStrategy类子类化为MySessionTokenCachingStrategy并覆盖以下方法:
- (FBAccessTokenData *)fetchFBAccessTokenData
{
NSMutableDictionary *tokenInformationDictionary = [NSMutableDictionary new];
// Expiration date
tokenInformationDictionary[@"com.facebook.sdk:TokenInformationExpirationDateKey"] = [NSDate dateWithTimeIntervalSinceNow: 3600];
// Refresh date
tokenInformationDictionary[@"com.facebook.sdk:TokenInformationRefreshDateKey"] = [NSDate date];
// Token key
tokenInformationDictionary[@"com.facebook.sdk:TokenInformationTokenKey"] = self.token;
// Permissions
tokenInformationDictionary[@"com.facebook.sdk:TokenInformationPermissionsKey"] = self.permissions;
// Login key
tokenInformationDictionary[@"com.facebook.sdk:TokenInformationLoginTypeLoginKey"] = @0;
return [FBAccessTokenData createTokenFromDictionary: tokenInformationDictionary];
}
Run Code Online (Sandbox Code Playgroud)
然后使用上面的类来创建
MySessionTokenCachingStrategy* tokenCachingStrategy =
[[MySessionTokenCachingStrategy alloc] initWithToken:token
andPermissions:@[@"read_stream"]];
FBSession *session = [[FBSession alloc] initWithAppID: nil
permissions: @[@"read_stream"]]
urlSchemeSuffix: nil
tokenCacheStrategy: tokenCachingStrategy];
if (session.state == FBSessionStateCreatedTokenLoaded)
{
// Set the active session
[FBSession setActiveSession: session];
// Open the session, but do not use iOS6 system acount login
// if the caching strategy does not store info locally on the
// device, otherwise you could use:
// FBSessionLoginBehaviorUseSystemAccountIfPresent
[session openWithBehavior: FBSessionLoginBehaviorWithFallbackToWebView
completionHandler: ^(FBSession *session,
FBSessionState state,
NSError *error) {
if (!error)
{
if (session.isOpen)
{
successBlock();
}
}
else
{
failureBlock([error description]);
}
}];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3311 次 |
| 最近记录: |