1

我正在使用 Xcode 4.3.1

在我的应用程序中,我尝试使用 Facebook SSO。我的要求是应用程序第一次应该请求授权,然后它应该检查应用程序是否被用户授权并应该移动到下一个流程(即使在任务之后设备被取消了)。我不想一遍又一遍地重复那个授权窗口。

在 Appdelegate 中:

facebook=[[Facebook alloc]initWithAppId:appid andDelegate:first];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSLog(@"%@Defaults:",[defaults objectForKey:@"FBAccessTokenKey"]);
    if ([defaults objectForKey:@"FBAccessTokenKey"] 
        && [defaults objectForKey:@"FBExpirationDateKey"]) 
    {
       facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
        accessToken=facebook.accessToken;
       facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
        date=facebook.expirationDate;
    }
In my view Controller:



    -(IBAction)LoginClick:(id)sender
{
    NSUserDefaults *defaults1 = [NSUserDefaults standardUserDefaults];
    [defaults1 setObject:xapp.facebook.accessToken forKey:@"FBAccessTokenKey"];
    [defaults1 setObject:xapp.facebook.expirationDate forKey:@"FBExpirationDateKey"];
    [defaults1 synchronize];
    if (![xapp.facebook isSessionValid]) 
    {
         permissions = [[NSArray alloc] initWithObjects:@"read_stream",@"publish_stream", nil];
        [xapp.facebook authorize:permissions];
    }
    else if([xapp.facebook isSessionValid])
    { 
        NSLog(@"Hiii");
        permissions=nil;
        [xapp.facebook authorize: nil];
    }
}

应用授权后如何使授权窗口不出现...

4

1 回答 1

1

好的,您每次在 AppDelegate 中运行应用程序时都在请求权限。为防止这种情况,您必须创建一个单独的权限方法,只有在按下登录按钮并检查应用程序是否被允许时才会授予该权限。在你的 AppDelegate 中试试这个:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [self.window makeKeyAndVisible];

    facebook = [[Facebook alloc] initWithAppId:@"YOURAPPID" andDelegate:self];

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    if ([defaults objectForKey:@"FBAccessTokenKey"] && [defaults objectForKey:@"FBExpirationDateKey"]) 
    {
        facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
        facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
    }

    return YES;
}

在 AppDelegate 中的 fbDidLogIn 方法上方添加此方法,您必须将 FBUser 协议添加到 AppDelegate:

-(void)fbLogin:(id<FBUser>)_listener
{
    listener = _listener;
    if(![facebook isSessionValid])
    {
        NSArray* permissions = [[NSArray arrayWithObjects:
                                 @"publish_stream",
                                 @"read_stream",
                                 nil] retain];
        [facebook authorize:permissions];
    }
    else
    {
        [listener facebookDidLogin];
    }
}

并在您的 ViewController 中修改您的登录方法,如下所示:

-(IBAction)LoginClick:(id)sender
{
    YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
    [appDelegate fbLogin:self];
}

FBUser.h 是一个自定义头文件,它定义了协议方法 -(void)fbDidLogIn。这只是为了确保应用程序不会在每次启动时都询问登录权限。

#import <Foundation/Foundation.h>

@protocol FBUser <NSObject>

-(void)facebookDidLogin;

@end

这样,仅当应用程序需要登录 Facebook 并执行某些操作时才会调用 login 方法。希望这对您有所帮助。干杯!

于 2012-07-20T09:39:58.377 回答