Как войти в систему и запросить расширенное разрешение за один звонок? - PullRequest
0 голосов
/ 13 июля 2010

ОК, поэтому мне нужно, чтобы мое приложение могло что-то публиковать на стене пользователя, но я не очень доволен решением показать всплывающее окно входа в систему, а затем всплывающее окно с запросом расширенного разрешения.

Можно ли это сделать только с одним всплывающим окном? Или даже с двумя всплывающими окнами, но вызванными одним вызовом API?

Ответы [ 2 ]

0 голосов
/ 24 июля 2010

, пока пользователь вошел в систему и предоставил разрешения один раз, ему не нужно делать это снова.Вот код, который я использую:

//these to need to be declared in .h
NSString * currentRequest;
BOOl hasAskedForPermissions;
FBSession * mySession


//then in .m
@synthesize currentRequest
@synthesize hasAskedForPermissions

-(void)viewDidLoad {
static NSString* kApiKey = @"XXXXXXXXXXXXXXXXXXXXXXX";
static NSString* kApiSecret = @"XXXXXXXXXXXXXXXXXXXXXXXXXX";

mySession = [[FBSession alloc] initWithKey:kApiKey secret:kApiSecret getSessionProxy:nil];


}

-(void)resumeConnection {
    NSLog(@"resuming connection");
    static NSString* kApiKey = @"XXXXXXXXXXXXXXXXXXXXXXX";
    static NSString* kApiSecret = @"XXXXXXXXXXXXXXXXXXXXXXXXXX";

    if ([mySession resume]) {

    }
    else {
        NSLog(@"session did not resume successfully");
        mySession = [[FBSession sessionForApplication:kApiKey 
                                              secret:kApiSecret delegate:self] retain];
        _loginDialog = [[FBLoginDialog alloc] init];    
        [_loginDialog show];
    }
}

-(void)postStatus {
    currentRequest = @"post status";
    //NSLog(@"current request: %@", currentRequest);
    if (!(mySession.isConnected)) {

        [self resumeConnection];


    }
    else if (mySession.isConnected) {
        NSLog(@"session is connected");
                //Add your posting code here.

    } else {
        NSLog(@"session is not connected, did not connect");


    }

}

-(void)loadPermissionDialog {
    FBPermissionDialog* dialog = [[FBPermissionDialog alloc] initWithSession:_session];
    dialog.delegate = self;
    dialog.permission = @"read_stream, publish_stream, read_friendlists";
    [dialog show];

}

- (void)session:(FBSession *)session didLogin:(FBUID)uid {
    NSLog(@"Session Logged in sucessfully");
    //NSLog(@"current request: %@", currentRequest);
    mySession = session;
    if (hasAskedForPermissions) {
        if ([currentRequest isEqualToString:@"post status"]) {
            [self postStatus];
        }
    }   
    else {
        NSLog(@"asking for permissions");
        hasAskedForPermissions = YES; 
      //you should save this in UserDefaults and recall it in viewDidLoad

        [self loadPermissionDialog];
        }

}

Я не знаю, как на самом деле сделать запрос после публикации, но если вы запустите этот код, пользователь должен будет только войти в систему и назначить разрешения один раз.

0 голосов
/ 13 июля 2010

Это может помочь -

- (void)viewDidLoad {
    FacebookAPIAppDelegate *appDelegate =(FacebookAPIAppDelegate *)[[UIApplication sharedApplication]delegate];

    if (appDelegate._session == nil){
        appDelegate._session = [FBSession sessionForApplication:_APP_KEY 
                                                         secret:_SECRET_KEY delegate:self];
    }
    if(self.loginButton == NULL)
        self.loginButton = [[[FBLoginButton alloc] init] autorelease];
    loginButton.frame = CGRectMake(0, 0, 200, 50);

    [self.view addSubview:loginButton];

    [super viewDidLoad];
}



- (void)session:(FBSession*)session didLogin:(FBUID)uid {
    self.usersession =session;
    NSLog(@"User with id %lld logged in.", uid);
    [self getFacebookName];
}

- (void)getFacebookName {
    NSString* fql = [NSString stringWithFormat:
                     @"select uid,name from user where uid == %lld", self.usersession.uid];
    NSDictionary* params = [NSDictionary dictionaryWithObject:fql forKey:@"query"];
    [[FBRequest requestWithDelegate:self] call:@"facebook.fql.query" params:params];
    self.post=YES;
}

- (void)request:(FBRequest*)request didLoad:(id)result {
    if ([request.method isEqualToString:@"facebook.fql.query"]) {
        NSArray* users = result;
        NSDictionary* user = [users objectAtIndex:0];
        NSString* name = [user objectForKey:@"name"];
        self.username = name;       

        if (self.post) {
            [self postToWall];
            self.post = NO;
        }
    }
}

- (void)postToWall {

    FBStreamDialog *dialog = [[[FBStreamDialog alloc] init] autorelease];
    dialog.userMessagePrompt = @"Enter your message:";
    //dialog.attachment = [NSString stringWithFormat:@"{\"name\":\"Check this Mix\",\"href\":\"http://developers.facebook.com/connect.php?tab=iphone\",\"caption\":\"Caption\",\"description\":\"Description\",\"media\":[{\"type\":\"image\",\"src\":\"http://img40.yfrog.com/img40/5914/iphoneconnectbtn.jpg\",\"href\":\"http://developers.facebook.com/connect.php?tab=iphone/\"}],\"properties\":{\"another link\":{\"text\":\"Facebook home page\",\"href\":\"http://www.facebook.com\"}}}"];

    dialog.attachment = [NSString stringWithFormat:@"{\"name\":\"Check this Mix\",\"href\":\"http://developers.facebook.com/connect.php?tab=iphone\",\"caption\":\"Caption\",\"media\":[{\"type\":\"image\",\"src\":\"http://img40.yfrog.com/img40/5914/iphoneconnectbtn.jpg\",\"href\":\"http://developers.facebook.com/connect.php?tab=iphone/\"}],\"properties\":{\"another link\":{\"text\":\"Facebook home page\",\"href\":\"http://www.facebook.com\"}}}"];   

    [dialog show];

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...