Solicite permissões de leitura e publicação simultaneamente usando o suporte do Facebook para iOS

O Facebook diz: ” Você não pode solicitar permissões de leitura e publicação simultaneamente usando o suporte do Facebook do iOS6 e, se você tentar, o SDK levará o usuário por uma troca de aplicativos menos otimizada ou fluxo de autenticação baseado na web.

Se tudo que você precisa é autorizar seu aplicativo iOS e conceder a permissão publish_actions e se você realmente deseja integrar com a conta iOS do Facebook, há um truque que você precisa fazer se não quiser usar a conta do Facebook definida pelo sistema.

O truque é: você PRECISA pedir permissão de leitura antes de pedir permissão de publicação – essa é uma necessidade, não há como contornar. O fluxo de duas etapas é necessário porque você não pode solicitar permissões de publicação pela primeira vez.

Aqui está minha solução:

Em primeiro lugar, você pode encontrar um método auxiliar conveniente para verificar se você concedeu todas as permissões necessárias

+ (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;
}

com esta sequência mágica, o usuário será solicitado (pela primeira vez) para permissão de leitura e permissão de publicação, imediatamente:

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
}
}];
}
}
}];
}

Não sei se esta é a solução ideal, mas isso pode poupar algum tempo cavando o que há de errado com sua integração com o Facebook.