gpt4 book ai didi

ios - Facebook SDK iOS 登录并安装了 Facebook 应用程序

转载 作者:可可西里 更新时间:2023-11-01 03:56:21 27 4
gpt4 key购买 nike

更新:我意识到只有当用户已经授予 Facebook 对我的应用程序的访问权限,然后重新安装我的应用程序时,才会出现以下问题。用户第一次在我的应用程序中选择 Facebook 按钮时,它会转到 Facebook 应用程序进行身份验证,但由于身份验证状态仍保存在 Facebook 应用程序中,它会立即返回到我的应用程序,而无需向用户解释,并且postToFacebookWall 方法失败。

更新 2:我最终实现了此处找到的解决方案:How to authorize user through a DIALOG with the NEW Facebook Connect iOS API?并避免使用 Facebook 应用程序。 Safari 更好,因为至少用户会收到一条消息,说明他们将登录。但是,提要对话仍然像以前一样在第一次时失败。


我遇到了一个常见问题,但我还没有找到解决方案。请注意,我的应用仅限于 iOS 5 及更高版本。

我有一个带有 Facebook 按钮的应用程序,用于发布到用户墙上。按下按钮时,应用程序将检查用户是否已授予应用程序发布到墙上的权限。如果有,将弹出一个 View ,其中包含带有墙贴信息的提要对话框。如果没有,Safari 将被打开并允许用户登录。登录后,他们将被带回应用程序,并且会弹出 Feed Dialog View 。

如果未安装 Facebook 应用程序,这可以在模拟器和我的设备上运行。如果安装了 Facebook 应用程序,用户将被带到 Facebook 应用程序,但随后会立即返回到原始应用程序,不允许用户执行任何操作。提要对话框弹出,但完全空白并自动消失。再次按下 Facebook 按钮将调出 Feed Dialog View ,一旦用户允许应用程序发布到他们的墙上,它就应该如此。

我几乎按照此处的说明进行操作: 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,该 NSNotification 由我的 View Controller 获取,其中我有以下代码:

    - (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)。

最佳答案

这听起来像是一个异常(exception)情况,因为它是这种“仅当应用程序已安装、授权、然后卸载、然后重新安装时”的情况。

当发生这种特殊情况时,您应该能够回退到“经典 Web View 身份验证”。

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

[facebook authorizeWithFBAppAuth:NO safariAuth:NO];
}

话又说回来,我想你也可以使用 safari auth。

关于ios - Facebook SDK iOS 登录并安装了 Facebook 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9777557/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com