2013-06-06 44 views
6

Tôi đang cố gắng nhận quyền đăng bài từ người dùng bằng SDK Facebook trên iOS.Yêu cầu FBSessionNewPublishPermissions không thành công trước khi phản hồi

Tôi đang gọi mã bên dưới trong phương thức được gọi nếu ứng dụng không có quyền xuất bản bắt buộc để đăng lên tường người dùng facebook.

// No permissions found in session, ask for it 
    [FBSession.activeSession requestNewPublishPermissions: [NSArray arrayWithObject:@"publish_actions"] 
              defaultAudience: FBSessionDefaultAudienceEveryone 
             completionHandler: ^(FBSession *session, NSError *error) 
    { 
     if(!error) 
     { 
      // Do something 
     } 
    }]; 

Lần đầu tiên tôi gọi mã này nó đưa người dùng đến các trang cho phép, và trước khi nó thậm chí chuyển sang Safari trên thiết bị khối được gọi và thông báo lỗi này sẽ được trả về

Error Domain=com.facebook.sdk Code=2 "The operation couldn’t be completed. (com.facebook.sdk error 2.)" UserInfo=0xc426410 {com.facebook.sdk:ErrorLoginFailedReason=com.facebook.sdk:ErrorReauthorizeFailedReasonUserCancelled, 

Sau đó, ứng dụng sẽ tiếp tục hiển thị trang quyền trong safari nơi người dùng chọn ok. Sau đó, nó quay trở lại ứng dụng. Quyền đã không được thiết lập tại thời điểm này ngay cả tho người dùng đã được trình bày với các trang quyền và được chấp nhận.

Khi cố gắng đăng lần thứ hai, người dùng sẽ chuyển đến trang quyền trong safari và phương thức requestNewPublishPermissions không thành công ngay lập tức. Người dùng chọn ok và sau đó mọi thứ hoạt động như mong đợi.

Vì vậy, nó chỉ là lần đầu tiên gọi yêu cầuNewPublishPermissions rằng nó không ngay lập tức trả lại lỗi ErrorReauthorizeFailedReasonUserCancelled.

Điều này xảy ra trong trình mô phỏng và trên thiết bị.

Bất kỳ ý tưởng nào có thể gây ra điều này?

Trả lời

21

tôi tìm thấy giải pháp cho vấn đề này trên các câu trả lời cho câu hỏi này Facebook iOS 3.1 sdk login with publish permission callbacks

dispatch_async(dispatch_get_current_queue(), ^{ 
    [self openSessionForPublishPermissions]; 
}); 

đâu opensessionforpublishpermissions là phương pháp có chứa các phương pháp requestNewPublishPermissions.

"Lý do là cuộc gọi để ủy quyền lại .. cần phải sau vòng lặp sự kiện trong đó openActiveSession .. được gọi."

Tôi cho rằng đây là lỗi trong SDK Facebook, điều này không có ý nghĩa đối với hành vi bình thường và tôi chưa thấy bất kỳ tài liệu nào trên Facebook nhận xét về hành vi mong đợi này.

+0

Ước gì tôi có thể thêm nhiều hơn một lần nâng cấp. Cảm ơn rất nhiều! – kpower

+0

@Tiddly u đã cứu ngày của tôi. – Nick

+0

Rất tiếc, cảm ơn bạn rất nhiều nhưng 'dispatch_get_current_queue' hiện không còn được dùng nữa. Tôi nghĩ bạn nên cập nhật câu trả lời của bạn. – Hemang

6

Tôi gặp vấn đề tương tự và câu trả lời, do Tiddly cung cấp cho tôi. Trong một thời gian.

Sau đó, tôi đã gặp phải vấn đề tương tự. Tôi không biết tại sao, có thể nó đã được quan tâm với bản cập nhật SDK hoặc iOS, có thể chạy vòng lặp của ứng dụng trở nên phức tạp hơn. Vì vậy, tôi kiểm tra nguồn FB SDK và tìm ra rằng vấn đề này xảy ra khi bạn hỏi quyền xuất bản ngay sau khi cho phép đọc, như thế này:

// Open with read permissions 
[FBSession openActiveSessionWithReadPermissions: readPermissions 
            allowLoginUI: YES 
           completionHandler: ^
(FBSession *session, FBSessionState status, NSError *error) 
{ 
    // Ask for publish permissions (This is incorrect!) 
    [FBSession.activeSession requestNewPublishPermissions:publishPermissions 
              defaultAudience:FBSessionDefaultAudienceFriends 
             completionHandler: 
    ^(FBSession *session, NSError *error) 
    { 
     // ... 
    }]; 
}]; 

Khi công tắc ứng dụng của bạn để Safari hoặc FacebookApp và lưng, -application: openURL: sourceApplication: annotation: là gọi là. CompletionHandler của +openActiveSessionWithReadPermissions: được gọi ngay sau đó, trước applicationDidBecomeActive:. Và sau khi bạn bắt đầu, hãy ủy quyền lại applicationDidBecomeActive: cuối cùng. Vì vậy, FB SDK cho rằng người dùng đã quay trở lại ứng dụng mà không cần cấp quyền và ủy quyền lại không thành công với "lỗi com.facebook.sdk 2." đó lỗi.

Đôi khi dispatch_async() hoạt động tốt. Nhưng giải pháp mạnh mẽ của là chờ phiên hoạt động để xử lý Ứng dụng đã trở thành sự kiện đang hoạt động. Và sau đó yêu cầu quyền xuất bản bổ sung. Dưới đây là ví dụ về cách đạt được điều này:

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    [FBAppCall handleDidBecomeActive]; 

    if (self.shouldReauthorise) { 
     [self requestPublishPermissions]; 
     self.shouldReauthorise = NO; 
    } 
} 
Các vấn đề liên quan