一般的な SDK のポリシーでは、何らかの操作が失敗している場合、OS からの基になるエラー情報がアプリに通知されます。(もちろん、すべての失敗ケースが OS API の失敗から始まるわけではありません。) このポリシーの理由は、説明したようなより正確なエラー処理とログ記録のシナリオをサポートすることです。余談ですが、SDK 内でこのパターンに従わない場所を見つけた場合は、バグですので報告してください。
この場合、FBSession は NSError オブジェクトをハンドラーに渡し、userInfo の FBErrorInnerErrorKey 値を OS から返されたエラー オブジェクトに設定します。ユーザーに正確なエラー メッセージを提供するために、FBSessionStateClosedLoginFailed ケースで次のようなコードのスニペットを使用できます。
if (error) {
NSError *innerError = error.userInfo[FBErrorInnerErrorKey];
if ([innerError.domain isEqualToString:ACErrorDomain] &&
innerError.code == ACErrorPermissionDenied) {
NSLog(@"User dissallowed permissions via iOS 6.0 integration");
}
}
お役に立てれば!
* 更新 *
デバイスでこれを試したところ、2 つのバグが見つかりました。1 つは iOS 6.0 にあり、もう 1 つは SDK にあります。iOS 6.0 のバグは、スイッチがオフの場合、OS から NSError オブジェクトが渡されないため、内部エラーが発生しないことです。したがって、上記の一般的な解決策は、問題の特定のケースでは機能しません。2 番目のバグでは、SDK 3.1.1 を使用してこの問題を一時的に解決できます。
SDK 3.1.1 のバグは、error.userInfo[FBErrorLoginFailedReason] を FBErrorLoginFailedReason の値に設定することです。内部エラーが NIL の場合、この理由の値を確認して、アプリのスライダーがオフに設定されていることを確認できます。このバグが SDK で修正されると、コードのテストが中断されます。ただし、理由を iOS 6 に関連するより論理的な理由に設定する予定です。この値に依存することにした場合は、アプリケーション。