重复授权窗口

时间:2012-07-20 08:53:09

标签: iphone facebook authorization

我正在使用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];
    }
}

如何在授权应用程序后使授权窗口不显示...

1 个答案:

答案 0 :(得分: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方法。 希望这对你有所帮助。干杯!