SecItemAdd dan SecItemCopyMatching mengembalikan kode kesalahan -34018 (errSecMissingEntitlement)

116

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 SSKeychainperpustakaan 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.

Tony
sumber
saya memiliki masalah yang sama dan tidak dapat mereproduksinya ... Saya menggunakan kelas KeychainItemWrapper dari Apple. Terkadang macet dari Google Analytics dengan pesan kesalahan yang sama. Saya menggunakan Google Analytics v3.02.
Joey
Juga, tampaknya OK di aplikasi dari AppStore. itu hanya terjadi dalam aplikasi versi pengembangan.
Joey
2
Saya memiliki crashlytics untuk versi app store dan sayangnya hal itu juga terjadi di toko aplikasi, meskipun lebih jarang daripada di dev: /
Tony
3
Saya berpikir untuk beralih dari rantai kunci karena fakta bahwa data yang disimpan di rantai kunci dapat hilang secara acak seperti ini merupakan kesalahan fatal bagi aplikasi.
Tony
2
Kami juga melihat masalah yang terputus-putus ini. Kami memunculkan pengecualian saat kami mendapatkan rc yang tidak terduga dari secItemCopyMatching termasuk kasus -34018. Kami mencoba (dengan enggan) menambahkan mekanisme di mana, setelah kami mendapatkan nilai yang kami butuhkan dari rantai kunci, kami menyimpannya dalam cache dalam memori aplikasi dan kemudian menyajikannya dari sana tanpa akses rantai kunci. Tapi sekarang kami melihat kejadian langka di mana akses rantai kunci untuk mendapatkannya gagal dengan -34018. Adakah yang mencoba mencoba kembali operasi setelah -34018?
Chris Markle

Jawaban:

45

Perbaikan iOS 10 / XCode 8:

Tambahkan Kepemilikan Rantai Kunci, Buka pengaturan proyek-> Kemampuan-> Berbagi Rantai Kunci-> Tambahkan Grup Rantai Kunci + Nyalakan

Jawabannya di sini, dari Apple:

UPDATE: Kami akhirnya dapat mereproduksi kesalahan -34018 di iOS 8.3. Ini adalah langkah pertama dalam mengidentifikasi akar penyebab dan kemudian mencari solusi.

Seperti biasa, kami tidak dapat berkomitmen pada jangka waktu rilis, tetapi hal ini telah memengaruhi banyak pengembang dan kami benar-benar ingin menyelesaikannya.

Sebelumnya saya menyarankan untuk menambahkan penundaan kecil dalam application: didFinishLaunchingWithOptions dan applicationDidBecomeActive: sebelum mengakses rantai kunci sebagai solusi. Namun, tampaknya itu tidak membantu. Artinya, tidak ada solusi yang diketahui saat ini selain meluncurkan kembali aplikasi.

Masalahnya tampaknya terkait dengan tekanan memori, jadi mungkin bersikap lebih agresif dalam menangani peringatan memori dapat mengurangi masalah tersebut

https://forums.developer.apple.com/thread/4743#14441

MEMPERBARUI

Oke, ini yang terbaru.
Ini adalah masalah kompleks dengan beberapa kemungkinan penyebab:

  • Beberapa contoh masalah disebabkan oleh penandatanganan aplikasi yang salah. Anda dapat dengan mudah membedakan kasus ini karena masalahnya 100% dapat direkonstruksi.
  • Beberapa contoh masalah disebabkan oleh bug dalam cara iOS mendukung pengembangan aplikasi (r. 23.991.853). Debugging ini diperumit oleh fakta bahwa bug lain di OS (r. 23.770.418) menutupi efeknya, yang berarti masalah hanya muncul ketika perangkat berada di bawah tekanan memori. Kami yakin masalah ini telah diselesaikan di iOS 9.3.
  • Kami menduga bahwa mungkin masih ada penyebab lain dari masalah ini.

Jadi, jika Anda melihat masalah ini pada perangkat pengguna (yang belum pernah dibicarakan oleh Xcode) yang menjalankan iOS 9.3 atau yang lebih baru, harap ajukan laporan bug tentangnya. Cobalah untuk memasukkan log sistem perangkat dalam laporan bug Anda (saya menyadari itu bisa rumit saat berurusan dengan perangkat pelanggan; salah satu pilihan adalah meminta pelanggan untuk menginstal Apple Configurator, yang memungkinkan mereka melihat log sistem). Dan jika Anda melaporkan bug, silakan posting nomor bug Anda, hanya sebagai catatan.

Atas nama Apple, saya ingin berterima kasih kepada semua orang atas upaya mereka membantu melacak masalah yang agak mengerikan ini. Bagikan dan Nikmati

