2012-10-10 1 views
6

最新のFacebook SDKを使用するようにアプリをアップデートしていて、iOS6ネイティブFacebookのサポートにアクセスできます。現在、かなり古いバージョンのFacebook SDKを使用しています。[FBSession openActiveSessionWithPublishPermissions:..]を使用するとエラーが発生する

Facebookの唯一の機能として、Facebookの「publish_actions」権限が必要です。

私は当初[FBSession openActiveSessionWithPublishPermissions: ...]を使用できると思っていましたが、iOS6の設定でFacebookが設定されている場合、iOS6ではこれが失敗します。それはfrom the Facebook docs、この要件のため失敗します。

注意、アプリは、彼らがユーザーから 権限を要求する方法を変更する必要が、iOSの6ネイティブ認証を使用するように - と書き込み権限を読むためのアプリが彼らの要求を分離しなければなりません。 iOS向けFacebook SDKは、これらの機能をサポートしており、開発者が 複数のiOSバージョンとデバイス設定で動作するアプリを開発するのに役立ちます。

これは大きなPITA、IMOです。私たちの好みは、一度ユーザーに許可を求めてやりなおすことですが、Apple/Facebookごとの「新しい」理想は、必要なときに特定のアクセス許可がコンテキストにあることを確認することです。

現時点では、iOS5ユーザーと設定でFacebookが設定されていないiOS6ユーザーの以前の動作を維持する予定です。また、ネイティブアクセスを使用しているiOS6ユーザーのための新しいダブルプロンプトに準拠しています。

これを行うにはどうすればよいですか? Facebook SDKがiOS6ネイティブログインと代替メカ​​ニズムを選択するかどうかを検出するにはどうすればよいですか?私は明白な何かを見落としていますか?

EDIT:

gerraldWilliam右のトラックに私を置きます。彼の解決策は、ACAccountTypeIdentifierFacebookがiOS5では利用できないことを除いてほとんど機能します。また、ユーザーがAppへの設定でFBアクセスをブロックした場合、accountsWithAccountType呼び出しは空の配列を返します。

"com.apple.facebook"という一致するアカウントタイプを尋ねると、最初の問題を回避できます。これは、iOS5ではnil、iOS6では実際のアカウントタイプオブジェクトを返します。

しかし、2番目の問題は解決できません。私の新しい計画は、iOS6の初期セッションを常に読み取り専用の権限で開き、後で必要に応じて公開権限を得るためのコンテキストでプロンプトすることです。 iOS5では、依然として必要なpublish_actions権限を指定して初期セッションを開きます。ここでは、コードがあります:

ACAccountStore* as = [[ACAccountStore new] autorelease]; 
ACAccountType* at = [as accountTypeWithAccountTypeIdentifier: @"com.apple.facebook"]; 
if (at != nil) { 
    // iOS6+, call [FBSession openActiveSessionWithReadPermissions: ...] 

} else { 
    // iOS5, call [FBSession openActiveSessionWithPublishPermissions: ...] 
} 

答えて

5
ACAccountStore *store = [[ACAccountStore alloc] init]; 

ACAccountType *accountType = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; 
NSArray *accounts = [store accountsWithAccountType:accountType]; 
NSLog(@"accounts:%@", accounts); 

アカウントがnilである(または多分それは空の配列を返し、私はよく分からない)場合、ユーザはiOS6でFacebookを利用して設定していません。あなたはそれをテストすることができ、値がFacebookがiOS6用に設定されていないことを示す場合は、代替メカニズムを呼び出すことができます。

+0

は、このほとんど動作します。 1)ACAccountTypeIdentifierFacebookはiOS5と2では利用できません。ユーザーが設定でFBを設定しているが呼び出し元のアプリケーションへのアクセスをブロックしている場合、accountsWithAccountTypeは空の配列を返します。正しい答えとして私の究極の解決への道を私を置くようにマーキングしてください。それは私が質問に入れます。 – TomSwift

+0

'accountsWithAccountType'は私のために空の配列を返します。私がiOS 6にいてもFacebookの統合が設定されていて、投稿することは可能です。 – jowie

+0

また私のために空であり、この迷惑なエラーを取得com.facebook.sdkエラー2 ...アドバイス? – D33pN16h7

0

申し訳ありませんが、私のためios6 ラインに

