estoy actualizando una aplicación para utilizar la última Facebook SDK con el fin de obtener acceso al soporte nativo de Facebook iOS6. Actualmente usa una versión bastante antigua del SDK de Facebook.de error cuando se utiliza [openActiveSessionWithPublishPermissions FBSession: ..]
La aplicación requiere el permiso "publish_actions" de Facebook como la única cosa que hace con Facebook.
Al principio pensé que podría utilizar [FBSession openActiveSessionWithPublishPermissions: ...]
pero esto no funciona en iOS 6, cuando el usuario ha configurado en la configuración de Facebook iOS6. Se produce un error debido a este requisito, from the Facebook docs:
Nota, para usar iOS 6 de autenticación nativa, aplicaciones necesitan cambiar la forma en que solicitan permisos de los usuarios - las aplicaciones deben separar sus solicitudes de lectura y escritura permisos . El SDK de Facebook para iOS admite estas características y ayuda a los desarrolladores a usarlas para crear aplicaciones que funcionen en múltiples versiones de iOS y configuraciones de dispositivos.
Este es un gran PITA, IMO. Nuestra preferencia sería solicitar una vez permiso al usuario y terminar con él, pero el "nuevo" ideal por Apple/Facebook es solicitar permisos específicos en contexto cuando se necesiten pero aún no se hayan otorgado.
El plan en este momento es mantener nuestro comportamiento de edad para los usuarios y usuarios iOS5 iOS6 que no tienen Facebook configurados en Configuración. Y cumpla con el nuevo doble aviso para usuarios de iOS6 que utilizan el acceso nativo.
La pregunta es, ¿cuál es la mejor manera de hacer esto? ¿Cómo debo proceder para detectar si el Facebook SDK seleccionará el inicio de sesión nativo iOS6 frente a los mecanismos de respaldo? ¿Estoy pasando por alto algo obvio?
EDIT:
gerraldWilliam me puso en el camino correcto. Su solución casi funcionaría, excepto que ACAccountTypeIdentifierFacebook no está disponible en iOS5. Además, si el usuario bloquea el acceso FB en Configuración a la aplicación, la llamada accountsWithAccountType devolverá una matriz vacía.
Es posible evitar el primer problema pidiendo el identificador de coincidencia de tipo de cuenta "com.apple.facebook" - esto devolverá nil en iOS5, y un objeto de tipo de cuenta real en iOS6.
Pero el segundo problema es irresoluble. Mi nuevo plan es abrir siempre la sesión inicial en iOS6 con permisos de solo lectura e indicar luego, en contexto, el permiso de publicación si es necesario. En iOS5, aún abriré la sesión inicial especificando el permiso publish_actions deseado. Aquí está el 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: ...]
}
Esto casi funciona. Dos problemas son 1) ACAccountTypeIdentifierFacebook no está disponible en iOS5 y 2) accountsWithAccountType devolverá una matriz vacía si el usuario ha configurado FB en Configuración pero ha bloqueado el acceso a la aplicación de llamada. Marcar como la respuesta correcta ya que me puso en el camino hacia mi solución definitiva, que colocaré en la pregunta. – TomSwift
'accountsWithAccountType' devuelve una matriz vacía para mí, incluso si estoy en iOS 6, la integración de Facebook se ha configurado y es posible publicar. – jowie
También está vacío para mí, y obtiene este molesto error com.facebook.sdk error 2 ... ¿Algún consejo? – D33pN16h7