2012-03-19 20 views
6

更新:私は、ユーザーがすでに自分のアプリにFacebookのアクセス権を与えてから、自分のアプリを再インストールした場合にのみ、以下の問題が発生することを認識しました。ユーザーが初めて自分のアプリでFacebookボタンを選択すると、Facebookアプリケーションにアクセスして認証を取得しますが、認証ステータスはまだFacebookアプリに保存されているため、ユーザーに説明なしにすぐにアプリに戻ります。 postToFacebookWallメソッドが失敗します。Facebook SDK Facebook SDKがインストールされたiOSログイン

更新2:ここで見つけた解決策を実装しました:How to authorize user through a DIALOG with the NEW Facebook Connect iOS API?とFacebookアプリを回避しました。少なくともユーザーがログインしているというメッセージが表示されるため、Safariの方が優れていますが、Feed Dialogueは以前と同じように初めて失敗します。


共通の問題である必要がありますが、まだ解決策を見つけることができませんでした。私のアプリはiOS 5以上に制限されています。

ユーザーの壁に投稿するためのFacebookボタン付きのアプリがあります。ボタンが押されると、アプリはユーザーがアプリに壁に投稿する許可をすでに与えているかどうかを確認します。それらがある場合、ウォールポスト情報を持つフィードダイアログがポップアップ表示されます。そうでない場合、Safariが開き、ユーザーはログインできるようになります。ログイン後、それらはアプリに戻され、フィードダイアログビューがポップアップします。

これは、シミュレータと私のデバイスでFacebookアプリケーションがインストールされていない場合に機能します。 Facebookアプリケーションがインストールされている場合、ユーザーはFacebookアプリケーションに移動されますが、ユーザーが何もせずにすぐに元のアプリケーションに戻ります。 [フィード]ダイアログが表示されますが、これは完全に空白で、自動的に終了します。 Facebookボタンをもう一度押すと、ユーザーがアプリに壁に投稿する許可を与えたときに想定されているように、Feed Dialogビューが表示されます。

私はかなりここで見つけるの指示に続く:ここ http://developers.facebook.com/docs/mobile/ios/build/#implementsso

と:AppDelegateで http://developers.facebook.com/docs/reference/dialogs/feed/

をI、次のコードを持っている:

- (void)loginToFacebook 
{ 
    // Set up facebook 
    self.facebook = [[Facebook alloc] initWithAppId:@"YOUR_APP_ID" andDelegate:self]; 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    if ([defaults objectForKey:@"FBAccessTokenKey"] 
     && [defaults objectForKey:@"FBExpirationDateKey"]) { 
     self.facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; 
     self.facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; 
    } 

    if (![self.facebook isSessionValid]) { 
     [self.facebook authorize:nil]; 
    } 
} 

// This is an FBSessionDelegate protocol method 
// that gets called after a successful login 
- (void)fbDidLogin 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[self.facebook accessToken] forKey:@"FBAccessTokenKey"]; 
    [defaults setObject:[self.facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"POST_TO_FACEBOOK_WALL" object:nil]; 
} 

// This is a UIApplicationDelegate protocol method 
// It is called when safari is dismissed 
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    return [self.facebook handleOpenURL:url]; 
} 

この唯一の違いとサンプルコードは、私は次のコードを持って、私のビューコントローラでピックアップされたNSNotificationを追加したことです:

- (void)facebookButtonPressed:(UIControl*)sender 
    { 
     Facebook *facebook = [(AppDelegate*)[[UIApplication sharedApplication] delegate] facebook]; 

     if (![facebook isSessionValid]) 
     { 
      // Login to facebook if not already logged in 
      [(AppDelegate*)[[UIApplication sharedApplication] delegate] loginToFacebook]; 
     } 
     else 
     { 
      [self postToFacebookWall]; 
     } 

    } 

    - (void)postToFacebookWall 
    { 
     Facebook *facebook = [(AppDelegate*)[[UIApplication sharedApplication] delegate] facebook]; 

     /*Facebook Application ID*/ 
     // TODO: Get this either from the AppDelegate facebook property or the info plist 
     NSString *client_id = @"YOUR_APP_ID"; 

     NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
    kAppId, @"app_id", 
    @"http://developers.facebook.com/docs/reference/dialogs/", @"link", 
    @"http://fbrell.com/f8.jpg", @"picture", 
    @"Facebook Dialogs", @"name", 
    @"Reference Documentation", @"caption", 
    @"Using Dialogs to interact with users.", @"description", 
    nil]; 

     [facebook dialog:@"feed" andParams:params andDelegate:self]; 
    } 

問題を解決する方法を知っている人はいますか? (また、明確でない場合は、YOUR_APP_IDが自分のアプリケーションIDに置き換えられます)。

答えて

3

このシナリオは「アプリがインストールされ、承認され、アンインストールされ、再インストールされたときのみ」という点では、このように思えます。

このようなことが発生した場合、「クラシックウェブビュー認証」にフォールバックする必要があります。

if (facebookAppDidNotReturnProperly) { 
    // therefore I must have been re-installed 
    // fallback to UIWebView 

    [facebook authorizeWithFBAppAuth:NO safariAuth:NO]; 
} 

また、サファリ認証を使用することもできます。

+0

聞こえること。私はそれを試してみましょう。 – Darren

関連する問題