Kadang-kadang ketika saya menjalankan aplikasi pada perangkat dari Xcode, saya mencoba mengakses rantai kunci tetapi gagal karena kesalahan -34018. Ini tidak cocok dengan kode kesalahan rantai kunci yang didokumentasikan dan tidak dapat direproduksi secara konsisten. (terjadi mungkin 30% dari waktu, dan tidak jelas bagi saya mengapa itu terjadi). Apa yang membuat debugging masalah ini sangat sulit adalah kurangnya dokumentasi. Tahu apa yang menyebabkan ini dan bagaimana cara memperbaikinya? Saya menggunakan Xcode 5 dan menjalankan iOS 7.0.4 di perangkat.
Ada masalah terbuka tentang ini di sini: https://github.com/soffes/sskeychain/issues/52
EDIT: Menambahkan kode akses rantai kunci per permintaan
Saya menggunakan SSKeychain
perpustakaan untuk berinteraksi dengan gantungan kunci. Berikut cuplikannya.
#define SERVICE @"default"
@implementation SSKeychain (EXT)
+ (void)setValue:(NSString *)value forKey:(NSString *)key {
NSError *error = nil;
BOOL success = NO;
if (value) {
success = [self setPassword:value forService:SERVICE account:key error:&error];
} else {
success = [self deletePasswordForService:SERVICE account:key error:&error];
}
NSAssert(success, @"Unable to set keychain value %@ for key %@ error %@", value, key, error);
if (!success) {
LogError(@"Unable to set value to keychain %@", error);
}
LogTrace(@"Will set keychain account %@. is to nil? %d", key, value == nil);
if (value == nil)
LogWarn(@"Setting keychain %@ to nil!!!", key);
}
+ (NSString *)valueForKey:(NSString *)key {
NSError *error = nil;
NSString *value = [self passwordForService:SERVICE account:key error:&error];
if (error && error.code != errSecItemNotFound) {
NSAssert(!error, @"Unable to retrieve keychain value for key %@ error %@", key, error);
LogError(@"Unable to retrieve keychain value for key %@ error %@", key, error);
}
return value;
}
+ (BOOL)removeAllValues {
LogInfo(@"Completely Reseting Keychain");
return [[self accountsForService:SERVICE] all:^BOOL(NSDictionary *accountInfo) {
return [self deletePasswordForService:SERVICE account:accountInfo[@"acct"]];
}];
}
@end
Sebagian besar waktu itu baik-baik saja. Kadang-kadang saya akan mengalami kegagalan pernyataan di mana saya tidak dapat menulis atau membaca dari rantai kunci, menyebabkan kegagalan pernyataan kritis.
sumber
Jawaban:
Jawabannya di sini, dari Apple:
https://forums.developer.apple.com/thread/4743#14441
MEMPERBARUI
https://forums.developer.apple.com/thread/4743#126088
sumber
Pada dasarnya Anda harus membuat kode folder .xcttest Anda dengan menambahkan yang berikut ini sebagai skrip yang dijalankan di target pengujian Anda.
Saya mendapat banyak kesalahan -34018 saat menguji rantai kunci saya di perangkat dan ini berhasil memperbaikinya.
Jika masalah tidak ada pada target pengujian Anda, ini mungkin bukan solusinya.
sumber
Setelah memeriksa kode sumber . Saya perhatikan bahwa fitur rantai kunci diakses melalui daemon keamanan yang berjalan dalam prosesnya sendiri (terpisah dari proses aplikasi).
Aplikasi Anda dan proses keamanan 'berbicara' bersama melalui teknologi yang disebut XPC .
Jika perlu, securityd diluncurkan melalui perintah launchd terkenal oleh XPC. Anda mungkin bisa memeriksa apakah daemon berjalan di Aplikasi Monitor Aktivitas (jika berjalan di Simulator tentunya) dan bahwa proses induknya adalah launchd.
Dugaan saya di sini adalah mungkin karena alasan yang tidak diketahui daemon keamanan gagal untuk memulai atau melakukannya terlalu lambat dan tidak siap ketika Anda mencoba menggunakannya.
Mungkin Anda bisa memikirkan cara meluncurkan daemon terlebih dahulu.
Saya minta maaf karena tidak tepat. Saya harap ini dapat membantu Anda untuk melangkah lebih jauh dalam penyelidikan Anda.
sumber
Saya mengamati perilaku serupa setelah membuat dan menjalankan kode saya di Xcode 6 beta dengan iOS 8 SDK (berfungsi dengan benar dengan Xcode 5 / iOS 7). Di Xcode 6, di iOS Simulator SecItemCopyMatching selalu mengembalikan -34018. Ini mulai bekerja setelah menyalakan "Berbagi Keychain" di tab Kapabilitas.
Namun saya memiliki masalah lain. Saya sedang mengembangkan perpustakaan statis, yang digunakan oleh (antara lain) aplikasi Demo. Solusi di atas berfungsi untuk proyek aplikasi Demo, tetapi ketika saya mencoba untuk menguji unit proyek perpustakaan statis saya, saya memiliki kesalahan yang persis sama. Dan masalahnya adalah proyek perpustakaan statis saya tidak memiliki tab Kapabilitas (karena ini bukan aplikasi mandiri).
Saya sudah mencoba solusi yang diposting di sini oleh JorgeDeCorte, dengan kode yang ditandatangani di target pengujian, tetapi tidak berhasil untuk saya.
sumber
Coba nonaktifkan semua breakpoint saat meluncurkan aplikasi dari Xcode. Anda dapat mengaktifkannya setelahnya.
(Tidak ada solusi di atas yang berhasil untuk saya)
sumber
Saya baru saja mengalami masalah yang sama di simulator yang menjalankan 7.1 & 8.0. Saat melakukan penggalian, saya melihat bahwa aplikasi sampel Apple mengaktifkan Berbagi Rantai Kunci untuk kapabilitas targetnya. Saya mengaktifkannya untuk aplikasi saya yang mengakibatkan pembuatan file hak yang saya tinggalkan dengan nilai default dan sekarang saya tidak lagi mendapatkan kesalahan -34018. Ini tidak ideal tetapi saya akan menjalankan opsi berbagi KeyChain untuk saat ini.
sumber
Menandatangani kode bundel .xctest tidak semudah kedengarannya dalam beberapa kasus. Pada prinsipnya JorgeDeCorte benar dengan jawabannya bahwa garis pendek yang diberikan sebagai a
Run Script
sudah cukup untuk sebagian besar pengembang.Tetapi ketika Anda memiliki beberapa sertifikat di rantai kunci Anda, ini akan gagal dengan baris berikut
Solusi untuk mendapatkan sertifikat yang tepat bahkan dengan beberapa sertifikat adalah skrip singkat ini. Yang pasti ini tidak ideal, tetapi sepengetahuan saya, Anda tidak memiliki kesempatan untuk mendapatkan sertifikat yang ditemukan dan digunakan Xcode untuk menandatangani .app Anda.
sumber
Saya digigit oleh ini, juga dan tidak berhasil dengan solusi lainnya. Saya kemudian membersihkan profil penyediaan saya di perangkat itu sendiri dengan menghapus semuanya yang terkait dengan aplikasi saya serta semua profil wildcard (tampaknya inilah intinya). Untuk melakukan ini, buka Jendela "Perangkat" di Xcode dan klik kanan telepon Anda (terhubung):
Klik "Tampilkan profil penyediaan" dan hapus profil terkait, dan terutama profil tim:
termasuk yang bertanda bintang. Setelah menginstal ulang aplikasi, semuanya kembali normal.
sumber
Saya telah memperbaiki masalah ini (saya pikir). Saya memiliki profil penyediaan karakter pengganti di perangkat saya yang menunjukkan bahwa perangkat itu tidak memiliki identitas penandatanganan yang valid. Saya juga memiliki profil penyediaan untuk aplikasi saya yang valid. Ketika saya menghapus profil wildcard, saya berhenti mendapatkan kesalahan -34018.
Saya juga memastikan bahwa identitas penandatanganan kode dan profil penyediaan yang tercantum di bagian Penandatanganan Kode pada Pengaturan Build target identik dengan yang ada untuk aplikasi (bukan yang umum "Pengembang iPhone")
sumber
Saya sangat jarang mendapatkan kesalahan -34018 di aplikasi saya (iOS 8.4). Setelah beberapa penyelidikan, saya menemukan bahwa masalah ini terjadi ketika aplikasi meminta data dari rantai kunci terlalu sering .
Misalnya, dalam situasi saya, itu adalah dua permintaan baca untuk satu kunci tertentu pada saat yang sama dari modul aplikasi yang berbeda.
Untuk memperbaikinya saya baru saja menambahkan caching nilai ini ke dalam memori
sumber
Saya mengalami masalah yang sama, tiba-tiba, menjalankan perangkat uji dengan Xcode 6.2, iPhone 6, iOS 8.3. Untuk lebih jelasnya, ini tidak dialami saat menjalankan tes Xcode, melainkan saat menjalankan aplikasi sebenarnya di perangkat saya. Di simulator itu baik-baik saja, dan berjalan di aplikasi itu sendiri itu baik-baik saja sampai saat ini.
Saya mencoba semua saran yang dapat saya temukan di sini, seperti menghapus profil penyediaan di perangkat saya (saya menghapus SEMUAnya), untuk sementara mengaktifkan kemampuan Berbagi Rantai Kunci di proyek saya (meskipun kami tidak benar-benar membutuhkannya), membuat pasti akun pengembangan saya di Xcode benar-benar diperbarui dengan semua sertifikat dan profil penyediaan, dll. Tidak ada yang membantu.
Kemudian saya mengubah sementara tingkat aksesibilitas dari
kSecAttrAccessibleAfterFirstUnlock
menjadikSecAttrAccessibleAlwaysThisDeviceOnly
, menjalankan aplikasi, dan berfungsi dengan baik serta dapat menulis ke Keychain. Kemudian saya mengubahnya kembali menjadikSecAttrAccessibleAfterFirstUnlock
, dan masalahnya tampaknya telah hilang "secara permanen".sumber
Baru saja digigit oleh bug ini di Xcode 8 Beta 3. Mengaktifkan Berbagi Keychain tampaknya menjadi satu-satunya solusi.
sumber
Saya memiliki masalah yang sama. Perbaiki dengan mengatur Berbagi Keychain.
sumber
(ini bukan jawaban langsung untuk pertanyaan OP, tetapi dapat membantu orang lain)
Mulai mendapatkan kesalahan rantai kunci -34018 secara konsisten di simulator setelah memperbarui Xcode dari versi 7.3.1 ke 8.0.
Mengikuti tip dari jawaban daidai ini ,
ditemukan bahwa Profil Penyediaan entah bagaimana telah disetel ke Tidak Ada di bagian Penandatanganan target.
Namun, pengaturan bidang Profil Penyediaan ke nilai yang valid tidak cukup untuk menyelesaikan masalah dalam kasus ini.
Investigasi lebih lanjut menunjukkan bahwa hak Notifikasi Push juga menunjukkan kesalahan. Dikatakan "Tambahkan fitur Pemberitahuan Push ke ID Aplikasi Anda." Langkahnya telah diselesaikan, tetapi langkah "Tambahkan hak Pemberitahuan Push ke file hak Anda" tidak.
Setelah menekan "Perbaiki Masalah" untuk memperbaiki masalah Pemberitahuan Push, kesalahan rantai kunci telah diatasi.
Untuk target khusus ini, hak "Berbagi Rantai Kunci" telah diaktifkan di beberapa waktu sebelumnya. Mematikannya tidak menyebabkan kesalahan rantai kunci muncul kembali sejauh ini, jadi tidak jelas apakah itu perlu dalam kasus ini.
sumber
Di iOS 9 saya mematikan Address Sanitizer dan itu mulai berfungsi pada perangkat.
sumber
Satu-satunya solusi yang berhasil untuk saya adalah pertama-tama menyimpan nol untuk kunci yang ditentukan, dan kemudian menyimpan nilai baru saya dengan operasi terpisah. Ini akan gagal karena kesalahan -34018 jika saya mencoba menimpa nilai yang ada. Tetapi selama saya menyimpan nihil terlebih dahulu, maka nilai yang diperbarui akan berhasil disimpan segera setelahnya.
sumber
Saya menemui masalah -34018 ini hari ini ketika menjalankan SecItemDelete API. Apa yang saya lakukan untuk memperbaikinya adalah: 1. Mengikuti solusi @ k1th https://stackoverflow.com/a/33085955/889892 2. Jalankan SecItemDelete di utas utama (Sebelumnya dibaca dari utas utama, jadi sejajarkan ini dengan menghapus) .
Maaf kembali lagi :(
sumber
Aktifkan berbagi rantai kunci dalam kapabilitas proyek Anda, itu akan menyelesaikan masalah.
sumber
Apa yang berhasil untuk saya
sumber
Bagi saya itu adalah masalah penandatanganan aplikasi. Saya hanya beralih ke tim penandatanganan yang benar di Xcode dan kesalahan tidak lagi terjadi
sumber