Как использовать Facebook iOS SDK на iOS 10

Я пытаюсь использовать Xcode 8 для создания приложения с использованием Facebook с помощью Swift 3. Когда я переключаю iOS Simulator 9.3, он работает. В iOS 10 я получаю эту ошибку:

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

и

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

У кого-нибудь есть решение для этого?

Примечание 1:

После отладки эта проблема связана с обновлением FBSDK expect_challange. Функция SecItemUpdate внутри security.framework не работает. Это проблема IOS 10

Ответ 1

Ошибка OSStatus -10814 возникает, когда canOpenURL: не может найти какое-либо приложение, которое может открыть этот URL-адрес (фактически, Facebook пытается найти свое приложение, вызвав canOpenURL: с аргументом "fbauth2:/" ). Печать происходит внутри функции, поэтому вы ничего не можете с этим сделать. Но если вы запустите приложение на устройстве с установленным приложением Facebook, вы не увидите эту ошибку.

Ошибка 308 возникает из-за ситуации, когда значение, хранящееся в цепочке ключей, не равно значению, которое хранится в параметрах завершения facebook (для получения дополнительной информации вы можете проверить -[FBSDKLoginManager completeAuthentication:expectChallenge:]).

Это происходит из-за того, что Apple изменила способ работы с keychain в iOS 10. Чтобы исправить эту проблему, вы просто должны перейти в Targets- > Capabilities и включить совместное использование ключей (он позволяет получить доступ к цепочке ключей для вашего приложения): image

Если вы используете Xamarin (читайте эту ссылку для получения дополнительной информации, спасибо @dynamokaj):

Просто убедитесь, что вы включили доступ к keychain в разделе "Права и выберите права на сборку Simulator (Debug). По умолчанию это не задано.

Ответ 2

Та же проблема была в моем приложении, я проверил много решений, но у меня не получилось. Я исправил эту проблему, используя метод ниже.

Перейдите по этой ссылке Выберите свое приложение и настройте ваш info.plist

import и добавьте этот код в ваш 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)
}

Ответ 3

Основная причина, по которой вы получаете следующую ошибку:

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

заключается в том, что ваш симулятор iOS не имеет установленного приложения Facebook. Пока вы не установите приложение на свой симулятор iOS, вы продолжите получать ошибку. Попробуйте запустить приложение iOS на подготовленном iOS устройстве с установленным Facebook, и вы не увидите сообщение об ошибке снова. Надеюсь, это поможет!

Ответ 4

В моем случае исправление было *:

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 
}

* Как рекомендовано @MoridinBG на Страница Facebook SDK Github

Ответ 5

Эта ошибка также может быть вызвана, если вы используете FBSDKCoreKit или FBSDKLoginKit версии 4.39.0. В этой версии SDK была ошибка. Обновление до 4.39.1 или выше, чтобы исправить это. Подробности здесь.

В качестве примечания, другие пользователи отметили, что эта ошибка видна, если на симуляторе не установлен Facebook. Это правда, но SDK должен автоматически переключаться на метод веб-входа, когда приложение не установлено. Если этого не происходит, это может быть вызвано другой проблемой, например отсутствующими/неправильно настроенными значениями в вашем Info.plist (проверьте LSApplicationQueriesSchemes) или отсутствующими методами в вашем AppDelegate.

Ответ 6

В моем случае проблема была в Google Analytics. По умолчанию кажется, что он добавляет свой собственный контроллер просмотра поверх контроллера представления приложения. Установка "FirebaseAppDelegateProxyEnabled" на "НЕТ" в {Ваше приложение} -Info.plist решила проблему.