Come utilizzare Facebook iOS SDK su iOS 10


104

Sto provando a utilizzare Xcode 8 per creare un'app con accesso a Facebook utilizzando Swift 3. Quando torno indietro iOS Simulator 9.3, funziona. In iOS 10, ricevo questo errore:

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

e

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

Qualcuno ha una soluzione per questo?

Nota 1 :

Dopo il debug, questo problema è che FBSDK non può essere aggiornato expect_challange. La funzione SecItemUpdateinterna security.frameworknon funziona. Questo è un problema di IOS 10


5
"... perché ti aspetti che funzioni?" Perché il software dovrebbe funzionare. Non è colpa di questo ragazzo, non è colpa di Facebook. È colpa di Apple. Ottengono un passaggio perché questo è "beta", ma rompere il portachiavi è quasi inaccettabile, anche in beta.
Jeff Holliday

Risposte:


201

L'errore OSStatus -10814 si verifica quando canOpenURL: non è possibile trovare alcuna applicazione , che può aprire questo URL (in realtà, Facebook sta cercando di trovare la loro applicazione chiamando canOpenURL:con argomento "fbauth2: /"). La stampa avviene all'interno della funzione, quindi non puoi farci nulla. Ma se eseguirai la tua applicazione sul dispositivo con l'app Facebook installata, non vedrai questo errore.

L'errore 308 si verifica a causa della situazione, quando il valore, memorizzato nel portachiavi non è uguale al valore, che viene memorizzato nei parametri di completamento di Facebook (per ulteriori informazioni è possibile controllare -[FBSDKLoginManager completeAuthentication:expectChallenge:]).

Succede perché Apple ha cambiato il modo di lavorare con il portachiavi in ​​iOS 10. Per risolvere questo problema devi semplicemente andare su Target-> Funzionalità e abilitare la condivisione del portachiavi (consente l'accesso al portachiavi per la tua app): Immagine

Se stai usando Xamarin (leggi questo link per maggiori informazioni, grazie @dynamokaj):

Assicurati solo di abilitare l'accesso al portachiavi in ​​Entitlements e seleziona anche i diritti per le build di Simulator (Debug). Per impostazione predefinita, questo non è impostato.


2
grazie mille, hai qualche documento su questo cambiamento?
trquoccuong

1
Dopo aver chiuso xcode, eseguito sudo xcode-select -switch /Applications/Xcode.app/Contents/Developere provato a ricostruire, si continua a riscontrare lo stesso problema. Mi sto rendendo conto ora che l'errore che vedo è più simile a questo stackoverflow.com/questions/39091841/…
Roy Kolak

1
@NikitaP sembra che tu abbia esperienza con il problema che @ RoyKolak menziona sopra.
Roman Ermolov

1
@NikitaP l'ha capito. Era una libreria di terze parti (CleverTap) che stava tentando di integrarsi automaticamente nel delegato dell'app. Ho risposto in stackoverflow.com/questions/39091841/… Grazie per l'attenzione!
Roy Kolak

3
@RomanErmolov L'ho capito, sono su Xamarin e durante la compilazione per il debug il file Entitlement.plist non viene utilizzato per impostazione predefinita. Quando ho incluso il diritto per il debug ha funzionato. Quanto segue mi ha dato la spinta finale a una soluzione adeguata. stackoverflow.com/a/39576798/1062572 - Forse potresti aggiornare la tua risposta per rendere più facile per i tizi Xamarin capire se mancano.
dynamokaj

5

Lo stesso problema era nella mia app, ho controllato molte soluzioni ma non ha funzionato per me. Ho risolto questo problema utilizzando il metodo seguente.

Vai a questo collegamento Seleziona la tua app e configura il tuoinfo.plist

import e aggiungi questo codice nel tuo file 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)
}

4

Il motivo principale per cui ricevi il seguente errore,

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

è che il tuo simulatore iOS non ha l'applicazione Facebook installata. Fino a quando non installi l'applicazione sul tuo simulatore iOS, continuerai a ricevere l'errore. Prova a eseguire la tua applicazione iOS su un dispositivo iOS con provisioning con Facebook installato e non vedrai più il messaggio di errore. Spero che questo ti aiuti!


Dovrebbe aprire l'interfaccia utente web quando l'app fb non è installata.
Softlion

3

Nel mio caso, la correzione era *:

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 
}

* Come consigliato da @MoridinBG nella pagina Github di Facebook SDK


0

Questo errore può essere causato anche se si utilizza FBSDKCoreKit o FBSDKLoginKit versione 4.39.0. C'era un bug in questa versione dell'SDK. Esegui l'upgrade a 4.39.1 o superiore per risolverlo. Dettagli qui .

Come nota a margine, altri utenti hanno affermato che questo errore viene visualizzato se non si dispone di Facebook installato sul simulatore. Questo è vero, ma l'SDK dovrebbe ricorrere automaticamente al metodo di accesso Web quando l'app non è installata. Se ciò non accade, potrebbe essere causato da un altro problema come valori mancanti / configurati in modo errato nel tuo Info.plist (controlla LSApplicationQueriesSchemes) o metodi mancanti nel tuo AppDelegate.


-3

Nel mio caso, il problema era Google Analytics. Per impostazione predefinita, sembra che stia aggiungendo il proprio controller di visualizzazione sopra il controller di visualizzazione dell'app. L'impostazione di "FirebaseAppDelegateProxyEnabled" su "NO" in {Your app} -Info.plist ha risolto il problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.