2012-03-19 105 views
6

更新:我已經意識到,如果用戶已將Facebook訪問權限授予我的應用程序,然後重新安裝我的應用程序,則只會發生以下問題。用戶第一次在我的應用程序中選擇Facebook按鈕時,它會轉到Facebook應用程序以獲取身份驗證,但由於身份驗證狀態仍保存在Facebook應用程序中,它會立即返回到我的應用程序,而不會向用戶解釋, postToFacebookWall方法失敗。已安裝Facebook應用程序的Facebook SDK iOS登錄

更新2:我最終實現了這裏找到的解決方案:How to authorize user through a DIALOG with the NEW Facebook Connect iOS API?並避免了Facebook應用。 Safari更好,因爲至少用戶會收到一條消息,表示他們將登錄。但是,Feed對話仍然像以前一樣第一次失敗。


我有什麼必須是常見問題,但我還沒有找到解決方案呢。請注意,我的應用僅限於iOS 5及以上版本。

我有一個Facebook按鈕的應用程序張貼到用戶牆上。當按鈕被按下時,應用程序將檢查用戶是否已經允許應用程序張貼到牆上。如果他們有,一個視圖會彈出一個包含牆貼信息的Feed對話框。如果他們沒有,Safari將被打開,用戶將被允許登錄。登錄後,他們將被帶回應用程序,並會彈出Feed對話框視圖。

這適用於模擬器和我的設備上,如果未安裝Facebook應用程序。如果Facebook應用程序已安裝,用戶將被帶到Facebook應用程序,但隨後會立即返回到原始應用程序,而不允許用戶執行任何操作。 Feed對話框彈出,但它是完全空白的並自動關閉。再次按下Facebook按鈕將彈出Feed對話框視圖,因爲一旦用戶允許應用程序發佈到牆上時,它應該是這樣。

我幾乎跟着這個網址的指示: http://developers.facebook.com/docs/mobile/ios/build/#implementsso

這裏: http://developers.facebook.com/docs/reference/dialogs/feed/

在AppDelegate中,我有以下代碼:

- (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]; 
} 

然後,你也可以使用safari auth我也想。

+0

這聽起來像它可能是可行的。我會試一試。 – Darren 2012-03-23 10:49:17

相關問題