Fehler beim Verwenden von [FBSession openActiveSessionWithPublishPermissions: ..]
Ich aktualisiere eine App, um das neueste Facebook SDK zu verwenden und Zugriff auf den nativen iOS6-Facebook-Support zu erhalten. Derzeit wird eine ziemlich alte Version des Facebook SDK verwendet.
Die App benötigt die Erlaubnis "Publish_actions" von Facebook für die einzige Aktion, die sie mit Facebook ausführt.
Ich dachte zuerst, ich könnte es gebrauchen[FBSession openActiveSessionWithPublishPermissions: ...]
Dies schlägt jedoch unter iOS6 fehl, wenn der Benutzer Facebook in den iOS6-Einstellungen konfiguriert hat. Es scheitert an dieser Anforderung,von den Facebook-Dokumenten:
Hinweis: Um die native Authentifizierung von iOS 6 zu verwenden, müssen Apps die Art und Weise ändern, in der sie Berechtigungen von Benutzern anfordern. Apps müssen ihre Anforderungen für Lese- und Schreibberechtigungen trennen. Das Facebook SDK für iOS unterstützt diese Funktionen und hilft Entwicklern, damit Apps zu erstellen, die auf mehreren iOS-Versionen und Gerätekonfigurationen funktionieren.
Dies ist eine große PITA, IMO. Wir würden es vorziehen, den Benutzer einmal zur Erlaubnis aufzufordern und damit fertig zu sein, aber das "neue" Ideal für Apple / Facebook ist es, im Kontext nach bestimmten Berechtigungen zu fragen, wenn sie benötigt, aber noch nicht erteilt werden.
Derzeit ist geplant, unser altes Verhalten für iOS5-Benutzer und iOS6-Benutzer beizubehalten, für die Facebook in den Einstellungen nicht konfiguriert ist. Und passen Sie sich an die neue doppelte Eingabeaufforderung für iOS6-Benutzer an, die systemeigenen Zugriff verwenden.
Die Frage ist, wie das am besten geht. Wie kann ich feststellen, ob das Facebook SDK die native iOS6-Anmeldung im Vergleich zu den Fallback-Mechanismen auswählt? Übersehen ich etwas Offensichtliches?
BEARBEITEN:
gerraldWilliam hat mich auf den richtigen Weg gebracht. Seine Lösung würde fast funktionieren, außer dass ACAccountTypeIdentifierFacebook in iOS5 nicht verfügbar ist. Auch wenn der Benutzer den FB-Zugriff in den Einstellungen auf die App blockiert, gibt der accountsWithAccountType-Aufruf ein leeres Array zurück.
Es ist möglich, das erste Problem zu umgehen, indem Sie nach der Kennung "com.apple.facebook" für den Kontotyp fragen. Diese gibt unter iOS5 null und unter iOS6 ein echtes Objekt für den Kontotyp zurück.
Das zweite Problem ist jedoch unlösbar. Mein neuer Plan ist es, die erste Sitzung unter iOS6 immer mit schreibgeschützten Berechtigungen zu öffnen und später im Kontext zur Veröffentlichung aufzufordern, falls erforderlich. Unter iOS5 öffne ich immer noch die erste Sitzung, in der die gewünschte Berechtigung für Publish_actions angegeben ist. Hier ist der 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: ...]
}