2012-07-20 53 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