SecItemAdd restituisce sempre l'errore -34018 in Xcode 8 nel simulatore iOS 10


103

Aggiornamento : questo problema è stato risolto in Xcode 8.2. Il portachiavi funziona nel simulatore senza abilitare la condivisione del portachiavi.

Perché ricevo sempre l' errore -34018 quando chiamo la SecItemAddfunzione nel simulatore Xcode 8 / iOS 10 ?

Passaggi per riprodurre

Crea un nuovo progetto di app iOS a pagina singola in Xcode 8. Esegui il codice seguente in viewDidLoad(o apri questo progetto Xcode).

let itemKey = "My key"
let itemValue = "My secretive bee 🐝"

// Remove from Keychain
// ----------------

let queryDelete: [String: AnyObject] = [
  kSecClass as String: kSecClassGenericPassword,
  kSecAttrAccount as String: itemKey as AnyObject
]

let resultCodeDelete = SecItemDelete(queryDelete as CFDictionary)

if resultCodeDelete != noErr {
  print("Error deleting from Keychain: \(resultCodeDelete)")
}


// Add to keychain
// ----------------

guard let valueData = itemValue.data(using: String.Encoding.utf8) else {
  print("🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣 Error saving text to Keychain")
  return
}

let queryAdd: [String: AnyObject] = [
  kSecClass as String: kSecClassGenericPassword,
  kSecAttrAccount as String: itemKey as AnyObject,
  kSecValueData as String: valueData as AnyObject,
  kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked
]

let resultCode = SecItemAdd(queryAdd as CFDictionary, nil)

if resultCode != noErr {
  print("🐝🐝🐝🐝🐝🐝🐝🐝🐝 Error saving to Keychain: \(resultCode).")
} else {
  print("🍀🍀🍀🍀🍀🍀🍀🍀🍀 Saved to keychain successfully.")
}

risultati aspettati

L'articolo viene aggiunto al portachiavi.

Risultati attuali

Funzione SecItemAdd restituisce il seguente codice di errore: -34018.

Versione

Xcode versione 8.1 (8B62), macOS Sierra 10.12.1.

Configurazione

Si verifica sempre in Xcode 8 dalla Beta 2 durante il test in un simulatore iOS 10.

NON si verifica in Xcode 8 durante il test in un simulatore iOS 9.3.

dimostrazione

https://dl.dropboxusercontent.com/u/11143285/2016/07/KeychainBugDemo.zip

Riferimenti

Radar: https://openradar.appspot.com/27422249

Forum degli sviluppatori Apple: https://forums.developer.apple.com/message/179846

Questo problema è diverso dal seguente articolo perché si verifica in modo coerente in Xcode 8. SecItemAdd e SecItemCopyMatching restituiscono il codice di errore -34018 (errSecMissingEntitlement)


8
Questo sembra ancora essere un problema in Xcode 8 GM. È bello vedere che Apple è ancora al top ...
Nicholas Harlen

1
lo stesso per me, ancora questo errore
Kostiantyn Koval

Sto davvero scavando nei log della tua console :-)
Nicolas Miari

Il problema è stato risolto in Xcode 8.2 ma è tornato in Xcode 9.0!
Adil Hussain

Risposte:


183

Sono stato in grado di aggirare questo problema nella mia app aggiungendo gruppi di accesso portachiavi al file Entitlements. Ho attivato l' opzione Condivisione portachiavi nella sezione Funzionalità dell'app di test e funziona anche per me.

Screenshot dell'accensione dell'interruttore

Articolo da aggiungere ai diritti:

<key>keychain-access-groups</key>
<array>
    <string>$(AppIdentifierPrefix)com.evgenii.KeychainBugDemo</string>
</array>

L'ho provato solo su macOS Sierra (10.12), quindi non sono sicuro che funzionerà per te su 10.11.5.


Lo stesso qui, solo che attualmente sto utilizzando Xcode 8 beta 5 (con simulatore iOS 10. Il problema non si è presentato con la versione beta precedente. Inoltre non si verifica durante il test con 8b5 su un vero iPhone iOS 9). Ho notato che le notifiche push in Funzionalità dovevano essere risolte (cioè premendo il pulsante) e attivato anche la condivisione del portachiavi, purtroppo allo stesso tempo. Quindi l'app non ha più ricevuto l'errore. Dopo aver disattivato di nuovo la condivisione del portachiavi, funziona ancora!
Stefan

2
Uso il portachiavi come bersaglio di prova e non riesce - come potrei aggirare questo? (Poiché non ci sono capacità negli obiettivi di prova)
Sam Jarman

1
@ SamJarman Anch'io ho avuto questo problema. Sono appena entrato nelle impostazioni di build per l'obiettivo del test e ho annullato l'impostazione del campo dei diritti. Ha funzionato bene dopo.
Jordan Bondo

3
Questa soluzione funziona bene per i target di app. Sfortunatamente, sto lavorando su un framework Swift che utilizza KeychainSwift che non viene più compilato a causa dell'errore. In una destinazione framework, non posso aggiungere un file di diritti afaik. Qualcuno sa una soluzione alternativa per questo caso?
Jan Nash

5
@JanNash, ecco come sono riuscito a far funzionare il test evgenii.com/blog/testing-a-keychain-library-in-xcode
Evgenii

17

Nelle note di rilascio di Xcode 8.1 GM, Apple ha riconosciuto il problema e ha suggerito una soluzione alternativa più pulita:

