Cómo usar el SDK de Facebook iOS en iOS 10

104

Estoy tratando de usar Xcode 8 para crear una aplicación con inicio de sesión de Facebook usando Swift 3. Cuando cambio de nuevo iOS Simulator 9.3, funciona. En iOS 10, recibo este error:

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

y

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

¿Alguien tiene una solución para esto?

Nota 1 :

Después de la depuración, este problema es que FBSDK no puede actualizarse expect_challange. La función SecItemUpdateinterior security.frameworkno funciona. Este es un problema de IOS 10

trquoccuong
fuente
5
"... ¿Por qué esperarías que esto funcione?" Porque el software debería funcionar. No es culpa de este tipo, no es culpa de Facebook. Es culpa de Apple. Obtienen un pase porque esto es "beta", pero romper el llavero es casi inaceptable, incluso en beta.
Jeff Holliday

Respuestas:

201

El error OSStatus -10814 ocurre cuando canOpenURL: no se puede encontrar ninguna aplicación que pueda abrir esta URL (en realidad, Facebook está tratando de encontrar su aplicación llamandocanOpenURL: con el argumento "fbauth2: /"). La impresión ocurre dentro de la función, por lo que no puede hacer nada con eso. Pero si va a ejecutar su aplicación en un dispositivo con la aplicación de Facebook instalada, no verá este error.

El error 308 ocurre debido a la situación, cuando el valor, almacenado en el llavero no es igual al valor, que se almacena en los parámetros de finalización de Facebook (para obtener más información, puede consultar -[FBSDKLoginManager completeAuthentication:expectChallenge:]).

Sucede porque Apple cambió la forma de trabajar con el llavero en iOS 10. Para solucionar este problema, simplemente debe ir a Objetivos-> Capacidades y habilitar el uso compartido de llavero (habilita el acceso al llavero para su aplicación): imagen

Si está utilizando Xamarin (lea este enlace para obtener más información, gracias @dynamokaj):

Solo asegúrese de habilitar el acceso al llavero en Derechos y seleccione los derechos para las compilaciones del Simulador (Depuración) también. De forma predeterminada, esto no está configurado.

Roman Ermolov
fuente
2
muchas gracias, ¿tienes algún documento sobre este cambio?
trquoccuong
1
Después de salir de xcode, ejecutar, sudo xcode-select -switch /Applications/Xcode.app/Contents/Developere intentar reconstruir, sigue teniendo el mismo problema. Me estoy dando cuenta ahora de que el error que veo es más similar a este stackoverflow.com/questions/39091841/…
Roy Kolak
1
@NikitaP parece que tienes experiencia con el problema que @ RoyKolak menciona arriba.
Roman Ermolov
1
@NikitaP lo descubrió. Era una biblioteca de terceros (CleverTap) que intentaba integrarse automáticamente en el delegado de la aplicación. Respondí en stackoverflow.com/questions/39091841/… ¡ Gracias por tu atención!
Roy Kolak
3
@RomanErmolov Lo descubrí, estoy en Xamarin y cuando compilo para depurar el archivo Entitlement.plist no se usa de forma predeterminada. Cuando incluí el derecho para la depuración, funcionó. Lo siguiente me dio el empujón final hacia una solución adecuada. stackoverflow.com/a/39576798/1062572 : tal vez pueda actualizar su respuesta para que sea más fácil para los tipos de Xamarin averiguar si faltan.
dynamokaj
5

El mismo problema estaba en mi aplicación, verifiqué muchas soluciones pero no me funcionó. Solucioné este problema usando el método siguiente.

Vaya a este enlace Seleccione su aplicación y configure suinfo.plist

import y agregue este código en su 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
fuente
4

La razón principal por la que aparece el siguiente error,

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

es que su simulador de iOS no tiene instalada la aplicación de Facebook. Hasta que instale la aplicación en su simulador de iOS, seguirá recibiendo el error. Intente ejecutar su aplicación iOS en un dispositivo iOS provisto con Facebook instalado y no volverá a ver el mensaje de error. ¡Espero que esto ayude!

umarqattan
fuente
Debería abrir la interfaz de usuario web cuando la aplicación fb no esté instalada.
Softlion
3

En mi caso, la solución fue *:

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 
}

* Según lo recomendado por @MoridinBG en la página de Github del SDK de Facebook

Ruben Marin
fuente
0

Este error también se puede producir si está utilizando FBSDKCoreKit o FBSDKLoginKit versión 4.39.0. Hubo un error en esta versión del SDK. Actualice a 4.39.1 o superior para solucionarlo. Detalles aquí .

Como nota al margen, otros usuarios mencionaron que este error se ve si no tiene Facebook instalado en el simulador. Eso es cierto, pero se supone que el SDK recurre automáticamente al método de inicio de sesión web cuando la aplicación no está instalada. Si eso no sucede, puede deberse a otro problema, como valores faltantes / mal configurados en su Info.plist (verifique LSApplicationQueriesSchemes) o métodos faltantes en su AppDelegate.

Comandante de código
fuente
-3

En mi caso, el problema fue Google Analytics. De forma predeterminada, parece que está agregando su propio controlador de vista en la parte superior del controlador de vista de la aplicación. Establecer "FirebaseAppDelegateProxyEnabled" en "NO" en {Your app} -Info.plist resolvió el problema.

da1
fuente