Aktualizacja : ten problem został rozwiązany w Xcode 8.2. Pęk kluczy działa w symulatorze bez włączania udostępniania pęku kluczy.
Dlaczego zawsze otrzymuję błąd -34018 podczas wywoływania SecItemAdd
funkcji w symulatorze Xcode 8 / iOS 10 ?
Kroki ku reprodukcji
Utwórz nowy projekt aplikacji dla systemu iOS z pojedynczą stroną w Xcode 8. Uruchom następujący kod w viewDidLoad
(lub otwórz ten projekt 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.")
}
oczekiwane rezultaty
Przedmiot został dodany do pęku kluczy.
Aktualne wyniki
Funkcja SecItemAdd zwraca następujący kod błędu: -34018
.
Wersja
Xcode w wersji 8.1 (8B62), macOS Sierra 10.12.1.
Konfiguracja
Zawsze występuje w Xcode 8 od wersji Beta 2 podczas testowania w symulatorze iOS 10.
NIE występuje w Xcode 8 podczas testowania w symulatorze iOS 9.3.
Próbny
https://dl.dropboxusercontent.com/u/11143285/2016/07/KeychainBugDemo.zip
Bibliografia
Radar: https://openradar.appspot.com/27422249
Fora deweloperów Apple: https://forums.developer.apple.com/message/179846
Ten problem różni się od następującego postu, ponieważ występuje konsekwentnie w Xcode 8. SecItemAdd i SecItemCopyMatching zwraca kod błędu -34018 (errSecMissingEntitlement)
Odpowiedzi:
Udało mi się obejść ten problem w mojej aplikacji, dodając grupy dostępu do pęku kluczy do pliku uprawnień. Włączyłem przełącznik Udostępnianie pęku kluczy w sekcji Możliwości w aplikacji testowej i u mnie też działa.
Pozycja do dodania do uprawnień:
Próbowałem tego tylko na macOS Sierra (10.12), więc nie jestem pewien, czy zadziała to na 10.11.5.
źródło
W informacjach o wydaniu Xcode 8.1 GM firma Apple przyznała się do problemu i zasugerowała bardziej przejrzyste obejście:
Zauważ, że z tego, co próbowałem, działa tylko w Xcode 8.1. Chociaż tekst może wprowadzić Cię w błąd w ustawieniach kompilacji, musisz dodać to do zmiennych środowiskowych w swoim schemacie.
Xcode 8.2 rozwiąże ten problem:
źródło
Może się tak zdarzyć, jeśli masz cel testowy, który nie ma aplikacji hosta. Naprawić
dodaj fałszywą aplikację hosta:
Włącz automatyczne podpisywanie kodu i dodaj zespół:
źródło
Wystąpił błąd podczas logowania za pomocą poczty e-mail, tworzenia nowego użytkownika lub wylogowywania się przy użyciu Firebase.
Błąd:
Włączyłem przełącznik Udostępnianie pęku kluczy w sekcji Możliwości w aplikacji testowej i u mnie też działa.
źródło
Szukałem rozwiązania, które nie korzystało z udostępniania pęku kluczy, ponieważ nie była to funkcja, której szukałem. Wydaje się, że forum programistów ma dobre obejście z EvergreenCoder, które można ograniczyć tylko do symulatora iOS 10 (ponieważ wydaje się, że jest to jedyny symulator, którego dotyczy problem). Z postu:
Możesz stworzyć coś
.plist
podobnego:i podaj ścieżkę do tego pliku w Ustawieniach kompilacji w
Code Signing->Debug->Simulater iOS 10 SDK->($SRCROOT)/your-path-to-file
Jak stwierdzono w poście, to uprawnienie pozwala tylko na dołączenie debugera.
źródło
Miałem podobny problem, chociaż otrzymywałem błąd -34018 podczas próby uruchomienia na urządzeniu. Używam XCode 8.1 na Sierra z iOS 10.1. Pracuję w zespole i nagle wystąpił ten problem, gdy w ustawieniach projektu przełączyliśmy się na opcję „Automatycznie zarządzaj podpisywaniem”. Kiedy to wyłączam i ręcznie wybieram mój profil, wszystko działa dobrze. Skończyło się na tym, że musiałem usunąć certyfikat programisty z pęku kluczy, a następnie ponownie wybrać opcję „Automatycznie zarządzaj podpisywaniem”. Przy następnej kompilacji wygenerował dla mnie nowy certyfikat podpisywania i teraz wszystko działa dobrze. Nadal nie jestem pewien, co spowodowało problem, ponieważ drugi certyfikat działał dobrze po ręcznym wybraniu, ale nie w przypadku zarządzania przez XCode. Mam nadzieję, że to pomoże komuś innemu powstrzymać wielogodzinny ból głowy.
źródło
Udało mi się rozwiązać ten problem w Xcode 11 bez żadnych korekt uprawnień.
Po prostu dodałem nowy cel aplikacji do projektu mojej platformy o nazwie MyFrameworkTestsHostApp.
Następnie wybrałem cel MyFrameworkTests i wybrałem jego aplikację hosta jako MyFrameworkTestsHostApp.
źródło
Działa po włączeniu możliwości udostępniania pęku kluczy.
źródło
Istnieją 3 kroki, które należy wykonać, aby szybko rozwiązać ten problem.
To zrobi magię
źródło