Błąd podczas używania [FBSession openActiveSessionWithPublishPermissions: ..]
Aktualizuję aplikację, aby użyć najnowszego zestawu SDK Facebooka, aby uzyskać dostęp do natywnej obsługi Facebooka w systemie iOS6. Obecnie używa całkiem starej wersji SDK Facebooka.
Aplikacja wymaga uprawnienia „publikuj_wydania” z Facebooka tylko w przypadku Facebooka.
Początkowo myślałem, że mogę użyć[FBSession openActiveSessionWithPublishPermissions: ...]
ale to nie działa na iOS6, gdy użytkownik ma skonfigurowanego Facebooka w ustawieniach iOS6. Zawodzi z powodu tego wymogu,z dokumentów Facebooka:
Zauważ, że aby korzystać z rodzimego autoryzacji systemu iOS 6, aplikacje muszą zmienić sposób, w jaki żądają uprawnień od użytkowników - aplikacje muszą oddzielić swoje żądania dotyczące uprawnień do odczytu i zapisu. Zestaw SDK Facebooka dla systemu iOS obsługuje te funkcje i pomaga programistom wykorzystywać je do tworzenia aplikacji, które działają w wielu wersjach iOS i konfiguracjach urządzeń.
To duża PITA, IMO. Naszą preferencją byłoby skłonienie użytkownika do uzyskania pozwolenia i ukończenia go, ale „nowym” ideałem na Apple / Facebook jest monitowanie o określone uprawnienia w kontekście, gdy są one potrzebne, ale jeszcze nie udzielono.
Obecnie planujemy zachować nasze stare zachowanie dla użytkowników iOS5 i użytkowników iOS6, którzy nie mają skonfigurowanego Facebooka w Ustawieniach. I dostosuj się do nowej podwójnej zachęty dla użytkowników iOS6, którzy korzystają z dostępu natywnego.
Pytanie brzmi, jak najlepiej to zrobić? W jaki sposób powinienem wykryć, czy zestaw SDK Facebooka wybierze rodzimy login iOS6 zamiast mechanizmów rezerwowych? Czy przeoczę coś oczywistego?
EDYTOWAĆ:
gerraldWilliam wprowadził mnie na właściwy tor. Jego rozwiązanie prawie zadziałałoby, z wyjątkiem tego, że ACAccountTypeIdentifierFacebook nie jest dostępny w iOS5. Ponadto, jeśli użytkownik zablokuje dostęp FB w Ustawieniach do aplikacji, wywołanie accountsWithAccountType zwróci pustą tablicę.
Pierwszy problem można obejść, pytając o identyfikator dopasowania typu konta „com.apple.facebook” - zwróci on zero w iOS5 i obiekt typu rzeczywistego konta w iOS6.
Ale drugi problem jest nierozwiązywalny. Moim nowym planem jest, aby zawsze otwierać początkową sesję na iOS6 z uprawnieniami tylko do odczytu i pytać później, w kontekście, o pozwolenie na publikację, jeśli jest to wymagane. W systemie iOS5 nadal otworzę sesję początkową, podając żądane uprawnienie do publikowania. Oto kod:
ACAccountStore* as = [[ACAccountStore new] autorelease];
ACAccountType* at = [as accountTypeWithAccountTypeIdentifier: @"com.apple.facebook"];
if ( at != nil ) {
// iOS6+, call [FBSession openActiveSessionWithReadPermissions: ...]
} else {
// iOS5, call [FBSession openActiveSessionWithPublishPermissions: ...]
}