2013-07-26 26 views
6

Tôi có dịch vụ phụ trợ sẽ đăng nhập tôi trong ứng dụng và trả lại mã thông báo mở rộng từ lần đăng nhập trước đó, có thể từ thiết bị khác (vì vậy không có thông tin xác thực được lưu trong thiết bị này). Tôi muốn sử dụng mã thông báo này để bắt đầu một phiên Facebook. Tôi đang sử dụng một cái gì đó như:Mở FBSession với dữ liệu Token hiện tại trên iOS

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]; 

Tôi đây đi 'nil' cho rõ ràng, trong mã của tôi, tôi đang xử lý hoàn tất và loggin đối tượng phiên trở lại mà dường như trong trạng thái mở với không có lỗi. Khi tôi thử và sử dụng phiên, tôi gặp lỗi như:

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" 
)>} 

Mọi đề xuất ...?

+0

Cách tiếp cận này hoạt động tốt trong phiên bản sdk 3.21.1. Có thể là mã thông báo không được tạo ra từ FBSessionLoginTypeTestUser và đó là lý do tại sao nó nói rằng người dùng không được ủy quyền. –

Trả lời

5

Tôi tìm thấy một giải pháp: (miễn là bạn có một thẻ hiện có)

Đầu tiên lớp lớp FBSessionTokenCachingStrategy như MySessionTokenCachingStrategy và ghi đè lên các phương pháp dưới đây:

- (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]; 
} 

Sau đó, sử dụng lớp trên để tạo

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]); 
        } 
       }]; 
    } 
+0

Cảm ơn bạn @Mike M bạn đã cứu tôi rất nhiều thời gian! – sonxurxo

+1

Tôi khuyên bạn nên kiểm tra từng biến cho nil TRƯỚC KHI thêm nó vào NSMutableDictionary, tôi đã nhìn thấy sự cố khi thêm một chuỗi nil vào trường TokenInformationTokenKey. Tôi tin cậy ACAccountStore để cung cấp cho tôi một tài khoản VỚI mã thông báo không phải là oAuth, nhưng điều đó không phải lúc nào cũng đúng –

+0

Tôi sẽ đề nghị rằng điều này được thực hiện trước khi thực sự tạo chiến lược token, vì nó sẽ thất bại nếu một trong các biến không hiện tại hoặc chính xác. Điều này sẽ làm cho việc gỡ lỗi khó hơn là chỉ phân nhánh trước khi mã thực sự được gọi. –

0

Điều này không phải do thực tế là bạn cần một số quyền đọc trước và chỉ khi đó bạn mới có thể yêu cầu một số quyền khác?

0

Bạn đang làm [[FBSession alloc] initWithPermissions:@[@"publish_actions"]], điều đó có nghĩa là phiên của bạn sẽ chỉ yêu cầu và quyền "có" cho publish_actions, nhưng nhìn vào các mã thông báo từ lỗi của bạn:

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" 
) 

Mã thông báo đã có email quyền quá. Bạn có nghĩ rằng điều này có thể là vấn đề không?

Hãy thử khởi tạo với [[FBSession alloc] initWithPermissions:@[@"publish_actions", @"email"]] và kiểm tra xem bạn vẫn gặp sự cố.

Các vấn đề liên quan