Jak korzystać z Facebooka iOS SDK na iOS 10

104

Próbuję użyć Xcode 8 do zbudowania aplikacji z logowaniem do Facebooka przy użyciu Swift 3. Kiedy przełączam się z powrotem na iOS Simulator 9.3, to działa. W iOS 10 otrzymuję ten błąd:

""fbauth2:/" The operation couldn’t be completed. (OSStatus error -10814.)"

i

Optional(Error Domain=com.facebook.sdk.login Code=308 "(null)")

Czy ktoś ma na to rozwiązanie?

Notatka 1 :

Po debugowaniu ten problem to aktualizacja FBSDK expect_challange. Funkcja SecItemUpdatewewnątrz security.frameworknie działa. To jest problem z IOS 10

trquoccuong
źródło
5
„… dlaczego miałbyś oczekiwać, że to zadziała?” Ponieważ oprogramowanie powinno działać. To nie wina tego gościa, to nie wina facebooka. To wina Apple. Dostają przepustkę, ponieważ jest to „beta”, ale złamanie pęku kluczy jest prawie niedopuszczalne, nawet w wersji beta.
Jeff Holliday

Odpowiedzi:

201

Błąd OSStatus -10814 występuje, gdy canOpenURL: nie można znaleźć żadnej aplikacji , która może otworzyć ten adres URL (w rzeczywistości Facebook próbuje znaleźć swoją aplikację, wywołując canOpenURL:argument „fbauth2: /”). Drukowanie odbywa się wewnątrz funkcji, więc nie możesz nic z tym zrobić. Ale jeśli uruchomisz swoją aplikację na urządzeniu z zainstalowaną aplikacją Facebook, nie zobaczysz tego błędu.

Błąd 308 występuje z powodu sytuacji, w której wartość przechowywana w pęku kluczy nie jest równa wartości, która jest przechowywana w parametrach uzupełniania na Facebooku (więcej informacji można sprawdzić -[FBSDKLoginManager completeAuthentication:expectChallenge:]).

Dzieje się tak, ponieważ Apple zmienił sposób pracy z pękiem kluczy w iOS 10. Aby rozwiązać ten problem, wystarczy przejść do Cele-> Możliwości i włączyć udostępnianie pęku kluczy (umożliwia to dostęp do pęku kluczy dla Twojej aplikacji): wizerunek

Jeśli używasz platformy Xamarin (przeczytaj ten link, aby uzyskać więcej informacji, dzięki @dynamokaj):

Po prostu upewnij się, że włączyłeś dostęp do pęku kluczy w uprawnieniach i wybierz uprawnienia również dla kompilacji symulatora (debugowania). Domyślnie nie jest to ustawione.

Roman Ermolov
źródło
2
bardzo dziękuję, czy masz jakiś dokument dotyczący tej zmiany?
trquoccuong
1
Po zamknięciu xcode, uruchomieniu sudo xcode-select -switch /Applications/Xcode.app/Contents/Developeri próbie odbudowania nadal pojawia się ten sam problem. Teraz zdaję sobie sprawę, że błąd, który widzę, jest bardziej podobny do tego stackoverflow.com/questions/39091841/ ...
Roy Kolak
1
@NikitaP Wygląda na to, że masz doświadczenie z problemem, o którym @RoyKolak wspomniał powyżej.
Roman Ermolov
1
@NikitaP to rozgryzł. Była to biblioteka innej firmy (CleverTap), która próbowała automatycznie zintegrować się z delegatem aplikacji. Odpowiedziałem na stackoverflow.com/questions/39091841/… Dziękuję za uwagę!
Roy Kolak
3
@RomanErmolov Rozgryzłem to, korzystam z platformy Xamarin i podczas kompilowania do debugowania plik Entitlement.plist nie jest domyślnie używany. Kiedy dołączyłem uprawnienie do debugowania, zadziałało. Poniższe wskazówki dały mi ostatni impuls do właściwego rozwiązania. stackoverflow.com/a/39576798/1062572 - Może warto zaktualizować swoją odpowiedź, aby ułatwić kolesiom Xamarin ustalenie, czy ich brakuje.
dynamokaj
5

Ten sam problem był w mojej aplikacji, sprawdziłem wiele rozwiązań, ale nie działa. Naprawiłem ten problem za pomocą poniższej metody.

Przejdź do tego łącza Wybierz swoją aplikację i skonfigurujinfo.plist

import i dodaj ten kod do swojego AppDelegate

import FBSDKCoreKit
import FBSDKLoginKit

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
}

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, options: options)
}
ZAFAR007
źródło
4

Głównym powodem, dla którego otrzymujesz następujący błąd,

canOpenURL: failed for URL: "fbauth2:/" - error: "The operation couldn’t be completed. (OSStatus error -10814.)

polega na tym, że Twój symulator iOS nie ma zainstalowanej aplikacji Facebook. Dopóki nie zainstalujesz aplikacji na swoim symulatorze iOS, błąd będzie nadal występował. Spróbuj uruchomić aplikację iOS na obsługiwanym urządzeniu iOS z zainstalowanym Facebookiem, a komunikat o błędzie nie zostanie ponownie wyświetlony. Mam nadzieję że to pomoże!

umarqattan
źródło
Powinien otworzyć interfejs użytkownika sieci Web, gdy aplikacja fb nie jest zainstalowana.
Softlion
3

W moim przypadku poprawka była *:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { 

  // First, handle Facebook URL open request
  if let fbSDKAppId = FBSDKSettings.appID(), url.scheme!.hasPrefix("fb\(fbSDKAppId)"), url.host == "authorize" { 
    let shouldOpen: Bool = FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String!, annotation: options[UIApplicationOpenURLOptionsKey.annotation]) 
    return shouldOpen 
  } 

  // After it, handle any other response (e.g. deep links)
  handlerOtherUrls(url: url) 
  return true 
}

* Zgodnie z zaleceniami @MoridinBG na stronie Github Facebook SDK

Ruben Marin
źródło
0

Ten błąd może być również spowodowany, jeśli używasz FBSDKCoreKit lub FBSDKLoginKit w wersji 4.39.0. Wystąpił błąd w tej wersji SDK. Zaktualizuj do wersji 4.39.1 lub nowszej, aby to naprawić. Szczegóły tutaj .

Na marginesie, inni użytkownicy wspominali, że ten błąd jest widoczny, jeśli nie masz zainstalowanego Facebooka na symulatorze. To prawda, ale SDK powinien automatycznie wrócić do metody logowania w sieci Web, gdy aplikacja nie jest zainstalowana. Jeśli tak się nie stanie, może to być spowodowane innym problemem, takim jak brakujące / źle skonfigurowane wartości w Info.plist (sprawdź LSApplicationQueriesSchemes) lub brakujące metody w AppDelegate.

Code Commander
źródło
-3

W moim przypadku problemem był Google Analytics. Domyślnie wydaje się, że dodaje własny kontroler widoku na wierzchu kontrolera widoku aplikacji. Ustawienie „FirebaseAppDelegateProxyEnabled” na „NIE” w {Twoja aplikacja} -Info.plist rozwiązało problem.

da1
źródło