IOS 10 सिम्युलेटर में Xcode 8 में SecItemAdd हमेशा त्रुटि -34018 लौटाता है


103

अद्यतन : यह मुद्दा Xcode 8.2 में तय किया गया है। किचेन शेयरिंग को सक्षम किए बिना सिम्युलेटर में काम करता है।

Xcode 8 / iOS 10 सिम्युलेटर में फ़ंक्शन को कॉल करने पर मुझे हमेशा त्रुटि -34018 क्यों प्राप्त होती है ?SecItemAdd

प्रजनन करने कि प्रक्रिया

Xcode 8. में एक नया सिंगल पेज iOS ऐप प्रोजेक्ट बनाएं। निम्न कोड को viewDidLoad(या इस 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.")
}

अपेक्षित परिणाम

आइटम किचेन में जोड़ा जाता है।

वास्तविक परिणाम

फ़ंक्शन SecItemAdd निम्न त्रुटि कोड लौटाता है -34018:।

संस्करण

Xcode संस्करण 8.1 (8B62), macOS सिएरा 10.12.1।

विन्यास

हमेशा आईओएस 10 सिम्युलेटर में परीक्षण करते समय बीटा 2 के बाद से हमेशा Xcode 8 में होता है।

IOS 9.3 सिम्युलेटर में परीक्षण करते समय Xcode 8 में नहीं होता है।

डेमो

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

संदर्भ

रडार: https://openradar.appspot.com/27422249

Apple डेवलपर फ़ोरम: https://forums.developer.apple.com/message/179846

यह समस्या निम्न पोस्ट से भिन्न है क्योंकि यह लगातार Xcode 8 में होती है । SecItemAdd और SecItemCopyMatching रिटर्न त्रुटि कोड -34018 (इरेटेकमिसिंगईंटिफिलमेंट)


8
यह अभी भी Xcode 8 GM में एक मुद्दा प्रतीत होता है। अच्छा लगा कि Apple अभी भी अपने खेल में शीर्ष पर है ...
निकोलस हार्लेन

1
मेरे लिए भी यही, अभी भी यह त्रुटि है
कोस्टिएन्टिन कोवल

मैं वास्तव में आपके सांत्वना लॉग खोद रहा हूँ :-)
निकोलस मिआरी

मुद्दा Xcode 8.2 में तय किया गया था, लेकिन यह Xcode 9.0 में वापस आ गया है!
आदिल हुसैन

जवाबों:


183

मैं अपने ऐप में कीचेन एक्सेस ग्रुप्स को एंटाइटेलमेंट फ़ाइल में जोड़कर इसके चारों ओर काम करने में सक्षम था । मैंने आपके परीक्षण एप्लिकेशन में क्षमता अनुभाग में कीचेन साझाकरण स्विच चालू किया , और यह मेरे लिए भी काम कर रहा है।

स्विच को चालू करने का स्क्रीनशॉट

एंटाइटेलमेंट में जोड़ने के लिए आइटम:

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

मैंने केवल macOS Sierra (10.12) पर यह कोशिश की है, इसलिए मुझे यकीन नहीं है कि यह आपके लिए 10.11.5 पर काम करेगा।


यहाँ भी, केवल यह कि मैं Xcode 8 बीटा 5 का उपयोग कर रहा हूँ वर्तमान में (iOS 10 सिम्युलेटर के साथ। समस्या पिछले बीटा के साथ दिखाई नहीं देती है। यह तब भी नहीं होता है जब वास्तविक iOS 9 iPhone पर 8b5 के साथ परीक्षण किया जाता है)। मैंने देखा कि क्षमताओं में पुश सूचनाओं को ठीक करने (यानी बटन दबाने) की आवश्यकता थी और साथ ही किचेन को साझा करना, दुर्भाग्य से उसी समय। तब एप्लिकेशन को त्रुटि नहीं मिली। किचेन शेयरिंग को फिर से बंद करने के बाद , यह अभी भी काम करता है!
स्टीफन

2
मैं किचेन का परीक्षण लक्ष्य का उपयोग करता हूं और यह विफल हो जाता है - मैं इसके आसपास कैसे पहुंचूंगा? (चूंकि परीक्षण के लक्ष्यों में कोई क्षमता नहीं है)
सैम जर्मन

1
@SamJarman मुझे भी यह समस्या थी। मैं सिर्फ परीक्षण लक्ष्य के लिए बिल्ड सेटिंग्स में गया और एंटाइटेलमेंट फ़ील्ड को अन-सेट किया। उसके बाद ठीक काम किया।
जॉर्डन बॉन्डो

