SecItemAdd ส่งกลับข้อผิดพลาด -34018 เสมอใน Xcode 8 ในโปรแกรมจำลอง iOS 10


103

อัปเดต : ปัญหานี้ได้รับการแก้ไขแล้วใน Xcode 8.2 พวงกุญแจทำงานในโปรแกรมจำลองโดยไม่เปิดใช้งานการแชร์พวงกุญแจ

เหตุใดฉันจึงมักจะได้รับข้อผิดพลาด -34,018 เมื่อเรียกSecItemAddฟังก์ชั่นใน Xcode 8 / iOS 10 จำลอง ?

ขั้นตอนในการทำซ้ำ

สร้างหน้าเดี่ยว iOS ของโครงการ app ใหม่ใน Xcode 8. การเรียกใช้รหัสต่อไปนี้ใน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 Sierra 10.12.1

การกำหนดค่า

เกิดขึ้นใน Xcode 8 เสมอตั้งแต่ Beta 2 เมื่อทดสอบในโปรแกรมจำลอง iOS 10

ไม่เกิดขึ้นใน Xcode 8 เมื่อทดสอบในโปรแกรมจำลอง iOS 9.3

การสาธิต

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 (errSecMissingEntitlement)


8
สิ่งนี้ยังคงเป็นปัญหาใน Xcode 8 GM ดีใจที่ได้เห็น Apple ยังคงอยู่เหนือเกมของพวกเขา ...
Nicholas Harlen

1
เหมือนกันสำหรับฉันยังคงมีข้อผิดพลาดนี้
Kostiantyn Koval

ฉันกำลังขุดบันทึกคอนโซลของคุณจริงๆ :-)
Nicolas Miari

ปัญหาได้รับการแก้ไขแล้วใน Xcode 8.2 แต่กลับมาอยู่ใน Xcode 9.0!
Adil Hussain

คำตอบ:


183

ฉันสามารถแก้ไขปัญหานี้ได้ในแอปของฉันโดยการเพิ่มกลุ่มการเข้าถึงพวงกุญแจไปยังไฟล์สิทธิ์ ฉันเปิดสวิตช์แชร์พวงกุญแจในส่วนความสามารถในแอปทดสอบของคุณและมันก็ใช้ได้เช่นกัน

ภาพหน้าจอของการเปิดสวิตช์

รายการที่จะเพิ่มในการให้สิทธิ์:

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

ฉันได้ลองสิ่งนี้บน macOS Sierra (10.12) เท่านั้นดังนั้นฉันไม่แน่ใจว่าจะใช้ได้กับคุณในวันที่ 10.11.5 หรือไม่


เหมือนกันตรงนี้ที่ฉันใช้ Xcode 8 beta 5 อยู่ในขณะนี้ (ด้วยโปรแกรมจำลอง iOS 10 ปัญหาไม่ปรากฏในเบต้าก่อนหน้านี้และจะไม่เกิดขึ้นเมื่อทดสอบกับ 8b5 บน iPhone iOS 9 จริง) ฉันสังเกตเห็นว่าการแจ้งเตือนแบบพุชในความสามารถจำเป็นต้องมีการแก้ไข (เช่นการกดปุ่ม) และเปิดใช้งานการแชร์พวงกุญแจด้วยในเวลาเดียวกัน จากนั้นแอปไม่ได้รับข้อผิดพลาดอีกต่อไป หลังจากปิดการแชร์พวงกุญแจอีกครั้งก็ยังใช้งานได้!
Stefan

2
ฉันใช้พวงกุญแจเป็นเป้าหมายในการทดสอบและล้มเหลว - ฉันจะแก้ไขปัญหานี้ได้อย่างไร (เนื่องจากไม่มีความสามารถในเป้าหมายการทดสอบ)
Sam Jarman

1
@SamJarman ฉันก็มีปัญหานี้เหมือนกัน ฉันเพิ่งเข้าไปในการตั้งค่าการสร้างสำหรับเป้าหมายการทดสอบและยกเลิกการตั้งค่าฟิลด์สิทธิ์ ทำงานได้ดีหลังจากนั้น
Jordan Bondo

