Pembaruan : Masalah ini telah diperbaiki di Xcode 8.2. Rantai kunci berfungsi di simulator tanpa mengaktifkan berbagi rantai kunci.
Mengapa saya selalu menerima kesalahan -34018 saat memanggil SecItemAdd
fungsi di simulator Xcode 8 / iOS 10 ?
Langkah-langkah untuk Mereproduksi
Buat halaman Tunggal iOS proyek aplikasi baru di Xcode 8. Jalankan kode berikut di viewDidLoad
(atau membuka ini proyek 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.")
}
hasil yang diharapkan
Item ditambahkan ke Keychain.
Hasil nyata
Fungsi SecItemAdd mengembalikan kode kesalahan berikut: -34018
.
Versi: kapan
Xcode versi 8.1 (8B62), macOS Sierra 10.12.1.
Konfigurasi
Selalu terjadi di Xcode 8 sejak Beta 2 saat menguji di simulator iOS 10.
TIDAK terjadi di Xcode 8 saat menguji di simulator iOS 9.3.
Demo
https://dl.dropboxusercontent.com/u/11143285/2016/07/KeychainBugDemo.zip
Referensi
Radar: https://openradar.appspot.com/27422249
Forum Pengembang Apple: https://forums.developer.apple.com/message/179846
Masalah ini berbeda dari posting berikut ini karena terjadi secara konsisten di Xcode 8. SecItemAdd dan SecItemCopyMatching mengembalikan kode kesalahan -34018 (errSecMissingEntitlement)
Jawaban:
Saya bisa mengatasi ini di aplikasi saya dengan menambahkan Grup Akses Rantai Kunci ke file Kepemilikan. Saya menyalakan sakelar Berbagi Rantai Kunci di bagian Kapabilitas di aplikasi pengujian Anda, dan ini juga berfungsi untuk saya.
Item untuk ditambahkan ke hak:
Saya hanya mencoba ini di macOS Sierra (10.12), jadi saya tidak yakin apakah ini akan berhasil untuk Anda di 10.11.5.
sumber
Dalam Catatan Rilis GM Xcode 8.1, Apple mengakui masalahnya dan menyarankan solusi yang lebih bersih:
Perhatikan bahwa dari apa yang saya coba, ini hanya berfungsi di Xcode 8.1. Meskipun teks dapat menyesatkan Anda ke dalam pengaturan build, yang perlu Anda lakukan adalah menambahkan ini ke Variabel Lingkungan, dalam skema Anda.
Xcode 8.2 akan menyelesaikan ini:
sumber
Ini bisa terjadi jika Anda memiliki target pengujian yang tidak memiliki aplikasi host. Memperbaiki
tambahkan aplikasi host tiruan:
Aktifkan penandatanganan kode otomatis dan tambahkan tim:
sumber
Saya mendapat kesalahan saat masuk dengan email, membuat pengguna baru, atau keluar menggunakan firebase.
Kesalahannya adalah:
Saya menyalakan sakelar Berbagi Rantai Kunci di bagian Kapabilitas di aplikasi pengujian Anda, dan ini juga berfungsi untuk saya.
sumber
Saya mencari solusi yang tidak menggunakan berbagi Keychain, karena itu bukan fitur yang saya cari. Forum pengembang Tampaknya memiliki solusi yang baik dari EvergreenCoder yang dapat Anda batasi cakupannya hanya untuk simulator iOS 10 (karena ini tampaknya satu-satunya simulator yang terpengaruh). Dari postingan:
Anda dapat membuat
.plist
seperti ini:dan menyediakan jalur ke file tersebut di bawah Build Settings in
Code Signing->Debug->Simulater iOS 10 SDK->($SRCROOT)/your-path-to-file
Seperti yang dinyatakan di pos, hak ini hanya memungkinkan debugger untuk dilampirkan.
sumber
Saya mengalami masalah serupa, meskipun saya mendapatkan kesalahan -34018 saat mencoba menjalankan di perangkat. Saya menggunakan XCode 8.1 di Sierra dengan iOS 10.1. Saya bekerja dalam tim dan tiba-tiba mengalami masalah ini saat kami beralih ke "Kelola penandatanganan secara otomatis" di setelan proyek. Saat saya mematikannya dan memilih profil saya secara manual, semuanya berfungsi dengan baik. Saya akhirnya harus menghapus sertifikat pengembang saya dari rantai kunci saya, lalu memilih kembali "Kelola penandatanganan secara otomatis". Pada build berikutnya, itu menghasilkan sertifikat penandatanganan baru untuk saya dan semuanya berfungsi dengan baik sekarang. Saya masih tidak yakin apa yang menyebabkan masalah karena sertifikat lain berfungsi dengan baik saat dipilih secara manual, tetapi tidak saat dikelola oleh XCode. Semoga ini membantu menghentikan sakit kepala selama berjam-jam untuk orang lain.
sumber
Saya dapat menyelesaikan masalah ini di Xcode 11 tanpa penyesuaian hak apa pun.
Saya hanya menambahkan target aplikasi baru ke proyek framework saya yang disebut MyFrameworkTestsHostApp.
Kemudian saya memilih target MyFrameworkTests dan memilih Aplikasi Host-nya sebagai MyFrameworkTestsHostApp.
sumber
Ini berfungsi setelah mengaktifkan berbagi rantai kunci dalam kapabilitas.
sumber
Ada 3 langkah yang harus diambil untuk menyelesaikan masalah ini dengan cepat.
Ini akan melakukan keajaiban
sumber