Le API del portachiavi potrebbero non funzionare nel simulatore se il file dei diritti non contiene un valore per il diritto dell'identificatore dell'applicazione. (28338972) Soluzione alternativa: aggiungere un'impostazione di compilazione definita dall'utente alla destinazione denominata ENTITLEMENTS_REQUIRED e impostare il valore su YES. Ciò farà sì che Xcode inserisca automaticamente un'autorizzazione all'identificatore dell'applicazione durante la creazione.

Nota che da quello che ho provato, funziona solo in Xcode 8.1. Sebbene il testo possa indurti in errore in un'impostazione di compilazione, ciò che devi fare è aggiungerlo alle tue Variabili d'ambiente, nel tuo schema.

inserisci qui la descrizione dell'immagine

Xcode 8.2 risolverà questo:

Risolto in Xcode 8.2 beta - Le API portachiavi IDE funzionano correttamente in Simulator. (28338972)


1
@Tiago Questa soluzione alternativa dalle note di rilascio funziona ancora per te in Xcode 8.1 sul simulatore iOS 10.1? Ho provato ad aggiungere questa impostazione (sia come impostazione definita dall'utente sulla destinazione, sia come variabile d'ambiente nello schema), e ottengo ancora il valore di ritorno -34018 durante l'esecuzione sui simulatori iOS 10.1.
guywithmazda

3
@ guywithmazda, lo stesso qui. Ricevo ancora -34018 e ho provato sia le impostazioni di compilazione che le variabili di ambiente.
Keithbhunter

Non funziona per me, né nelle impostazioni di build né come variabile ambientale di uno schema in Xcode 8.1 (8B62) su Sierra. Mi sto perdendo qualcosa?
Evgenii

4
Sto usando Xcode 8.2.1 e questo problema è ancora riproducibile. Inoltre, la mia domanda è se non ho l'app host e sto creando l'obiettivo Framework, quindi come risolvere questo problema?
DShah

2
Questo problema riguarda ancora gli unit test per le destinazioni Framework perché in questo caso sarebbe lo stub host di test che necessita di autorizzazioni. Siamo a conoscenza del problema, ma se si tratta di un blocco per te, invia un bug duplicato.
russbishop

10

Ciò può accadere se si dispone di un target di test che non dispone di un'app host. Aggiustare

  1. aggiungi un'app host fittizia: inserisci qui la descrizione dell'immagine

  2. Abilita la firma automatica del codice e aggiungi un team:

inserisci qui la descrizione dell'immagine

  1. Abilita la condivisione del portachiavi nelle funzionalità

inserisci qui la descrizione dell'immagine


5

Ho ricevuto un errore durante la firma con l'email, la creazione di un nuovo utente o la disconnessione tramite Firebase.

L'errore era:

codice dominio errore firauth 17995

Ho attivato l'opzione Condivisione portachiavi nella sezione Funzionalità dell'app di test e funziona anche per me.


4

Stavo cercando una soluzione che non usasse la condivisione del portachiavi, poiché non era quella la funzionalità che stavo cercando. Il forum degli sviluppatori sembra avere un buon aggancio da EvergreenCoder che puoi limitare l'ambito solo al simulatore iOS 10 (poiché questo sembra essere l'unico simulatore interessato). Dal post:

Il problema sembra essere che deve esserci almeno un'autorizzazione affinché Xcode possa aggiungere correttamente l'enttilement "identificatore dell'applicazione" all'applicazione compilata. Questo è il motivo per cui la condivisione del portachiavi sembra essere una soluzione ma lo è solo indirettamente: qualsiasi altro diritto sembra funzionare bene.

Puoi creare un .plistsimile così:

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE plist PUBLIC "-/  
<plist version="1.0">  
    <dict>  
        <key>get-task-allow</key>  
        <true/>  
    </dict>  
</plist>

e fornisci un percorso a quel file in Impostazioni build in

Code Signing->Debug->Simulater iOS 10 SDK->($SRCROOT)/your-path-to-file

Come affermato nel post, questo diritto consente solo di allegare il debugger.


1

Ho avuto un problema simile, anche se ho ricevuto l'errore -34018 durante il tentativo di esecuzione sul dispositivo. Sto usando XCode 8.1 su Sierra con iOS 10.1. Lavoro in un team e improvvisamente ho riscontrato questo problema quando siamo passati a "Gestisci automaticamente la firma" nelle impostazioni del progetto. Quando lo disattivo e seleziono manualmente il mio profilo, tutto funziona correttamente. Alla fine ho dovuto eliminare il mio certificato sviluppatore dal mio portachiavi, quindi riselezionare "Gestisci automaticamente la firma". Nella build successiva, ha generato un nuovo certificato di firma per me e ora tutto funziona correttamente. Non sono ancora sicuro di cosa abbia causato il problema poiché l'altro certificato ha funzionato correttamente quando selezionato manualmente, ma non quando è gestito da XCode. Spero che questo aiuti a fermare un mal di testa lungo un'ora per qualcun altro.


1

Sono stato in grado di risolvere questo problema in Xcode 11 senza alcuna regolazione dei diritti.

Ho semplicemente aggiunto una nuova destinazione dell'app al progetto del mio framework chiamato MyFrameworkTestsHostApp.

Quindi ho selezionato il target MyFrameworkTests e ho scelto la sua applicazione host come MyFrameworkTestsHostApp.


0

Funziona dopo aver abilitato la condivisione del portachiavi nelle funzionalità.


0

Sono disponibili 3 passaggi per risolvere rapidamente questo problema.

  1. Attiva la condivisione del portachiavi nelle funzionalità del tuo progetto.
  2. Seleziona Provisioning automatico con un profilo
  3. Assicurati che l'opzione di autorizzazione personalizzata sia impostata su Entitlement.plist.

Questo farà la magia

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.