更新:我意识到以下问题仅在用户已经授权Facebook访问我的应用程序,然后重新安装我的应用程序时才会发生。当用户第一次在我的应用程序中选择Facebook按钮时,它会转到Facebook应用程序以获取身份验证,但由于身份验证状态仍保存在Facebook应用程序中,因此它会立即返回到我的应用程序,而不向用户说明,并且postToFacebookWall方法失败。
更新2:最终我实现了在此处找到的解决方案:如何通过DIALOG使用NEW Facebook Connect iOS API授权用户?并避免了Facebook应用程序。 Safari更好,因为至少用户会收到一条消息,说明他们将要登录。但是Feed Dialogue仍然会像以前一样在第一次失败。
我有一个帖子到用户墙上的Facebook按钮的应用程序。按下按钮时,应用程序将检查用户是否已经授权应用程序发布到墙上。如果有,视图将弹出,其中包含墙贴信息的Feed对话框。如果没有,Safari将被打开,并允许用户登录。登录后,他们将被带回应用程序,并弹出Feed Dialog视图。
这适用于模拟器和我的设备,如果未安装Facebook应用程序。如果安装了Facebook应用程序,则用户将被带到Facebook应用程序,但随后立即返回到原始应用程序,而不允许用户执行任何操作。 Feed Dialog弹出,但它完全是空白的并自动解除。再次按下Facebook按钮将像用户授权应用程序发布到他们的墙上后一样,带来Feed Dialog视图。
我基本上遵循了此处找到的说明: http://developers.facebook.com/docs/mobile/ios/build/#implementsso 和这里: http://developers.facebook.com/docs/reference/dialogs/feed/ 在AppDelegate中,我有以下代码:
这段代码与示例代码唯一的区别在于我添加了一个NSNotification,该通知由我的视图控制器接收,其中我有以下代码:
更新2:最终我实现了在此处找到的解决方案:如何通过DIALOG使用NEW Facebook Connect iOS API授权用户?并避免了Facebook应用程序。 Safari更好,因为至少用户会收到一条消息,说明他们将要登录。但是Feed Dialogue仍然会像以前一样在第一次失败。
我有一个帖子到用户墙上的Facebook按钮的应用程序。按下按钮时,应用程序将检查用户是否已经授权应用程序发布到墙上。如果有,视图将弹出,其中包含墙贴信息的Feed对话框。如果没有,Safari将被打开,并允许用户登录。登录后,他们将被带回应用程序,并弹出Feed Dialog视图。
这适用于模拟器和我的设备,如果未安装Facebook应用程序。如果安装了Facebook应用程序,则用户将被带到Facebook应用程序,但随后立即返回到原始应用程序,而不允许用户执行任何操作。 Feed Dialog弹出,但它完全是空白的并自动解除。再次按下Facebook按钮将像用户授权应用程序发布到他们的墙上后一样,带来Feed Dialog视图。
我基本上遵循了此处找到的说明: 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)。