3
यह समाधान ऐप लक्ष्य के लिए अच्छी तरह से काम करता है। दुर्भाग्य से, मैं एक स्विफ्ट ढांचे पर काम कर रहा हूं जो कि किचिनशिफ्ट का उपयोग करता है जो त्रुटि के कारण अब और नहीं बनाता है। एक फ्रेमवर्क लक्ष्य में, मैं एक एंटाइटेलमेंट फ़ाइल afaik नहीं जोड़ सकता। किसी को भी इस मामले के लिए एक समाधान पता है?
जाॅन नैश

5
@JanNash, यहां बताया गया है कि कैसे मैं परीक्षण का काम evgenii.com/blog/testing-a-keychain-library-in-xcode
Evgenii

17

में Xcode 8.1 जीएम रिलीज नोट्स एप्पल समस्या को स्वीकार किया और एक क्लीनर समाधान का सुझाव दिया:

यदि आपकी एंटाइटेलमेंट फ़ाइल में एप्लिकेशन-पहचानकर्ता एंटाइटेलमेंट का मान नहीं है, तो किचेन एपीआई सिम्युलेटर में काम करने में विफल हो सकता है। (28338972) समाधान: ENTITLEMENTS_REQUIRED नामक अपने लक्ष्य के लिए उपयोगकर्ता-निर्धारित बिल्ड सेटिंग जोड़ें और मान को हां में सेट करें। यह Xcode का कारण बनते समय एप्लिकेशन-पहचानकर्ता एंटाइटेलमेंट को स्वचालित रूप से सम्मिलित करेगा।

ध्यान दें कि मैंने जो भी प्रयास किया है, वह केवल Xcode 8.1 में काम करता है। यद्यपि पाठ आपको एक निर्माण सेटिंग में गुमराह कर सकता है, लेकिन आपको अपनी योजना में पर्यावरण वेरिएबल्स को जोड़ने की आवश्यकता है।

यहां छवि विवरण दर्ज करें

Xcode 8.2 इसे हल करेगा:

Xcode 8.2 बीटा में हल - IDE किचेन एपीआई सिम्युलेटर में सही ढंग से काम करते हैं। (28338972)


1
@Tiago क्या iOS 10.1 सिम्युलेटर पर Xcode 8.1 में अभी भी आपके लिए काम कर रहे रिलीज नोटों में से यह बदलाव है? मैंने इस सेटिंग को जोड़ने की कोशिश की है (दोनों लक्ष्य पर एक यूज़र-डिफ़ाइंड सेटिंग के रूप में, और इस योजना में एक पर्यावरण चर के रूप में), और आईओएस 10.1 सिमुलेटर पर चलने पर मुझे अभी भी -34018 रिटर्न वैल्यू मिलती है।
manwithmazda

3
@guywithmazda, यहाँ भी ऐसा ही है। अभी भी -34018 हो रहा है और दोनों सेटिंग्स और पर्यावरण चर बनाने की कोशिश की।
21

सिएरा पर Xcode 8.1 (8B62) में न तो बिल्ड सेटिंग्स में और न ही योजना के पर्यावरण चर के रूप में मेरे लिए काम करता है। क्या मैं कुछ भूल रहा हूँ?
Evgenii

4
मैं Xcode 8.2.1 का उपयोग कर रहा हूं और यह मुद्दा अभी भी प्रतिलिपि प्रस्तुत करने योग्य है। इसके अलावा, मेरा सवाल यह है कि अगर मेरे पास होस्ट ऐप नहीं है, और मैं फ्रेमवर्क लक्ष्य बना रहा हूं, तो इस मुद्दे को कैसे हल करें?
DShah

2
यह समस्या अभी भी फ्रेमवर्क लक्ष्य के लिए यूनिट परीक्षणों को प्रभावित करती है क्योंकि इस मामले में यह टेस्ट होस्ट स्टब होगा जिसे एंटाइटेलमेंट की आवश्यकता है। हम इस मुद्दे से अवगत हैं, लेकिन अगर यह आपके लिए अवरोधक है तो कृपया डुप्लिकेट बग दर्ज करें।
रूसबोप

10

यह तब हो सकता है जब आपके पास एक परीक्षण लक्ष्य होता है जिसमें एक मेजबान ऐप नहीं होता है। तै होना

  1. डमी होस्ट एप्लिकेशन जोड़ें: यहां छवि विवरण दर्ज करें

  2. स्वचालित कोड हस्ताक्षर सक्षम करें और एक टीम जोड़ें:

