Erreur lors de l'utilisation de [FBSession openActiveSessionWithPublishPermissions: ..]
Je suis à jour une application pour utiliser les dernières Facebook SDK afin d'accéder à l'iOS6 native Facebook de soutien. Il utilise actuellement une très ancienne version de Facebook SDK.
L'application nécessite le "publish_actions" la permission de Facebook pour la seule chose qu'il fait avec Facebook.
J'ai d'abord pensé que je pourrais utiliser [FBSession openActiveSessionWithPublishPermissions: ...]
mais cela échoue sur iOS6 lorsque l'utilisateur a Facebook configuré dans iOS6 paramètres. Il échoue en raison de cette exigence, de la Facebook docs:
Note, utiliser iOS 6 native auth, des applications ont besoin de changer leur façon de demande
les autorisations des utilisateurs - les applications doivent séparer leurs demandes de lecture
et des autorisations d'écriture. Le Facebook SDK pour iOS prend en charge ces
caractéristiques et permet aux développeurs de les utiliser pour créer des applications qui fonctionnent sur
plusieurs versions iOS et configuration de l'appareil.
C'est un gros pain PITA, de l'OMI. Notre préférence serait de demander à l'utilisateur une fois l'autorisation et être fait avec elle, mais la "nouvelle" idéal par Apple/Facebook est à demander des autorisations spécifiques en contexte quand ils sont nécessaires, mais ne bénéficient pas encore de.
Le plan du moment, c'est de conserver notre ancien comportement pour iOS5 utilisateurs et iOS6 les utilisateurs qui n'ont pas Facebook configuré dans les Paramètres. Et de se conformer à la nouvelle double-invite pour iOS6, les utilisateurs qui sont à l'aide de code d'accès.
La question est de savoir quelle est la meilleure façon de le faire? Comment puis-je détecter si le Facebook SDK sélectionnez l'iOS6 natif de connexion vs les mécanismes de secours? Suis-je surplombant quelque chose d'évident?
EDIT:
gerraldWilliam me mettre sur la bonne voie. Sa solution serait presque, sauf que ACAccountTypeIdentifierFacebook n'est pas disponible dans iOS5. Aussi que si l'utilisateur blocs FB accès dans les Paramètres de l'application puis la accountsWithAccountType appel renvoie un tableau vide.
Il est possible de contourner le problème en demandant le type de compte de contrepartie de l'identificateur de "com.apple.facebook" - ce sera le retour de néant sur iOS5, et un compte réel type d'objet sur iOS6.
Mais le deuxième problème est insoluble. Mon nouveau plan est de toujours ouvrir la session initiale sur iOS6 avec des autorisations en lecture seule et invite plus tard, dans le contexte, pour publier la permission si nécessaire. Sur iOS5, je vais encore ouvert la session initiale spécifier l'publish_actions autorisation. Voici le code:
ACAccountStore* as = [[ACAccountStore new] autorelease];
ACAccountType* at = [as accountTypeWithAccountTypeIdentifier: @"com.apple.facebook"];
if ( at != nil ) {
//iOS6+, call [FBSession openActiveSessionWithReadPermissions: ...]
} else {
//iOS5, call [FBSession openActiveSessionWithPublishPermissions: ...]
}
Vous devez vous connecter pour publier un commentaire.
si les comptes est nulle (ou peut-être qu'il renvoie un tableau vide, je ne suis pas sûr), alors l'utilisateur n'a pas configuré de Facebook dans iOS6. Vous pouvez tester cela, et si la valeur indique que Facebook n'a pas été configuré pour iOS6, vous pouvez appeler votre mécanisme de secours.
accountsWithAccountType
renvoie un tableau vide pour moi, même si je suis en iOS 6, Facebook de l'intégration a été configuré et il est possible de poster.Basé sur tout ce que j'ai lu sur Facebook Développeur de sites (ce qui est un peu contradictoire) le flux de travail d'un "publier seulement les" app n'est pas quelque chose à laquelle ils ont donné beaucoup de pensée, et Apple/iOS semble avoir ignoré complètement.
Facebook fournit des directives sur la docs que vous l'avez mentionné:
C'est le chemin que je suis en train de faire. Légèrement différentes, mais le même effet général.
Le résultat est, l'application sera toujours contourner le IOS6 l'intégration de la signature de publier, et dans la plupart des cas (car en général les utilisateurs auront déjà Facebook installée sur le téléphone) passage à l'Facebook app pour un seul auth approbation.
Si l'utilisateur choisit de s'inscrire sur notre application en utilisant leur Facebook compte, j'appelle
openActiveSessionWithReadPermissions
, qui va utiliser le IOS6 Facebook de l'intégration, le cas échéant. Si par la suite, ils décident de partager, je puis appelerreauthorizeWithPublishPermissions
qui sera également utiliser l'IOS6 intégration si disponible.En raison du faible et confus de la documentation disponible, je ne peux pas être sûr si c'est la "bonne" façon d'aborder cette question, mais il semble fonctionner. Vous pouvez utiliser le même code pour un IOS5 ou IOS6 app depuis il ne fait que des appels par le biais du Facebook SDK. Il a également fait honneur à la pas de mélange de lecture/d'autorisations de publication dans la même demande Facebook est désormais la promotion.
Au lieu d'utiliser des éléments suivants:
Utiliser ce code:
Désolé mais pour moi, dans ios6
la ligne
Ne retourne pas nul, même si l'utilisateur ne possède pas de compte configuré...
Qui signifie que vous pouvez simplement vérifier quelle est la version ios de l'utilisateur (5 ou 6)
Ce lien peut être utile.