2011-11-03 27 views
12

Tôi đang làm việc để cập nhật một iPhone application với một thay đổi nhỏ trong cấu hình mặc định của nó. Đã lâu rồi tôi mới xây dựng nó, và vì vậy tôi đã nâng cấp Xcode lên 4.2 và hỗ trợ iOS 5 trong các bản dựng mới nhất.Keychain iOS SecItemAdd trả về -25243

Khi tôi đi để thử nghiệm trên các thiết bị, tôi nhận được lỗi khẳng định sau đây:

2011-11-02 20:57:18.869 RoseBandwidth[903:707] Tried to add item, got result: -25243 
2011-11-02 20:57:18.870 RoseBandwidth[903:707] *** Assertion failure in -[KeychainItemWrapper writeToKeychain], /Users/tim/code/RoseBandwidth/Classes/KeychainItemWrapper.m:312 
2011-11-02 20:57:18.872 RoseBandwidth[903:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Couldn't add the Keychain Item.' 

Tôi đang sử dụng thực hiện các lớp KeychainItemWrapper từ Apple GenericKeychain project. Cần lưu ý rằng lỗi này chỉ hiển thị trên thiết bị chứ không phải trong Trình mô phỏng (và tôi biết về sự khác biệt về giới hạn giữa các nền tảng truy cập, nhưng thường tôi nghĩ rằng gây ra sự cố trên Trình mô phỏng, chứ không phải phần cứng thực tế).

Tại sao tôi lại bị lỗi này? Tôi đã không chạm vào nội dung nào liên quan đến các phần liên quan đến keychain của ứng dụng; nó lưu trữ và truy xuất dữ liệu chính xác như trước đây.

Trả lời

18

OK, tôi hoàn toàn không thể xây dựng dự án của bạn, nhưng từ How to share keychain data between iOS applications Tôi nghĩ bạn có thể muốn kiểm tra tệp quyền lợi của mình. Ít nhất trong dự án github bạn không có bất cứ điều gì được chỉ định trong Keychain Access Groups.

+0

Tôi upvote bạn nhiều hơn một lần nếu tôi có thể - câu trả lời đó là hết sức khéo léo. Hóa ra tôi mất tập tin quyền lợi của tôi ở đâu đó trên đường đi, vì vậy kích hoạt lại chúng (và chơi với các cấu hình cung cấp trong một thời gian) đã khắc phục vấn đề này. Cảm ơn! – Tim

9

Đối với những người tìm kiếm trong tương lai xảy ra ở đây, nguyên nhân khác có thể xảy ra do lỗi -25243 (có nghĩa là No access control, BTW) đang chạy trên trình mô phỏng.

Lý thuyết tốt nhất của tôi là hồ sơ cấp phép của ứng dụng (hoặc chữ ký đó) là cách ứng dụng biết hạt giống của gói đó là gì. Và bó hạt giống cần phải là một phần của tên nhóm truy cập của keychain của bạn. Tuy nhiên, các ứng dụng chạy trên trình giả lập không được ký và do đó có hạt giống gói bị thiếu (hoặc khác?) So với bạn đã chỉ định keychain-access-group.

Hoặc một cái gì đó. Đó là tất cả các tài liệu rất kém, thật khó để nói những gì là những gì. Chỉ cần thử chạy nó trên một thiết bị và xem nếu điều đó giúp.

+0

Đây là một điểm tốt - cảm ơn vì đã nuôi dưỡng nó. Tôi lưu ý trong câu hỏi ban đầu của mình rằng tôi đang sử dụng [KeychainItemWrapper] của Apple (https://developer.apple.com/library/ios/#samplecode/GenericKeychain/Listings/Classes_KeychainItemWrapper_m.html#//apple_ref/doc/uid/DTS40007797 Lớp -Classes_KeychainItemWrapper_m-DontLinkElementID_10), bao gồm một mệnh đề '# if' của trình biên dịch để kiểm tra xem ứng dụng có đang chạy trên trình mô phỏng hay không. Những người không sử dụng trình bao bọc đó cần phải đề phòng. – Tim

+0

Cảm ơn bạn, jemmons. Đã giúp tôi rất nhiều – makaron

3

Tôi nhận được cùng một lỗi theo thời gian trong trình mô phỏng ngay cả khi tôi không chạm vào mã. Một thiết lập lại của mô phỏng giải quyết vấn đề cho tôi.

Xem câu hỏi này/trả lời làm thế nào để thiết lập lại các mô phỏng: https://stackoverflow.com/a/3442326

+0

+1: Vâng, điều này thật khó chịu ... Tôi nhận được cùng một vấn đề với trình mô phỏng (và thiết lập lại chắc chắn không khắc phục được), nhưng (tôi tin) nó không xảy ra trên thiết bị. Bạn có bao giờ thấy điều này ngẫu nhiên xảy ra trên thiết bị không? –

+0

Không, tôi chưa thấy lỗi này trên thiết bị cho đến nay. – ToniTornado

1

Như những người khác đã chỉ ra, trong thiết bị xây dựng lỗi -25.243 thường gây ra bằng cách cố gắng truy cập vào một nhóm truy cập keychain mà bạn không có quyền cho. (Thiếu tệp Entitlements.plist hoặc hồ sơ cung cấp của bạn.)

Nhưng trong trình mô phỏng có thể có nguyên nhân khác. Trình mô phỏng không hỗ trợ các nhóm truy cập keychain ở tất cả, vì vậy nếu bạn đặt thuộc tính kSecAttrAccessGroup trên một mục keychain và cố gắng viết nó, bạn sẽ nhận được mã lỗi -25243 này.

FYI, Apple đang GenericKeychain mẫu có nhận xét này:

// Ignore the access group if running on the iPhone simulator. 
// 
// Apps that are built for the simulator aren't signed, so there's no keychain access group 
// for the simulator to check. This means that all apps can see all keychain items when run 
// on the simulator. 
// 
// If a SecItem contains an access group attribute, SecItemAdd and SecItemUpdate on the 
// simulator will return -25243 (errSecNoAccessForItem). 
4

Đối với những bạn nhận được lỗi này và cố gắng để đạt được "Shared Key Chain truy cập" giữa hai ứng dụng:

Bạn cần phải tạo Id ứng dụng cho ứng dụng của bạn có cùng Id nhóm bạn đã chọn khi lần đầu kích hoạt "Chia sẻ Keychain được chia sẻ" trong 'Khả năng'.Tạo Id App của bạn ở đây:. Apple Member Center

Sau đó bạn cần tạo provisioning hồ sơ từ Id App đó và tải nó vào máy tính của bạn (Kích đúp vào nó để cài đặt vào x-code)

Tôi giả sử bạn đã biết bạn cần "Tiền tố ID ứng dụng" để truy cập chuỗi khóa, nhưng đối với những người không biết: "Tiền tố ID ứng dụng" là mã nhận diện văn bản duy nhất được liên kết với tài khoản nhà phát triển Apple của bạn: enter image description here

Để truy cập "SharedKeychain" bạn cần phải thực hiện nó như thế này trước khi bạn cố gắng viết hoặc đọc từ keychain

keychainAccessGroupName = "AB123CDE45.myKeyChainGroup":

Bạn có thể kiểm tra hướng dẫn này để biết thêm: Share Keychain between iOS apps.

Hy vọng rằng sẽ giúp.

0

Điều này làm việc cho tôi khi tôi sử dụng chứng chỉ sản xuất và hồ sơ cấp phép. Sử dụng gỡ lỗi không hoạt động.

0

Theo kinh nghiệm của tôi, tôi nhận được rằng trở lại giá trị -25243 khi tôi nhận ra rằng tôi đã cố gắng để vượt qua kSecMatchLimit với kSecMatchLimitOnekSecReturnData với kCFBooleanTrue giá trị cho SecItemAdd() chức năng. Tôi loại bỏ những người và kiểm tra lại các id ứng dụng và hồ sơ cung cấp và tất cả mọi thứ là tốt.

Tôi không chắc liệu điều này có hữu ích hay không, nhưng theo kinh nghiệm của tôi nếu bạn sẽ sử dụng chức năng SecItemAdd() cho quyền truy cập keychain được chia sẻ, hai thông số đó không được ở đó.

Các vấn đề liên quan