ACAccountType* at = [as accountTypeWithAccountTypeIdentifier: @"com.apple.facebook"]; 

が、ユーザが設定したアカウントを持っていない場合でも、nilを返しません...あなただけのユーザーのIOSバージョンが何であるかを確認することができることを意味し(5または6)

NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; 

This link参考にすることができ

6

私はFacebookのデベロッパーサイトで読んだことはあるが(これはやや矛盾している)、「公開のみ」アプリのワークフローはあまり考えなかったし、Apple/iOSは無視したようだ全部。

ヒント5:

Facebookはdocs you referencedでいくつかのガイダンスを提供いくつかのケースでは、ネイティブのログインダイアログ

を無効にし、アプリケーションはFacebookの新しいバージョンを使用するネイティブのログインダイアログを無効にすることもできますSDKが、ユーザーからのアクセス許可を要求する方法の書き換えを避けるためです。 fast-app-switchの以前の動作をログインに使用するには、廃止予定のFBSessionメソッドのopenActiveSessionWithPermissionsを使用して、PermissionWithPermissionsを再認証します。

これは現在私が従っているルートです。やや異なるが、同じ一般的な効果。

if (FBSession.activeSession.isOpen == NO) { 
    // This will bypass the ios6 integration since it does not allow for a session to be opened 
    // with publish only permissions! 
    FBSession* sess = [[FBSession alloc] initWithPermissions:[NSArray arrayWithObject:@"publish_actions"]]; 
    [FBSession setActiveSession:sess]; 
    [sess openWithBehavior:(FBSessionLoginBehaviorWithFallbackToWebView) completionHandler:^(FBSession *session, FBSessionState status, NSError *error) { 
     [self onSessionStateChange:session 
          andState:status 
          andError:error]; 
    }]; 

結末がある(ユーザーは通常、すでにFacebookが携帯電話にインストールされていますので)、アプリは単一のためのFacebookアプリへの切り替えを常に公開するために署名するためIOS6統合をバイパスし、ほとんどの場合になります承認承認。

ユーザーが自分のFacebookアカウントを使用してアプリケーションにサインオンすることを選択した場合は、openActiveSessionWithReadPermissionsに電話します(存在する場合はIOS6 Facebook統合を使用します)。彼らはその後、共有することを決定した場合、私はreauthorizeWithPublishPermissionsを呼び出し、利用可能な場合はIOS6の統合も使用します。

利用可能な最小限の混乱したドキュメントがあれば、これが「正しい」方法であるかどうかはわかりませんが、これはうまくいくようです。 IOS5またはIOS6アプリケーションでは、Facebook SDKを介してのみ呼び出しを行うため、同じコードを使用できます。また、Facebookが現在宣伝しているのと同じ要望で、読み込み/公開の許可を混合しないことを賞賛します。代わりに使用して、次の

+0

これも私がやっていることです。私はそれが最初に読み取り権限を要求し、その後に公開するのは貧弱な設計だと思う。ユーザーが自分のアプリでFacebookに写真を共有したいのであれば、Facebookを使って自分のアプリにログインし、写真を共有したいときに再び共有を許可するよう依頼するのではなく、一気にすべてを許可する。 – jjxtra

+0

ハワード、私の一日を保存してくれてありがとう – John

2

NSArray *readPermissions = [[NSArray alloc]   initWithObjects:@"email",@"friends_location",@"status_update",@"publish_actions",nil]; 
[FBSession openActiveSessionWithPublishPermissions:readPermissions defaultAudience:FBSessionDefaultAudienceEveryone allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { 
//Your code here for handling forward things; 
} 

使用このコード:

NSArray *readPermissions = [[NSArray alloc] initWithObjects:@"email",@"friends_location",@"status_update",@"publish_actions",nil]; 
FBSession* sess = [[FBSession alloc] initWithPermissions:[NSArray arrayWithObject:readPermissions]]; 
[FBSession setActiveSession:sess]; 
[sess openWithBehavior:(FBSessionLoginBehaviorWithFallbackToWebView) completionHandler:^(FBSession *session, FBSessionState status, NSError *error) { 
    [self onSessionStateChange:session 
         andState:status 
         andError:error]; 

//Your code here for handling forward things; 

}]; 
関連する問題