SecItemAdd, iOS 10 simülatöründe Xcode 8'de her zaman -34018 hatası döndürür


103

Güncelleme : Bu sorun Xcode 8.2'de düzeltilmiştir. Anahtarlık, simülatörde, anahtar zinciri paylaşımını etkinleştirmeden çalışır.

Xcode 8 / iOS 10 simülatöründe işlevi çağırırken neden her zaman -34018 hatası alıyorum ?SecItemAdd

Yeniden Üretme Adımları

Xcode 8'de yeni bir Tek sayfalı iOS uygulama projesi oluşturun. Aşağıdaki kodu içinde çalıştırın viewDidLoad(veya bu Xcode projesini açın ).

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

Beklenen sonuçlar

Öğe, Anahtar Zincirine eklenir.

Fiili sonuç

Fonksiyon SecItemAdd aşağıdaki hata kodunu döndürür: -34018.

Sürüm

Xcode sürüm 8.1 (8B62), macOS Sierra 10.12.1.

Yapılandırma

Bir iOS 10 simülatöründe test yaparken Beta 2'den beri her zaman Xcode 8'de gerçekleşir.

Bir iOS 9.3 simülatöründe test yaparken Xcode 8'de OLUŞMAZ.

Demo

https://dl.dropboxusercontent.com/u/11143285/2016/07/KeychainBugDemo.zip

Referanslar

Radar: https://openradar.appspot.com/27422249

Apple Geliştirici Forumları: https://forums.developer.apple.com/message/179846

Bu sorun, Xcode 8'de tutarlı bir şekilde meydana geldiğinden aşağıdaki gönderiden farklıdır . SecItemAdd ve SecItemCopyMatching, -34018 hata kodunu döndürüyor (errSecMissingEntitlement)


8
Bu hala Xcode 8 GM'de bir sorun olarak görünüyor. Güzel Elma ... onların oyun üstünde hala görmek için
Nicholas Harlen

1
benim için aynı, hala bu hata
Kostiantyn Koval

Konsol günlüklerinizi gerçekten
araştırıyorum

Sorun Xcode 8.2'de düzeltildi, ancak Xcode 9.0'da geri döndü!
Adil Hussain

Yanıtlar:


183

Uygulamamda ekleyerek bu sorunu çözmeyi başardım Yetkilendirmeler dosyasına Anahtar Zinciri Erişim Grupları sorunu çözmeyi . Test uygulamanızın Yetenekler bölümünde Anahtar Zinciri Paylaşımı anahtarını açtım ve benim için de çalışıyor.

Anahtarı açmanın ekran görüntüsü

Yetkilere eklenecek öğe:

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

Bunu yalnızca macOS Sierra (10.12) üzerinde denedim, bu yüzden 10.11.5'te sizin için çalışıp çalışmayacağından emin değilim.


Aynı burada, yalnızca şu anda Xcode 8 beta 5 kullanıyorum (iOS 10 simülatörü ile. Sorun önceki beta ile görünmüyordu. Ayrıca gerçek bir iOS 9 iPhone üzerinde 8b5 ile test ederken de olmuyor). Yeteneklerdeki Push Bildirimlerinin düzeltilmesi gerektiğini (yani düğmeye basılması) ve aynı zamanda ne yazık ki Anahtar Zinciri Paylaşımını açtığını fark ettim. Ardından uygulama artık hatayı almadı. Anahtar Zinciri Paylaşımı'nı tekrar kapattıktan sonra hala çalışıyor!
Stefan

2
Anahtar zincirini bir test hedefi kullanıyorum ve başarısız oluyor - bunu nasıl aşabilirim? (Test hedeflerinde yetenek olmadığından)
Sam Jarman

1
@SamJarman Ben de bu problemi yaşadım. Test hedefi için yapı ayarlarına girdim ve yetkiler alanının ayarını kaldırdım. Ondan sonra iyi çalıştı.
Jordan Bondo

3
Bu çözüm, Uygulama Hedefleri için iyi çalışıyor. Ne yazık ki, artık hata nedeniyle oluşmayan KeychainSwift'i kullanan bir Swift çerçevesi üzerinde çalışıyorum . Çerçeve hedefinde, afaik bir yetki dosyası ekleyemiyorum. Bu vaka için bir geçici çözüm bilen var mı?
Jan Nash

5
@JanNash, işte test çalışmasını nasıl başardım evgenii.com/blog/testing-a-keychain-library-in-xcode
Evgenii

17

In Xcode 8.1 GM Sürüm Notları Elma sorunu kabul etti ve daha temiz bir geçici çözüm önerdi:

Yetkilendirmeler dosyanız uygulama tanımlayıcı yetkisi için bir değer içermiyorsa Anahtar Zinciri API'leri Simülatörde çalışmayabilir. (28338972) Çözüm: ENTITLEMENTS_REQUIRED adlı hedefinize kullanıcı tanımlı bir yapı ayarı ekleyin ve değeri YES olarak ayarlayın. Bu, Xcode'un derleme sırasında otomatik olarak bir uygulama tanımlayıcı yetkisi eklemesine neden olur.

Denediğim şeyden sadece Xcode 8.1'de çalıştığını unutmayın. Metin sizi yanıltarak bir yapı ayarına yönlendirebilir, ancak yapmanız gereken, bunu düzeninizde Ortam Değişkenlerinize eklemektir.

görüntü açıklamasını buraya girin

Xcode 8.2 bunu çözecektir:

