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

104

Я пытаюсь использовать 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

Trquoccuong
источник
5
"... почему вы ожидаете, что это сработает?" Потому что софт должен работать. Это не вина этого парня, это не вина facebook. Это вина Apple. Они получают пропуск, потому что это «бета», но нарушение Связки ключей почти недопустимо, даже в бета-версии.
Джефф Холлидей,

Ответы:

201

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

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

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

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

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

Роман Ермолов
источник
2
Большое спасибо. У вас есть какой-нибудь документ об этом изменении?
trquoccuong 06
1
После выхода из xcode, запуска sudo xcode-select -switch /Applications/Xcode.app/Contents/Developerи попытки перестроения проблема все еще остается. Теперь я понимаю, что ошибка, которую я вижу, больше похожа на эту stackoverflow.com/questions/39091841/…
Рой Колак
1
@NikitaP, похоже, у вас есть опыт решения проблемы, о которой @ RoyKolak упоминает выше.
Роман Ермолов
1
@NikitaP понял это. Это была сторонняя библиотека (CleverTap), которая пыталась автоматически интегрироваться в делегат приложения. Я ответил на stackoverflow.com/questions/39091841/… Спасибо за внимание!
Рой Колак
3
@RomanErmolov Я понял, я использую Xamarin, и при сборке для отладки файл Entitlement.plist по умолчанию не используется. Когда я включил право на отладку, это сработало. Следующее дало мне последний толчок к правильному решению. stackoverflow.com/a/39576798/1062572 - Возможно, вы могли бы обновить свой ответ, чтобы ребятам из Xamarin было проще выяснить, их ли не хватает.
Dynamokaj
5

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

Перейдите по этой ссылке. Выберите свое приложение и настройте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)
}
ZAFAR007
источник
4

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

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

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

умаркаттан
источник
Он должен открывать веб-интерфейс, когда приложение fb не установлено.
Softlion
3

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

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

Рубен Марин
источник
0

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

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

Code Commander
источник
-3

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

da1
источник