Erro ao usar o [FBSession openActiveSessionWithPublishPermissions: ..]
Estou atualizando um aplicativo para usar o SDK mais recente do Facebook para obter acesso ao suporte nativo do iOS6 no Facebook. Atualmente, ele usa uma versão bastante antiga do Facebook SDK.
O aplicativo requer a permissão "publish_actions" do Facebook para a única coisa que faz com o Facebook.
Eu inicialmente pensei que eu poderia usar[FBSession openActiveSessionWithPublishPermissions: ...]
mas isso falha no iOS6 quando o usuário tem o Facebook configurado nas configurações do iOS6. Ele falha por causa desse requisitodos documentos do Facebook:
Observe que, para usar a autenticação nativa do iOS 6, os aplicativos precisam mudar a maneira como solicitam as permissões dos usuários. Os aplicativos precisam separar as solicitações de permissão de leitura e gravação. O SDK do Facebook para iOS oferece suporte a esses recursos e ajuda os desenvolvedores a usá-los para criar aplicativos que funcionem em várias versões do iOS e configurações de dispositivos.
Este é um grande PITA, IMO. Nossa preferência seria solicitar uma permissão ao usuário e acabar com ele, mas o "novo" ideal por Apple / Facebook é solicitar permissões específicas no contexto quando elas forem necessárias, mas ainda não concedidas.
O plano no momento é manter nosso antigo comportamento para usuários do iOS5 e iOS6 que não tenham o Facebook configurado em Configurações. E conforme o novo prompt duplo para usuários do iOS6 que estão usando acesso nativo.
A questão é: qual é a melhor maneira de fazer isso? Como devo saber se o SDK do Facebook selecionará o login nativo do iOS6 versus os mecanismos de fallback? Eu estou negligenciando algo óbvio?
EDITAR:
gerraldWilliam me colocou no caminho certo. Sua solução quase funcionaria, exceto que o ACAccountTypeIdentifierFacebook não está disponível no iOS5. Além disso, se o usuário bloquear o acesso FB em Configurações ao aplicativo, a chamada accountsWithAccountType retornará uma matriz vazia.
É possível contornar o primeiro problema pedindo o identificador de correspondência do tipo de conta "com.apple.facebook" - isso retornará nil no iOS5 e um objeto de tipo de conta real no iOS6.
Mas o segundo problema é insolúvel. Meu novo plano é sempre abrir a sessão inicial no iOS6 com permissões somente leitura e solicitar mais tarde, no contexto, a permissão de publicação, se necessário. No iOS5, ainda abro a sessão inicial, especificando a permissão publish_actions desejada. Aqui está o código:
ACAccountStore* as = [[ACAccountStore new] autorelease];
ACAccountType* at = [as accountTypeWithAccountTypeIdentifier: @"com.apple.facebook"];
if ( at != nil ) {
// iOS6+, call [FBSession openActiveSessionWithReadPermissions: ...]
} else {
// iOS5, call [FBSession openActiveSessionWithPublishPermissions: ...]
}