SecItemAdd luôn trả về lỗi -34018 trong Xcode 8 trong trình mô phỏng iOS 10


103

Cập nhật : Sự cố này đã được khắc phục trong Xcode 8.2. Chuỗi khóa hoạt động trong trình mô phỏng mà không cần bật chia sẻ chuỗi khóa.

Tại sao tôi luôn nhận được lỗi -34018 khi gọi SecItemAddchức năng trong trình mô phỏng Xcode 8 / iOS 10 ?

Các bước để tạo lại

Tạo một dự án ứng dụng iOS Trang đơn mới trong Xcode 8. Chạy mã sau trong viewDidLoad(hoặc mở dự án Xcode này ).

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

Kết quả mong đợi

Mục được thêm vào Chuỗi khóa.

Kết quả thực tế

Chức năng SecItemAdd trả về mã lỗi sau: -34018.

Phiên bản

Phiên bản Xcode 8.1 (8B62), macOS Sierra 10.12.1.

Cấu hình

Luôn xảy ra trong Xcode 8 kể từ Beta 2 khi thử nghiệm trong trình mô phỏng iOS 10.

KHÔNG xảy ra trong Xcode 8 khi thử nghiệm trong trình mô phỏng iOS 9.3.

Bản giới thiệu

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

Người giới thiệu

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

Diễn đàn nhà phát triển Apple: https://forums.developer.apple.com/message/179846

Sự cố này khác với bài đăng sau vì nó xảy ra nhất quán trong Xcode 8. SecItemAdd và SecItemCopyMatching trả về mã lỗi -34018 (errSecMissingEntitlement)


8
Điều này dường như vẫn là một vấn đề trong Xcode 8 GM. Rất vui được gặp Apple vẫn là trên đầu trang của trò chơi của họ ...
Nicholas Harlen

1
tương tự cho tôi, vẫn còn lỗi này
Kostiantyn Koval

Tôi thực sự đang đào nhật ký bảng điều khiển của bạn :-)
Nicolas Miari

Sự cố đã được khắc phục trong Xcode 8.2 nhưng nó đã trở lại trong Xcode 9.0!
Adil Hussain

Câu trả lời:


183

Tôi đã có thể giải quyết vấn đề này trong ứng dụng của mình bằng cách thêm Nhóm truy cập chuỗi khóa vào tệp Quyền lợi. Tôi đã bật khóa chuyển Chia sẻ chuỗi khóa trong phần Khả năng trong ứng dụng thử nghiệm của bạn và nó cũng đang hoạt động với tôi.

Ảnh chụp màn hình khi bật công tắc

Mục cần thêm vào quyền lợi:

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

Tôi mới chỉ thử điều này trên macOS Sierra (10.12), vì vậy tôi không chắc liệu nó có hoạt động với bạn vào ngày 10.11.5 hay không.


Tương tự ở đây, chỉ khác là tôi đang sử dụng Xcode 8 beta 5 hiện tại (với trình mô phỏng iOS 10. Sự cố không hiển thị với bản beta trước đó. Cũng không xảy ra khi thử nghiệm với 8b5 trên iPhone iOS 9 thực). Tôi nhận thấy rằng Thông báo đẩy trong Khả năng cần sửa (tức là nhấn nút) và đồng thời cũng bật Chia sẻ chuỗi khóa. Sau đó, ứng dụng không gặp lỗi nữa. Sau khi tắt Chia sẻ chuỗi khóa một lần nữa, nó vẫn hoạt động!
Stefan

2
Tôi sử dụng chuỗi khóa làm mục tiêu thử nghiệm và nó không thành công - làm cách nào để giải quyết vấn đề này? (Vì không có khả năng nào trong các mục tiêu thử nghiệm)
Sam Jarman

1
@SamJarman Tôi cũng gặp sự cố này. Tôi vừa đi vào cài đặt xây dựng cho mục tiêu thử nghiệm & bỏ thiết lập trường quyền. Làm việc tốt sau đó.
Jordan Bondo

3
Giải pháp này hoạt động tốt cho Mục tiêu ứng dụng. Thật không may, tôi đang làm việc trên một khuôn khổ Swift sử dụng KeychainSwift không được xây dựng nữa do lỗi. Trong mục tiêu khung, tôi không thể thêm tệp quyền truy cập afaik. Có ai biết cách giải quyết cho trường hợp này không?
Jan Nash

5
@JanNash, đây là cách tôi quản lý để thực hiện việc thử nghiệm công việc evgenii.com/blog/testing-a-keychain-library-in-xcode
Evgenii

17

Trong Ghi chú phát hành Xcode 8.1 GM, Apple đã thừa nhận vấn đề và đề xuất một giải pháp tốt hơn:

Các API chuỗi khóa có thể không hoạt động trong Trình mô phỏng nếu tệp quyền của bạn không chứa giá trị cho quyền nhận dạng ứng dụng. (28338972) Giải pháp: Thêm cài đặt bản dựng do người dùng xác định vào mục tiêu của bạn có tên ENTITLEMENTS_REQUIRED và đặt giá trị thành CÓ. Điều này sẽ khiến Xcode tự động chèn quyền nhận dạng ứng dụng khi xây dựng.

Lưu ý rằng từ những gì tôi đã thử, nó chỉ hoạt động trong Xcode 8.1. Mặc dù văn bản có thể đánh lừa bạn vào cài đặt xây dựng, nhưng những gì bạn cần làm là thêm nó vào Biến môi trường, trong lược đồ của bạn.

nhập mô tả hình ảnh ở đây

Xcode 8.2 sẽ giải quyết điều này:

Được giải quyết trong Xcode 8.2 beta - API chuỗi khóa IDE hoạt động chính xác trong Trình mô phỏng. (28338972)


