6

iOS で Facebook SDK を使用して、ユーザーから投稿権限を取得しようとしています。

ユーザーの 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
         }
     }];

このコードを初めて呼び出すと、ユーザーはアクセス許可ページに移動し、デバイスでサファリに切り替わる前にブロックが呼び出され、このエラー メッセージが返されます。

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,

その後、アプリは、ユーザーが [ok] を選択する safari のアクセス許可ページを表示し続けます。その後、アプリに戻ります。ユーザーにアクセス許可ページが表示されて受け入れられたとしても、この時点ではアクセス許可は設定されていません。

2 回目に投稿しようとすると、ユーザーは safari のアクセス許可ページに移動し、requestNewPublishPermissions メソッドはすぐには失敗しません。ユーザーが [ok] を選択すると、すべてが期待どおりに機能します。

そのため、requestNewPublishPermissions を初めて呼び出したときにのみ、すぐにエラー ErrorReauthorizeFailedReasonUserCancelled が返されて失敗します。

これは、シミュレーターとデバイスで発生します。

何がこれを引き起こしているのでしょうか?

4

2 に答える 2

21

この質問への回答でこの問題の解決策を見つけましたFacebook iOS 3.1 sdk login with publish permission callbacks

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

opensessionforpublishpermissions は、requestNewPublishPermissions メソッドを含むメソッドです。

「その理由は、再認証の呼び出しが、openActiveSession.. が呼び出されるイベント ループの後である必要があるためです。」

これは Facebook SDK のバグだと思います。これが通常の動作であることは意味がありません。また、これが期待される動作であるという Facebook ドキュメントのコメントも見たことがありません。

于 2013-06-07T10:11:06.890 に答える
6

同様の問題があり、Tiddly が提供する答えが役に立ちました。しばらくの間。

後で同じ問題に遭遇しました。理由はわかりませんが、SDK や iOS の更新に関係していたのか、アプリの実行ループがより複雑になったのかもしれません。そこで、FB SDK ソースを調べたところ、次のように read permissions の直後に publish permissions を要求すると、この問題が発生することがわかりました。

// 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)
    {
        // ...
    }];
}];

アプリが Safari または FacebookApp に切り替えて戻ると、 -application: openURL: sourceApplication: annotation: が呼び出されます。+openActiveSessionWithReadPermissions: この直後、 before の CompletionHandler が 呼び出されapplicationDidBecomeActive:ます。そして、再認証を開始する applicationDidBecomeActive:と、最終的に呼び出されます。そのため、FB SDK は、ユーザーが権限を与えずにアプリに戻ったと見なし、その「com.facebook.sdk エラー 2」で再認証に失敗します。エラー。

dispatch_async()うまくいくこともあります。しかし、堅牢な解決策は、アクティブなセッションが App Did Become Active イベントを処理するのを待つことです。次に、追加の発行権限を要求します。これを実現する方法の例を次に示します。

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

    if (self.shouldReauthorise) {
       [self requestPublishPermissions];
       self.shouldReauthorise = NO;
    }
}
于 2014-12-11T16:03:30.873 に答える