3
โซลูชันนี้ใช้ได้ดีกับ App Targets ขออภัยฉันกำลังทำงานกับเฟรมเวิร์ก Swift ที่ใช้KeychainSwiftซึ่งไม่ได้สร้างอีกต่อไปเนื่องจากข้อผิดพลาด ในกรอบเป้าหมายฉันไม่สามารถเพิ่มไฟล์สิทธิ์ afaik ได้ มีใครรู้วิธีแก้ปัญหาสำหรับกรณีนี้หรือไม่?
ม.ค. แนช

5
@JanNash นี่คือวิธีที่ฉันจัดการเพื่อให้การทดสอบทำงานได้evgenii.com/blog/testing-a-keychain-library-in-xcode
Evgenii

17

ในXcode 8.1 GM Release Notes Apple รับทราบปัญหาและแนะนำวิธีแก้ปัญหาที่สะอาดกว่า:

API ของพวงกุญแจอาจไม่ทำงานในโปรแกรมจำลองหากไฟล์สิทธิ์ของคุณไม่มีค่าสำหรับการให้สิทธิ์ตัวระบุแอปพลิเคชัน (28338972) วิธีแก้ปัญหา: เพิ่มการตั้งค่าการสร้างที่ผู้ใช้กำหนดเองให้กับเป้าหมายของคุณที่ชื่อ ENTITLEMENTS_REQUIRED และตั้งค่าเป็น YES สิ่งนี้จะทำให้ Xcode แทรกสิทธิ์ตัวระบุแอปพลิเคชันโดยอัตโนมัติเมื่อสร้าง

โปรดทราบว่าจากสิ่งที่ฉันได้ลองใช้งานได้ใน Xcode 8.1 เท่านั้น แม้ว่าข้อความจะทำให้คุณเข้าใจผิดในการตั้งค่าบิลด์สิ่งที่คุณต้องทำคือเพิ่มสิ่งนี้ลงในตัวแปรสภาพแวดล้อมในโครงร่างของคุณ

ป้อนคำอธิบายภาพที่นี่

Xcode 8.2 จะแก้ปัญหานี้:

แก้ไขแล้วใน Xcode 8.2 beta - IDE Keychain API ทำงานได้อย่างถูกต้องใน Simulator (28338972)


1
@Tiago วิธีแก้ปัญหานี้จากบันทึกประจำรุ่นยังคงใช้ได้กับคุณใน Xcode 8.1 บนโปรแกรมจำลอง iOS 10.1 หรือไม่ ฉันได้ลองเพิ่มการตั้งค่านี้ (ทั้งเป็นการตั้งค่าที่ผู้ใช้กำหนดเองในเป้าหมายและเป็นตัวแปรสภาพแวดล้อมในโครงร่าง) และฉันยังคงได้รับค่าส่งคืน -34018 เมื่อทำงานบนเครื่องจำลอง iOS 10.1
guywithmazda

3
@guywithmazda เหมือนกันที่นี่. ยังคงได้รับ -34018 และลองทั้งการตั้งค่าบิลด์และตัวแปรสภาพแวดล้อม
keithbhunter

ไม่ได้ผลสำหรับฉันทั้งในการตั้งค่าการสร้างหรือตัวแปรสภาพแวดล้อมของโครงการใน Xcode 8.1 (8B62) บน Sierra ฉันพลาดอะไรไปรึเปล่า?
Evgenii

4
ฉันใช้ Xcode 8.2.1 และปัญหานี้ยังคงทำซ้ำได้ นอกจากนี้คำถามของฉันคือถ้าฉันไม่มีแอปโฮสต์และฉันกำลังสร้างเป้าหมาย Framework แล้วจะแก้ไขปัญหานี้ได้อย่างไร
DShah

2
ปัญหานี้ยังคงส่งผลต่อการทดสอบหน่วยสำหรับเป้าหมาย Framework เนื่องจากในกรณีนี้จะเป็นจุดเริ่มต้นของโฮสต์ทดสอบที่ต้องการสิทธิ์ เราตระหนักถึงปัญหานี้ แต่หากเป็นตัวบล็อกสำหรับคุณโปรดส่งข้อบกพร่องที่ซ้ำกัน
russbishop

10

กรณีนี้อาจเกิดขึ้นได้หากคุณมีเป้าหมายการทดสอบที่ไม่มีแอปโฮสต์ เพื่อแก้ไข

  1. เพิ่มแอปโฮสต์จำลอง: ป้อนคำอธิบายภาพที่นี่

  2. เปิดใช้งานการลงนามรหัสอัตโนมัติและเพิ่มทีม:

ป้อนคำอธิบายภาพที่นี่

  1. เปิดใช้งานการแชร์พวงกุญแจในความสามารถ

ป้อนคำอธิบายภาพที่นี่


5

ฉันได้รับข้อผิดพลาดขณะลงชื่อด้วยอีเมลสร้างผู้ใช้ใหม่หรือออกจากระบบโดยใช้ firebase

ข้อผิดพลาดคือ:

รหัสโดเมนข้อผิดพลาด firauth 17995

ฉันเปิดสวิตช์แชร์พวงกุญแจในส่วนความสามารถในแอปทดสอบของคุณและมันก็ใช้ได้เช่นกัน


4

ฉันกำลังมองหาวิธีแก้ปัญหาที่ไม่ได้ใช้การแชร์พวงกุญแจเนื่องจากนั่นไม่ใช่คุณสมบัติที่ฉันกำลังมองหา ฟอรัมนักพัฒนาดูเหมือนจะมีวิธีแก้ปัญหาที่ดีจาก EvergreenCoder ที่คุณสามารถ จำกัด ขอบเขตให้เฉพาะโปรแกรมจำลอง iOS 10 (เนื่องจากดูเหมือนจะเป็นโปรแกรมจำลองที่ได้รับผลกระทบเท่านั้น) จากโพสต์:

ปัญหาดูเหมือนว่าจะต้องมีการให้สิทธิ์อย่างน้อยหนึ่งรายการเพื่อให้ Xcode สามารถเพิ่มเอนทิล "application-identifier" ไปยังแอปพลิเคชันที่สร้างขึ้นได้อย่างถูกต้อง นี่คือเหตุผลที่การแชร์พวงกุญแจดูเหมือนจะเป็นวิธีแก้ปัญหา แต่เป็นเพียงทางอ้อมเท่านั้น: สิทธิ์อื่น ๆ ดูเหมือนจะใช้ได้ดี

คุณสามารถสร้างสิ่งที่.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 เมื่อพยายามเรียกใช้บนอุปกรณ์ ฉันใช้ XCode 8.1 บน Sierra กับ iOS 10.1 ฉันทำงานในทีมและจู่ๆก็มีปัญหานี้เมื่อเราเปลี่ยนไปใช้ "จัดการการลงนามโดยอัตโนมัติ" ในการตั้งค่าโครงการ เมื่อฉันปิดสิ่งนี้และเลือกโปรไฟล์ด้วยตนเองทุกอย่างก็ทำงานได้ดี ฉันต้องลบใบรับรองนักพัฒนาซอฟต์แวร์ออกจากพวงกุญแจจากนั้นเลือก "จัดการการลงนามโดยอัตโนมัติ" อีกครั้ง ในรุ่นถัดไปมันสร้างใบรับรองการลงนามใหม่สำหรับฉันและตอนนี้ทุกอย่างทำงานได้ดี ฉันยังไม่แน่ใจว่าอะไรเป็นสาเหตุของปัญหาเนื่องจากใบรับรองอื่นทำงานได้ดีเมื่อเลือกด้วยตนเอง แต่ไม่ได้รับการจัดการเมื่อ XCode หวังว่านี่จะช่วยหยุดอาการปวดหัวเป็นเวลานานสำหรับคนอื่นได้


1

ฉันสามารถแก้ไขปัญหานี้ใน Xcode 11 โดยไม่มีการปรับเปลี่ยนสิทธิ์ใด ๆ

ฉันเพิ่งเพิ่มเป้าหมายแอปใหม่ในโครงการของเฟรมเวิร์กที่ชื่อว่า MyFrameworkTestsHostApp

จากนั้นฉันเลือกเป้าหมาย MyFrameworkTests และเลือก Host Application เป็น MyFrameworkTestsHostApp


0

ใช้งานได้หลังจากเปิดใช้งานการแชร์พวงกุญแจในความสามารถ


0

มี 3 ขั้นตอนในการแก้ไขปัญหานี้อย่างรวดเร็ว

  1. เปิดการแชร์พวงกุญแจในความสามารถของโครงการ
  2. เลือกการจัดสรรอัตโนมัติด้วยโปรไฟล์
  3. ตรวจสอบให้แน่ใจว่าตัวเลือกการให้สิทธิ์แบบกำหนดเองของคุณถูกตั้งค่าเป็น Entitlement.plist

นี้จะทำเวทมนตร์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.