1
@Tiago Có phải cách giải quyết này từ các ghi chú phát hành vẫn hoạt động cho bạn trong Xcode 8.1 trên trình mô phỏng iOS 10.1 không? Tôi đã thử thêm cài đặt này (cả cài đặt do Người dùng xác định trên mục tiêu và dưới dạng Biến môi trường trong lược đồ) và tôi vẫn nhận được giá trị trả về -34018 khi chạy trên trình mô phỏng iOS 10.1.
guywi suyễnzda

3
@guywi suyễnzda, ở đây cũng vậy. Vẫn nhận được -34018 và đã thử cả cài đặt xây dựng và biến môi trường.
keithbhunter

Không hoạt động đối với tôi, cả trong cài đặt bản dựng cũng như biến môi trường của chương trình trong Xcode 8.1 (8B62) trên Sierra. Tui bỏ lỡ điều gì vậy?
Evgenii

4
Tôi đang sử dụng Xcode 8.2.1 và sự cố này vẫn có thể tái tạo được. Ngoài ra, câu hỏi của tôi là nếu tôi không có ứng dụng lưu trữ và tôi đang tạo mục tiêu Khung, thì làm thế nào để giải quyết vấn đề này?
DShah

2
Sự cố này vẫn ảnh hưởng đến các bài kiểm tra đơn vị cho các mục tiêu Khung vì trong trường hợp này, nó sẽ là bản gốc của máy chủ kiểm tra cần quyền. Chúng tôi đã biết về vấn đề này nhưng nếu nó là một trình chặn đối với bạn, vui lòng gửi một lỗi trùng lặp.
russbishop

10

Điều này có thể xảy ra nếu bạn có mục tiêu thử nghiệm không có ứng dụng lưu trữ. Sửa chữa

  1. thêm một ứng dụng máy chủ giả: nhập mô tả hình ảnh ở đây

  2. Bật tính năng ký mã tự động và thêm một nhóm:

nhập mô tả hình ảnh ở đây

  1. Bật tính năng chia sẻ chuỗi khóa

nhập mô tả hình ảnh ở đây


5

Tôi gặp lỗi khi đăng nhập bằng email, tạo người dùng mới hoặc đăng xuất bằng firebase.

Lỗi là:

mã miền lỗi firauth 17995

Tôi đã bật khóa chuyển Chia sẻ chuỗi khóa trong phần Khả năng trong ứng dụng thử nghiệm của bạn và nó cũng đang hoạt động với tôi.


4

Tôi đang tìm kiếm một giải pháp không sử dụng chia sẻ Keychain, vì đó không phải là tính năng tôi đang tìm kiếm. Diễn đàn nhà phát triển Có vẻ như EvergreenCoder có một công việc tốt mà bạn có thể giới hạn phạm vi chỉ trong trình mô phỏng iOS 10 (vì đây có vẻ là trình mô phỏng bị ảnh hưởng duy nhất). Từ bài đăng:

Vấn đề dường như là phải có ít nhất một quyền để Xcode có thể thêm quyền "nhận dạng ứng dụng" vào ứng dụng đã xây dựng một cách chính xác. Đây là lý do tại sao chia sẻ keychain dường như là một giải pháp nhưng nó chỉ gián tiếp như vậy: mọi quyền lợi khác dường như hoạt động tốt.

Bạn có thể tạo một cái .plistnhư vậy:

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

và cung cấp đường dẫn đến tệp đó trong Cài đặt bản dựng trong

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

Như đã nêu trong bài đăng, quyền này chỉ cho phép đính kèm trình gỡ lỗi.


1

Tôi đã gặp sự cố tương tự, mặc dù tôi đã gặp lỗi -34018 khi cố gắng chạy trên thiết bị. Tôi đang sử dụng XCode 8.1 trên Sierra với iOS 10.1. Tôi làm việc theo nhóm và đột nhiên gặp sự cố này khi chúng tôi chuyển sang "Tự động quản lý việc ký" trong cài đặt dự án. Khi tôi tắt tính năng này và chọn hồ sơ của mình theo cách thủ công, mọi thứ đều hoạt động tốt. Tôi đã phải xóa chứng chỉ nhà phát triển khỏi chuỗi khóa của mình, sau đó chọn lại "Tự động quản lý việc ký". Trong lần xây dựng tiếp theo, nó đã tạo chứng chỉ ký mới cho tôi và mọi thứ hiện hoạt động tốt. Tôi vẫn không chắc điều gì đã gây ra sự cố vì chứng chỉ khác hoạt động tốt khi được chọn theo cách thủ công, nhưng không ổn khi được quản lý bởi XCode. Hy vọng điều này sẽ giúp chấm dứt cơn đau đầu kéo dài hàng giờ cho người khác.


1

Tôi có thể giải quyết vấn đề này trong Xcode 11 mà không cần bất kỳ điều chỉnh quyền nào.

Tôi chỉ cần thêm một mục tiêu ứng dụng mới vào dự án khuôn khổ của mình có tên là MyFrameworkTestsHostApp.

Sau đó, tôi chọn mục tiêu MyFrameworkTests và chọn Ứng dụng máy chủ của nó là MyFrameworkTestsHostApp.


0

Nó hoạt động sau khi bật khả năng chia sẻ chuỗi khóa.


0

Có 3 bước cần thực hiện để giải quyết vấn đề này một cách nhanh chóng.

  1. Bật chia sẻ Chuỗi khóa trong khả năng dự án của bạn.
  2. Chọn Cấp phép tự động với một cấu hình
  3. Đảm bảo tùy chọn quyền tùy chỉnh của bạn được đặt thành Entitlement.plist.

Điều này sẽ làm nên điều kỳ diệu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.