SecItemAdd selalu mengembalikan kesalahan -34018 di Xcode 8 di simulator iOS 10

103

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 SecItemAddfungsi 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)

Evgenii
sumber
8
Ini tampaknya masih menjadi masalah di Xcode 8 GM. Senang melihat Apple masih di puncak permainan mereka ...
Nicholas Harlen
1
sama untuk saya, masih kesalahan ini
Kostiantyn Koval
Saya benar-benar menggali log konsol Anda :-)
Nicolas Miari
Masalah telah diperbaiki di Xcode 8.2 tetapi kembali ke Xcode 9.0!
Adil Hussain

Jawaban:

183

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.

Tangkapan layar saat menyalakan sakelar

Item untuk ditambahkan ke hak:

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

Saya hanya mencoba ini di macOS Sierra (10.12), jadi saya tidak yakin apakah ini akan berhasil untuk Anda di 10.11.5.

Deyton
sumber
Sama di sini, hanya saja saya menggunakan Xcode 8 beta 5 saat ini (dengan simulator iOS 10. Masalah tidak muncul dengan beta sebelumnya. Juga tidak terjadi saat menguji dengan 8b5 pada iPhone iOS 9 yang sebenarnya). Saya perhatikan bahwa Push Notifications in Capabilities perlu diperbaiki (mis. Menekan tombol) dan juga menyalakan Keychain Sharing, sayangnya pada saat yang sama. Kemudian aplikasi tidak lagi mendapatkan error. Setelah menyalakan off Keychain Sharing lagi, masih bekerja!
Stefan
2
Saya menggunakan rantai kunci sebagai target pengujian dan gagal - bagaimana saya menyiasatinya? (Karena tidak ada kemampuan dalam target uji)
Sam Jarman
1
@ SamJarman Saya mengalami masalah ini juga. Saya baru saja masuk ke pengaturan build untuk target pengujian & un-set bidang hak. Bekerja dengan baik setelah itu.
Jordan Bondo
3
Solusi ini berfungsi dengan baik untuk Target Aplikasi. Sayangnya, saya sedang mengerjakan kerangka Swift yang menggunakan KeychainSwift yang tidak lagi dibangun karena kesalahan tersebut. Dalam target kerangka kerja, saya tidak bisa menambahkan file hak afaik. Adakah yang tahu solusi untuk kasus ini?
Jan Nash
5
@JanNash, inilah cara saya berhasil membuat pengujian bekerja evgenii.com/blog/testing-a-keychain-library-in-xcode
Evgenii
17

Dalam Catatan Rilis GM Xcode 8.1, Apple mengakui masalahnya dan menyarankan solusi yang lebih bersih:

API rantai kunci mungkin gagal berfungsi di Simulator jika file hak Anda tidak berisi nilai untuk hak pengenal aplikasi. (28338972) Solusi: Tambahkan pengaturan build yang ditentukan pengguna ke target Anda bernama ENTITLEMENTS_REQUIRED dan setel nilainya ke YES. Ini akan menyebabkan Xcode secara otomatis memasukkan hak pengenal aplikasi saat membangun.

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.

masukkan deskripsi gambar di sini

Xcode 8.2 akan menyelesaikan ini:

Diselesaikan di Xcode 8.2 beta - IDE Keychain API bekerja dengan benar di Simulator. (28338972)

Tiago Almeida
sumber
1
@Tiago Apakah solusi dari catatan rilis ini masih berfungsi untuk Anda di Xcode 8.1 pada simulator iOS 10.1? Saya telah mencoba menambahkan pengaturan ini (baik sebagai pengaturan yang Ditentukan Pengguna pada target, dan sebagai Variabel Lingkungan dalam skema), dan saya masih mendapatkan nilai pengembalian -34018 saat menjalankan simulator iOS 10.1.
guywithmazda
3
@guywithmazda, sama di sini. Masih mendapatkan -34018 dan mencoba pengaturan build dan variabel lingkungan.
keithbhunter
Tidak berfungsi untuk saya, baik dalam pengaturan build maupun sebagai variabel lingkungan skema di Xcode 8.1 (8B62) di Sierra. Apakah saya melewatkan sesuatu?
Evgenii
4
Saya menggunakan Xcode 8.2.1 dan masalah ini masih dapat direkonstruksi. Selain itu, pertanyaan saya adalah jika saya tidak memiliki aplikasi host, dan saya membuat target Framework, lalu bagaimana cara mengatasi masalah ini?
DShah
2
Masalah ini masih memengaruhi pengujian unit untuk target Framework karena dalam hal ini stub host pengujian yang memerlukan hak. Kami mengetahui masalah ini tetapi jika ini adalah pemblokir untuk Anda, harap laporkan bug duplikat.
russbishop
10

Ini bisa terjadi jika Anda memiliki target pengujian yang tidak memiliki aplikasi host. Memperbaiki

  1. tambahkan aplikasi host tiruan: masukkan deskripsi gambar di sini

  2. Aktifkan penandatanganan kode otomatis dan tambahkan tim:

masukkan deskripsi gambar di sini

  1. Aktifkan berbagi rantai kunci dalam kapabilitas

masukkan deskripsi gambar di sini

Mustafa
sumber
5

Saya mendapat kesalahan saat masuk dengan email, membuat pengguna baru, atau keluar menggunakan firebase.

Kesalahannya adalah:

kode domain kesalahan firauth 17995

Saya menyalakan sakelar Berbagi Rantai Kunci di bagian Kapabilitas di aplikasi pengujian Anda, dan ini juga berfungsi untuk saya.

kavita patel
sumber
4

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:

Masalahnya adalah bahwa setidaknya harus ada satu hak agar Xcode dapat menambahkan hak "pengenal aplikasi" ke aplikasi yang dibangun dengan benar. Inilah sebabnya mengapa berbagi rantai kunci tampaknya menjadi solusi tetapi hanya secara tidak langsung: hak lainnya tampaknya berfungsi dengan baik.

Anda dapat membuat .plistseperti ini:

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

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.

ahtierney
sumber
1

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.

johnrechd
sumber
1

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.

Adam Johns
sumber
0

Ini berfungsi setelah mengaktifkan berbagi rantai kunci dalam kapabilitas.

Vid
sumber
0

Ada 3 langkah yang harus diambil untuk menyelesaikan masalah ini dengan cepat.

  1. Aktifkan berbagi rantai kunci dalam kapabilitas proyek Anda.
  2. Pilih Penyediaan Otomatis dengan profil
  3. Pastikan opsi hak kustom Anda disetel ke Entitlement.plist.

Ini akan melakukan keajaiban

Uchenna Nnodim
sumber