यहां छवि विवरण दर्ज करें

  1. क्षमताओं में किचेन शेयरिंग सक्षम करें

यहां छवि विवरण दर्ज करें


5

मुझे ईमेल के साथ साइन इन करते समय, एक नया उपयोगकर्ता बनाने या फायरबेस का उपयोग करके साइन आउट करने में त्रुटि हुई।

त्रुटि थी:

firauth त्रुटि डोमेन कोड 17995

मैंने आपके परीक्षण एप्लिकेशन में क्षमता अनुभाग में कीचेन साझाकरण स्विच चालू किया, और यह मेरे लिए भी काम कर रहा है।


4

मैं एक ऐसे समाधान की तलाश में था जो किचेन के बंटवारे का उपयोग नहीं करता था, क्योंकि वह वह विशेषता नहीं थी जिसकी मुझे तलाश थी। डेवलपर फोरम एवरग्रीनकोडर से एक अच्छा काम करने के लिए लगता है कि आप केवल आईओएस 10 सिम्युलेटर के दायरे में सीमित कर सकते हैं (जैसा कि यह केवल प्रभावित सिम्युलेटर लगता है)। पोस्ट से:

समस्या यह है कि Xcode के लिए कम से कम एक एंटाइटेलमेंट होना चाहिए ताकि अंतर्निहित एप्लिकेशन में "एप्लिकेशन-आइडेंटिफायर" एंटिलीमेंट को ठीक से जोड़ सके। यही कारण है कि किचेन साझाकरण एक समाधान प्रतीत होता है, लेकिन यह केवल अप्रत्यक्ष रूप से ऐसा है: किसी भी अन्य पात्रता ठीक काम करने लगती है।

आप एक .plistऐसा बना सकते हैं :

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

और बिल्ड सेटिंग्स के तहत उस फ़ाइल को पथ प्रदान करें

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

जैसा कि पोस्ट में कहा गया है, यह पात्रता डिबगर को संलग्न करने की अनुमति देता है।


1

मेरे पास एक समान मुद्दा था, हालांकि मुझे डिवाइस पर चलाने की कोशिश करते समय -34018 त्रुटि मिल रही थी। मैं iOS 10.1 के साथ सिएरा पर XCode 8.1 का उपयोग कर रहा हूं। मैं एक टीम पर काम करता हूं और अचानक इस समस्या का सामना करना पड़ा जब हमने परियोजना सेटिंग्स में "स्वचालित रूप से हस्ताक्षर करने का प्रबंधन" किया। जब मैं इसे बंद कर देता हूं और मैन्युअल रूप से अपनी प्रोफ़ाइल का चयन करता हूं, तो सब कुछ ठीक काम करता है। मैंने अपने किचेन से अपना डेवलेपर सर्टिफिकेट डिलीट कर दिया, फिर "ऑटोमैटिकली मैनेजिंग साइनिंग" का चयन किया। अगले बिल्ड पर, इसने मेरे लिए एक नया हस्ताक्षर प्रमाणपत्र तैयार किया और अब सब कुछ ठीक है। मुझे अभी भी यकीन नहीं है कि इस समस्या का कारण क्या है क्योंकि अन्य प्रमाणपत्र को मैन्युअल रूप से चयनित होने पर ठीक काम किया गया था, लेकिन जब XCode द्वारा प्रबंधित नहीं किया गया। आशा है कि यह किसी और के लिए एक घंटे लंबे सिरदर्द को रोकने में मदद करता है।


1

मैं Xcode 11 में इस मुद्दे को बिना किसी पात्रता समायोजन के हल करने में सक्षम था।

मैंने अपने फ्रेमवर्क के प्रोजेक्ट में एक नया ऐप टारगेट जोड़ा, जिसे MyFrameworkTestsHostApp कहा गया।

तब मैंने MyFrameworkTests लक्ष्य का चयन किया और MyFrameworkTestsHostApp के रूप में अपने होस्ट एप्लिकेशन को चुना।


0

यह क्षमताओं में कीचेन साझा करने को सक्षम करने के बाद काम करता है।


0

इस मुद्दे को जल्दी से हल करने के लिए 3 कदम उठाने होंगे।

  1. अपनी परियोजना क्षमताओं में किचेन साझा करना चालू करें।
  2. प्रोफ़ाइल के साथ स्वचालित प्रावधान का चयन करें
  3. सुनिश्चित करें कि आपका कस्टम एंटाइटेलमेंट विकल्प Entitlement.plist पर सेट है।

यह जादू करेगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.