Xcode 8.2 beta'da çözüldü - IDE Anahtar Zinciri API'leri Simulator'da düzgün çalışıyor. (28338972)


1
@Tiago Sürüm notlarından alınan bu geçici çözüm, iOS 10.1 simülatöründe Xcode 8.1'de sizin için hala çalışıyor mu? Bu ayarı eklemeyi denedim (hem hedefte Kullanıcı Tanımlı ayar olarak hem de şemada Ortam Değişkeni olarak) ve iOS 10.1 simülatörlerinde çalışırken hala -34018 dönüş değerini alıyorum.
guywithmazda

3
@guywithmazda, burada da aynı. Hala -34018 alıyorum ve hem kurulum ayarlarını hem de ortam değişkenlerini denedim.
keithbhunter

Benim için çalışmıyor, ne yapı ayarlarında ne de Sierra'daki Xcode 8.1 (8B62) 'de bir planın çevresel değişkeni olarak. Bir şey mi kaçırıyorum?
Evgenii

4
Xcode 8.2.1 kullanıyorum ve bu sorun hala yeniden üretilebilir. Ayrıca sorum, ana uygulamam yoksa ve Çerçeve hedefini oluşturuyorsam, bu sorunu nasıl çözebilirim?
DShah

2
Bu sorun, Çerçeve hedefleri için birim testlerini etkilemeye devam eder, çünkü bu durumda, yetkilendirmeye ihtiyaç duyan test ana bilgisayar saplaması olacaktır. Sorunun farkındayız, ancak sizin için bir engelleyici ise lütfen yinelenen bir hata bildirin.
russbishop

10

Bu, ana uygulama uygulaması olmayan bir test hedefiniz varsa gerçekleşebilir. Düzeltmek

  1. sahte bir ana bilgisayar uygulaması ekleyin: görüntü açıklamasını buraya girin

  2. Otomatik kod imzalamayı etkinleştirin ve bir ekip ekleyin:

görüntü açıklamasını buraya girin

  1. Yeteneklerde anahtar zinciri paylaşımını etkinleştirin

görüntü açıklamasını buraya girin


5

E-posta ile imzalarken, yeni bir kullanıcı oluştururken veya firebase kullanarak oturumu kapatırken bir hata aldım.

Hata şuydu:

firauth hata alan kodu 17995

Test uygulamanızın Yetenekler bölümünde Anahtar Zinciri Paylaşımı anahtarını açtım ve benim için de çalışıyor.


4

Aradığım özellik bu olmadığı için Anahtar Zinciri paylaşımını kullanmayan bir çözüm arıyordum. Geliştirici forumu , EvergreenCoder'den, kapsamı yalnızca iOS 10 simülatörüyle sınırlayabileceğiniz iyi bir çalışmaya sahip gibi görünüyor (çünkü bu, etkilenen tek simülatör gibi görünüyor). Gönderiden:

Sorun, Xcode'un yerleşik uygulamaya "uygulama tanımlayıcı" girişini düzgün bir şekilde ekleyebilmesi için en az bir yetki olması gerektiği gibi görünüyor. Anahtar zinciri paylaşımının bir çözüm gibi görünmesinin nedeni budur, ancak yalnızca dolaylı olarak böyledir: diğer herhangi bir yetki iyi çalışıyor gibi görünüyor.

Böyle bir şey oluşturabilirsiniz .plist:

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

ve şu dosyadaki Yapı Ayarları altında bu dosyaya bir yol sağlayın

Code Signing->Debug->Simulater iOS 10 SDK->($SRCROOT)/your-path-to-file

Gönderide belirtildiği gibi, bu yetki yalnızca hata ayıklayıcının eklenmesine izin verir.


1

Cihazda çalıştırmaya çalışırken -34018 hatası alsam da benzer bir sorun yaşadım. Sierra'da iOS 10.1 ile XCode 8.1 kullanıyorum. Bir ekipte çalışıyorum ve proje ayarlarında "İmzalamayı otomatik olarak yönet" seçeneğine geçtiğimizde aniden bu sorunu yaşadım. Bunu kapattığımda ve profilimi manuel olarak seçtiğimde, her şey yolunda gidiyor. Geliştirici sertifikamı anahtar zincirimden silmek zorunda kaldım, ardından "İmzalamayı otomatik olarak yönet" i yeniden seçtim. Bir sonraki yapıda benim için yeni bir imza sertifikası oluşturdu ve şimdi her şey yolunda gidiyor. Diğer sertifika manuel olarak seçildiğinde iyi çalıştığı için soruna neyin neden olduğundan hala emin değilim, ancak XCode tarafından yönetilirken değil. Umarım bu, başkası için bir saat süren baş ağrısını durdurmaya yardımcı olur.


1

Bu sorunu Xcode 11'de herhangi bir yetkilendirme ayarlaması yapmadan çözebildim.

Çerçevemin MyFrameworkTestsHostApp adlı projesine yeni bir uygulama hedefi ekledim.

Sonra MyFrameworkTests hedefini seçtim ve Host Uygulamasını MyFrameworkTestsHostApp olarak seçtim.


0

Yeteneklerde anahtar zinciri paylaşımını etkinleştirdikten sonra çalışır.


0

Bu sorunu hızlı bir şekilde çözmek için atmanız gereken 3 adım var.

  1. Proje yeteneklerinizde Anahtar zinciri paylaşımını açın.
  2. Bir profille Otomatik Temel Hazırlığı seçin
  3. Özel yetki seçeneğinizin Entitlement.plist olarak ayarlandığından emin olun.

Bu sihri yapacak

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.