Como usar o Facebook iOS SDK no iOS 10

104

Estou tentando usar o Xcode 8 para construir um aplicativo com login do Facebook usando Swift 3. Quando eu mudo de volta para o iOS Simulator 9.3, ele funciona. No iOS 10, recebo este erro:

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

e

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

Alguém tem solução para isso?

Nota 1 :

Após a depuração, este problema é FBSDK não pode atualizar expect_challange. Função SecItemUpdatedentro security.frameworknão funciona. Este é um problema do IOS 10

trquoccuong
fonte
5
"... por que você espera que isso funcione?" Porque o software deve funcionar. Não é culpa desse cara, não é culpa do Facebook. É culpa da Apple. Eles são aprovados porque este é "beta", mas quebrar as Chaves é quase inaceitável, mesmo em beta.
Jeff Holliday

Respostas:

201

O erro OSStatus -10814 ocorre quando canOpenURL: não é possível encontrar nenhum aplicativo que possa abrir este URL (na verdade, o Facebook tentando encontrar seu aplicativo chamando canOpenURL:com o argumento "fbauth2: /"). A impressão acontece dentro da função, então você não pode fazer nada com isso. Mas se você for executar seu aplicativo no dispositivo com o aplicativo do Facebook instalado, não verá esse erro.

O erro 308 ocorre devido à situação, quando o valor armazenado no keychain não é igual ao valor, que fica armazenado nos parâmetros de preenchimento do Facebook (para mais informações você pode verificar -[FBSDKLoginManager completeAuthentication:expectChallenge:]).

Isso acontece porque a Apple mudou a maneira de trabalhar com as chaves no iOS 10. Para corrigir esse problema, você simplesmente deve ir para Destinos-> Recursos e habilitar o compartilhamento das chaves (permite o acesso às chaves para o seu aplicativo): imagem

Se você estiver usando o Xamarin (leia este link para obter mais informações, obrigado @dynamokaj):

Apenas certifique-se de habilitar o acesso keychain em Direitos e selecionar os direitos para as compilações do Simulador (Depurar) também. Por padrão, isso não é definido.

Roman Ermolov
fonte
2
muito obrigado, você tem algum documento sobre essa mudança?
trquoccuong
1
Depois de sair do xcode, executar, sudo xcode-select -switch /Applications/Xcode.app/Contents/Developere tentar reconstruir, ainda obtendo o mesmo problema. Estou percebendo agora que o erro que estou vendo é mais semelhante a este stackoverflow.com/questions/39091841/…
Roy Kolak
1
@NikitaP, parece que você tem experiência com o problema que @RoyKolak menciona acima.
Roman Ermolov,
1
@NikitaP descobriu. Era uma biblioteca de terceiros (CleverTap) que estava tentando se integrar automaticamente ao delegado do aplicativo. Eu respondi em stackoverflow.com/questions/39091841/… Obrigado por sua atenção!
Roy Kolak,
3
@RomanErmolov Eu descobri, estou no Xamarin e ao compilar para depurar o arquivo Entitlement.plist não é usado por padrão. Quando incluí o direito para depuração funcionou. O que segue me deu o empurrão final para uma solução adequada. stackoverflow.com/a/39576798/1062572 - Talvez você possa atualizar sua resposta para tornar mais fácil para os caras do Xamarin descobrirem se eles estão faltando.
dynamokaj
5

O mesmo problema estava no meu aplicativo, verifiquei várias soluções, mas não funcionou para mim. Eu resolvi esse problema usando o método abaixo.

Vá para este link Selecione seu aplicativo e configure seuinfo.plist

import e adicione este código em seu 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
fonte
4

O principal motivo pelo qual você está recebendo o seguinte erro,

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

é que seu simulador iOS não tem o aplicativo do Facebook instalado. Até instalar o aplicativo em seu simulador iOS, você continuará a obter o erro. Tente executar seu aplicativo iOS em um dispositivo iOS provisionado com o Facebook instalado e você não verá a mensagem de erro novamente. Espero que isto ajude!

umarqattan
fonte
Ele deve abrir a interface do usuário da web quando o aplicativo fb não estiver instalado.
Softlion
3

No meu caso, a solução foi *:

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 
}

* Conforme recomendado por @MoridinBG na página Github do Facebook SDK

Ruben Marin
fonte
0

Este erro também pode ser causado se você estiver usando FBSDKCoreKit ou FBSDKLoginKit versão 4.39.0. Houve um bug nesta versão do SDK. Atualize para 4.39.1 ou superior para corrigi-lo. Detalhes aqui .

Como nota lateral, outros usuários mencionaram que esse erro é visto se você não tem o Facebook instalado no simulador. Isso é verdade, mas o SDK deve retornar automaticamente ao método de login da Web quando o aplicativo não estiver instalado. Se isso não acontecer, pode ser causado por outro problema, como valores ausentes / configurados incorretamente em seu Info.plist (verifique LSApplicationQueriesSchemes) ou métodos ausentes em seu AppDelegate.

Code Commander
fonte
-3

No meu caso, o problema era o Google Analytics. Por padrão, parece que ele está adicionando seu próprio controlador de visualização no topo do controlador de visualização do aplicativo. Definir "FirebaseAppDelegateProxyEnabled" como "NÃO" em {Seu aplicativo} -Info.plist resolveu o problema.

da1
fonte