无法在iOS上实现“真正的”facebook SSO

时间:2013-03-10 14:01:45

标签: iphone ios facebook

我的目标:

  • 在我的应用中,我希望用户能够在他们的墙上分享内容

由于facebook直接内置于iOS 6,我想利用登录凭据 从iOS上的设置屏幕,以便没有人需要输入他们的用户名/密码 在我的应用程序中。

我希望我的用户直接跳转到facebook上的权限对话框。

有人告诉我利用默认对象来访问这些登录凭据:

thzAppDelegate *delegate = (thzAppDelegate *)[[UIApplication sharedApplication] delegate];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if([defaults objectForKey:@"FBAccessTokenKey"]
       && [defaults objectForKey:@"FBExpirationDateKey"]){
        [delegate facebook].accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
        [delegate facebook].expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
    }

但这不起作用:即使我重置我的模拟器,在iOS上的设置中添加我的用户名传递,我仍然在我的APP中获得一个登录屏幕,但我只期望权限。

我还在delegate.m中添加了推荐的行:

#pragma mark Facebook

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return [self.facebook handleOpenURL:url];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [self.facebook handleOpenURL:url];
}

我不想在登录时打扰我的用户。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

我建议您查看Accounts.frameworkSocial.frameworks - 前者可让您通过ACAccount类访问用户的社交帐户,然后您可以使用该类创建SLRequest }对象来运行你的社交请求。

如果您只是想在墙上分享内容,您可以完全绕过这些步骤并使用SLComposeViewController,它提供了通过Facebook,Twitter或微博分享媒体的模式视图。 Apple提供了所有这些类的文档和示例代码。

答案 1 :(得分:1)

您使用的是facebook sdk代码。你想使用这样的东西,利用iOS 6社交框架。

#import <Accounts/Accounts.h>
#import <Social/Social.h>


ACAccountStore *accountStore = [[[ACAccountStore alloc] init] autorelease];

 ACAccountType * facebookAccountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

    NSArray * permissions = @[@"publish_stream"];

    NSMutableDictionary *dict = [[NSMutableDictionary alloc]initWithObjectsAndKeys:@"whateverYourFacebookKeyIs",ACFacebookAppIdKey,permissions,ACFacebookPermissionsKey,ACFacebookAudienceFriends,ACFacebookAudienceKey, nil];

    [accountStore requestAccessToAccountsWithType:facebookAccountType options:dict completion:^(BOOL granted, NSError *error) {
        if (granted && error == nil) {
            /**
             * Now we can ask for more permissions
             **/
            NSArray *readPermissions = @[@"read_stream"];
            [dict setObject:readPermissions forKey: ACFacebookPermissionsKey];

            [accountStore requestAccessToAccountsWithType:facebookAccountType options:dict completion:^(BOOL granted, NSError *error) {
                if(granted && error == nil) {

                } else {
                    NSLog(@"error is: %@",[error description]);
                    [self performSelectorOnMainThread:@selector(showFacebookAlert) withObject:nil waitUntilDone:NO];
                }
            }];
        } else {
            NSLog(@"error is: %@",[error description]);
            [self performSelectorOnMainThread:@selector(showFacebookAlert) withObject:nil waitUntilDone:NO];
        }
    }];