Iphone 重复授权窗口

Iphone 重复授权窗口,iphone,facebook,authorization,Iphone,Facebook,Authorization,我使用的是Xcode 4.3.1 在我的应用程序中,我尝试使用Facebook SSO。我的要求是,应用程序在第一次请求授权后,应检查应用程序是否由用户授权,并应移动到下一个进程(即使在设备中的任务取消后)。我不希望授权窗口重复一次又一次 在Appdelegate中: facebook=[[Facebook alloc]initWithAppId:appid andDelegate:first]; NSUserDefaults *defaults = [NSUserDefaults st

我使用的是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];
    }
}

如何使授权窗口在应用程序被授权后不出现…

好的,每次在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;
}
-(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];
    }
}
在AppDelegate中的fbDidLogIn方法上方添加此方法时,必须将FBUser协议添加到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;
}
-(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];
    }
}
FBUser.h是一个自定义头文件,定义协议方法-(void)fbdilogin。这只是为了确保应用程序不会在每次启动时请求登录权限

#import <Foundation/Foundation.h>

@protocol FBUser <NSObject>

-(void)facebookDidLogin;

@end
#导入
@协议用户
-(作废)facebookDidLogin;
@结束
这样,只有当应用程序需要登录到Facebook并执行某些操作时,才会调用login方法。
希望这对你有帮助。干杯

好的,每次在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;
}
-(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];
    }
}
在AppDelegate中的fbDidLogIn方法上方添加此方法时,必须将FBUser协议添加到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;
}
-(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];
    }
}
FBUser.h是一个自定义头文件,定义协议方法-(void)fbdilogin。这只是为了确保应用程序不会在每次启动时请求登录权限

#import <Foundation/Foundation.h>

@protocol FBUser <NSObject>

-(void)facebookDidLogin;

@end
#导入
@协议用户
-(作废)facebookDidLogin;
@结束
这样,只有当应用程序需要登录到Facebook并执行某些操作时,才会调用login方法。
希望这对你有帮助。干杯

谢谢你的代码…但是我在[listener facebookDidLogin]上遇到了一个错误;“选择器'fbdilogin'没有已知的实例方法”这是为了防止每次登录时询问权限。检查更新的答案。根据我更新的答案创建一个名为FBUser.h的自定义头文件。感谢您的代码…但我在[listener facebookDidLogin]处收到一个错误;“选择器'fbdilogin'没有已知的实例方法”这是为了防止每次登录时询问权限。检查更新的答案。根据更新的答案创建名为FBUser.h的自定义头文件。