https://forums.developer.apple.com/thread/4743#126088

daidai
sumber
2
Masalah ini masih terjadi di iOS 9.2, iPhone 5S.
DevGansta
1
Sepertinya iOS 9.3 akan menyelesaikan masalah ini sesuai dengan tanggapan terbaru dari Apple di utas yang Anda tautkan. @daidai, dapatkah Anda memperbarui jawaban Anda dengan informasi baru ini?
jf
1
@YoonLee juga melihat ini dengan iOS10 - juga menggunakan SDK 2.4.8 AWS. Kesalahan dipicu di AWSClientContext.m baris 54. Adakah yang berhasil menyelesaikan ini?
CharlesA
1
@YoonLee btw, baru saja menyelesaikan ini menggunakan salah satu jawaban di bawah ini: 'Berbagi Gantungan Kunci diaktifkan untuk kemampuan target'
CharlesA
1
@CharlesA Ya, saya menyelesaikannya pada hari itu. Kamu benar. Tampaknya 'KeyChain Entitlement on' memperbaiki masalah. Anehnya, kesalahan ini tidak selalu memicu. Ngomong-ngomong, sekarang saya menyalakan ini.
Yoon Lee
25

Pada dasarnya Anda harus membuat kode folder .xcttest Anda dengan menambahkan yang berikut ini sebagai skrip yang dijalankan di target pengujian Anda.

codesign --verify --force --sign "$CODE_SIGN_IDENTITY" "$CODESIGNING_FOLDER_PATH"

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.

JorgeDeCorte
sumber
Mengonfirmasi ini memperbaikinya di lingkungan pengujian. Saya harus menambahkan skrip run ke target pengujian yang sebenarnya (mis. Yang w / semua pengujian unit, bukan target build yang berjalan pada perangkat). Juga dikonfirmasi bahwa ini hanya masalah pada perangkat, bukan pada simulator.
dirampok
2
Saya mendapatkan ": tidak ada identitas yang ditemukan Command / bin / sh gagal dengan kode keluar 1" ketika saya melakukan ini? Sepertinya saya tidak memiliki $ CODE_SIGN_IDENTITY. Tahu bagaimana saya memperbaikinya?
Daniel Coffman
1
@DanielCoffman, Anda harus pergi ke pengaturan target Anda dan di Code Signing Identity pilih "iOS Developer" (atau identitas valid lainnya). Ini memperbaiki kesalahan build, namun setidaknya bagi saya itu tidak memperbaiki masalah Keychain. Saya masih mendapatkan kode kesalahan -34018.
Marcin
3
Terima kasih Marcin. Saya mulai mendapatkan kesalahan ini ketika saya beralih ke xcode 6 beta. Tidak ada saran di utas ini yang diselesaikan. Dikembalikan ke xcode 5 dan -34018 tidak lagi terjadi.
Daniel Coffman
Saya juga mengalami kesalahan ini untuk pertama kalinya sejak saya menggunakan XCode 6.3.
Vladimír Slavík
13

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.

Vincent Zgueb
sumber
2
Saya mendapatkan masalah ini hanya ketika aplikasi saya dibuka kembali melalui tautan dalam dengan metode delegasi aplikasi berikut: - (BOOL) application: (UIApplication *) application handleOpenURL: (NSURL *) url. Jika saya baru memulai aplikasi, penulisan rantai kunci berfungsi, dan jika saya meminimalkan dan memaksimalkan aplikasi, itu masih berfungsi. Hanya ketika saya membuka kembali dengan tautan dalam, masalah ini terjadi. Saya memiliki MyApp.entitlements yang dikonfigurasi dalam proyek saya (Berbagi Keychain di tab Capabilities) Xcode 7 beta 4.
FranticRock
Kasing saya mirip dengan Alex, yang hanya terjadi jika aplikasinya ditautkan dalam. Jika tidak, itu akan berjalan dengan baik. Mungkin ada beberapa konteks yang tidak tepat saat aplikasi dibuka dari aplikasi lain.
CodeBrew
12

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.

