2012-07-20 54 views
1

我使用的Xcode 4.3.1重复授权窗口

在我的应用我尝试使用Facebook SSO.My要求是在第一时间应用程序应该要求的授权后,它应该检查是否应用是由用户授权的,并且应该移动到下一个进程(即使在设备中的任务被取消之后)。我不需要那个授权窗口一次又一次地重复。

中的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

好吧,你每次都询问您的权限运行在您的应用程序你的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并执行某些操作时才会调用登录方法。 希望这可以帮助你。干杯!

+0

感谢您的代码...但我在[侦听器facebookDidLogin]; “没有已知的选择器实例方法'fbDidLogin'” – Icoder 2012-07-20 10:08:12

+1

这是为了防止您在每次登录时询问权限。检查更新的答案。 – Shabib 2012-07-20 10:12:33

+0

根据我更新的答案创建一个名为FBUser.h的自定义头文件。 – Shabib 2012-07-20 10:18:45