Request read and publish permissions simultaneously using iOS Facebook support
Facebook says: "You cannot request read and publish permissions simultaneously using iOS6's Facebook support, and if you attempt to, the SDK will take the user through a less-optimal app-switching or web-based authentication flow."
If all you need is to authorize you iOS application and grant publish_actions permission and if you really want integrate with iOS Facebook account, there is a trick you need to do if you want't to use system defined Facebook account.
The trick is: you NEED to ask for reading permission before you ask for publishing permission - this is a need, there is no way around. Two-step flow is required because you can't ask for publishing permissions for the first time.
Here is my solution:
First of all, you may find convienient helper method to verify if you granted all required permissions
+ (BOOL) checkFacebookPermissions:(FBSession *)session
{
NSArray *permissions = [session permissions];
NSArray *requiredPermissions = @["publish_actions"];
for (NSString *perm in requiredPermissions) {
if (![permissions containsObject:perm]) {
return NO; // required permission not found
}
}
return YES;
}
with this magic sequence, user will be asked (for the first time) for reading permission and for publishing permission, right away:
if (!FBSession.activeSession.isOpen || ![self checkFacebookPermissions:FBSession.activeSession]) {
// first check if this is first time (no read permissions yet)
[FBSession openActiveSessionWithReadPermissions:@["email"] allowLoginUI:YES completionHandler:^(FBSession *session1, FBSessionState status, NSError *error) {
if (session1.state == FBSessionStateOpen) {
// then ask for publishing permission
if (![self checkFacebookPermissions:FBSession.activeSession]) {
[session1 requestNewPublishPermissions:@["publish_actions"] defaultAudience:FBSessionDefaultAudienceFriends completionHandler:^(FBSession *session2, NSError *error) {
if (session2.state == FBSessionStateOpenTokenExtended) {
// THIS IS IT, THE GLORY FINISH
}
}];
}
}
}];
}
I don't know if this is the most optimal solution, but this may save you some time digging what is wrong with you facebook integration.