Marcin
sumber
8
Dan kembali ke iOS 8 beta 3 :)
Mustafa
7
Dan kembali ke iOS 9.0
Alex Stone
4
Dan sekarang kembali ke iOS 9.2 :-(
Vamos
4
Kembali di iOS 10 beta 2
Pranjal Bikash Das
3
Dan kembali ke iOS 10 beta 5
Pascal
6

Coba nonaktifkan semua breakpoint saat meluncurkan aplikasi dari Xcode. Anda dapat mengaktifkannya setelahnya.

(Tidak ada solusi di atas yang berhasil untuk saya)

HeTzi
sumber
Aneh. Tampaknya memperbaiki masalah ini untuk saya juga! Setiap kali saya mulai men-debug pada simulator, saya dapat mengalami -34018 OSStatus.
midori
4

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.

Laurent
sumber
4

Menandatangani kode bundel .xctest tidak semudah kedengarannya dalam beberapa kasus. Pada prinsipnya JorgeDeCorte benar dengan jawabannya bahwa garis pendek yang diberikan sebagai a Run Scriptsudah cukup untuk sebagian besar pengembang.

codesign --verify --force --sign "$CODE_SIGN_IDENTITY" "$CODESIGNING_FOLDER_PATH"

Tetapi ketika Anda memiliki beberapa sertifikat di rantai kunci Anda, ini akan gagal dengan baris berikut

iPhone Developer: ambiguous (matches "iPhone Developer: Your Name (ABC123DEF45)" and "iPhone Developer: Your Name (123ABC456DE)"

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.

echo "codesign --verify --force --sign \"$CODE_SIGN_IDENTITY\" \"$CODESIGNING_FOLDER_PATH\""
IDENTITIES=`security find-identity -v -s "Code Signing" | grep "iPhone Developer" | awk '{ print $2 }'`

for SHA in $IDENTITIES; do
    codesign --verify --force --sign $SHA "$CODESIGNING_FOLDER_PATH"
    if [ $? -eq 0 ]; then
        echo "Matching identity found: $SHA"
        exit 0
    fi
done;

exit 1
Patrik
sumber
4

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.

k1th
sumber
Ini membantu saya menjalankan aplikasi dari Xcode dan melanjutkan proses pengembangan.
salabaha
Saat membuat rilis AdHoc, Anda dapat memeriksa PP mana yang digunakan. jika Anda melihat profil XC: apa pun, hapus itu, dan segarkan PP Anda!
dogsgod
Saya bisa melihat bagaimana ini bisa menjadi faktor. Berantakan sekali !! Melakukan pembersihan jatuh
David
3

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

Dave Hirsch
sumber
Mirip dengan ini memperbaikinya untuk saya. Setel penandatanganan kode tingkat proyek ke "Pengembang iPhone" untuk Debug dan "Distribusi iPhone" untuk Rilis. Saya kemudian menghapus timpaan pada target utama sehingga mereka menunjukkan hal yang sama. Sebelumnya, menyimpan di rantai kunci gagal 100%. Setelah itu, penyimpanan di keychain tampaknya stabil.
jowie
2

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

somedev
sumber
1

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 kSecAttrAccessibleAfterFirstUnlockmenjadi kSecAttrAccessibleAlwaysThisDeviceOnly, menjalankan aplikasi, dan berfungsi dengan baik serta dapat menulis ke Keychain. Kemudian saya mengubahnya kembali menjadi kSecAttrAccessibleAfterFirstUnlock, dan masalahnya tampaknya telah hilang "secara permanen".

Mason G. Zhwiti
sumber
1

Baru saja digigit oleh bug ini di Xcode 8 Beta 3. Mengaktifkan Berbagi Keychain tampaknya menjadi satu-satunya solusi.

XCool
sumber
1

Saya memiliki masalah yang sama. Perbaiki dengan mengatur Berbagi Keychain.

lumenela.dll
sumber
1

(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 ,

Beberapa contoh masalah disebabkan oleh penandatanganan aplikasi yang salah. Anda dapat dengan mudah membedakan kasus ini karena masalahnya 100% dapat direkonstruksi.

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.

jk7
sumber
0

Di iOS 9 saya mematikan Address Sanitizer dan itu mulai berfungsi pada perangkat.

pulse4life
sumber
0

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.

FranticRock
sumber
0

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 :(

Senry
sumber
0

Aktifkan berbagi rantai kunci dalam kapabilitas proyek Anda, itu akan menyelesaikan masalah. masukkan deskripsi gambar di sini

Rizwan Ahmed
sumber
0

Apa yang berhasil untuk saya

  • Aktifkan Berbagi Rantai Kunci.
  • Gunakan keychain sesedikit mungkin dan simpan data dalam cache, UserPreferences, disk, dll.
  • Ulangi berkali-kali operasi CRUD rantai kunci jika gagal.
  • Gunakan DispatchQueue.sync untuk menyimpan / menghapus / memperbarui data.
rockdaswift
sumber
0

Bagi saya itu adalah masalah penandatanganan aplikasi. Saya hanya beralih ke tim penandatanganan yang benar di Xcode dan kesalahan tidak lagi terjadi

Adam Smith
sumber