SecItemAdd และ SecItemCopyMatching ส่งคืนรหัสข้อผิดพลาด -34018 (errSecMissingEntitlement)


116

บางครั้งเมื่อฉันเรียกใช้แอปพลิเคชันบนอุปกรณ์จาก Xcode ฉันจะพยายามเข้าถึงพวงกุญแจ แต่ล้มเหลวเนื่องจากข้อผิดพลาด -34018 สิ่งนี้ไม่ตรงกับรหัสข้อผิดพลาดของพวงกุญแจที่มีเอกสารและไม่สามารถทำซ้ำได้อย่างสม่ำเสมอ (อาจเกิดขึ้น 30% ของเวลาและไม่ชัดเจนสำหรับฉันว่าทำไมมันถึงเกิดขึ้น) สิ่งที่ทำให้การดีบักปัญหานี้ยากมากคือการขาดเอกสารทั้งหมด มีความคิดอะไรที่ทำให้เกิดปัญหานี้และจะแก้ไขได้อย่างไร? ฉันใช้ Xcode 5 และใช้ iOS 7.0.4 บนอุปกรณ์

มีประเด็นเปิดเกี่ยวกับเรื่องนี้ที่นี่: https://github.com/soffes/sskeychain/issues/52

แก้ไข: การเพิ่มรหัสการเข้าถึงพวงกุญแจตามคำขอ

ฉันใช้SSKeychainไลบรารีเพื่อเชื่อมต่อกับพวงกุญแจ นี่คือตัวอย่างข้อมูล

#define SERVICE @"default"

@implementation SSKeychain (EXT)

+ (void)setValue:(NSString *)value forKey:(NSString *)key {
    NSError *error = nil;
    BOOL success = NO;
    if (value) {
        success = [self setPassword:value forService:SERVICE account:key error:&error];
    } else {
        success = [self deletePasswordForService:SERVICE account:key error:&error];
    }
    NSAssert(success, @"Unable to set keychain value %@ for key %@ error %@", value, key, error);
    if (!success) {
        LogError(@"Unable to set value to keychain %@", error);
    }
    LogTrace(@"Will set keychain account %@. is to nil? %d", key, value == nil);
    if (value == nil)
        LogWarn(@"Setting keychain %@ to nil!!!", key);
}

+ (NSString *)valueForKey:(NSString *)key {
    NSError *error = nil;
    NSString *value = [self passwordForService:SERVICE account:key error:&error];
    if (error && error.code != errSecItemNotFound) {
        NSAssert(!error, @"Unable to retrieve keychain value for key %@ error %@", key, error);
        LogError(@"Unable to retrieve keychain value for key %@ error %@", key, error);
    }
    return value;
}

+ (BOOL)removeAllValues {
    LogInfo(@"Completely Reseting Keychain");
    return [[self accountsForService:SERVICE] all:^BOOL(NSDictionary *accountInfo) {
        return [self deletePasswordForService:SERVICE account:accountInfo[@"acct"]];
    }];
}

@end

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


ฉันมีปัญหาเดียวกันและทำซ้ำไม่ได้ ... ฉันใช้คลาส KeychainItemWrapper จาก Apple บางครั้งอาจเกิดข้อผิดพลาดจาก Google Analytics ด้วยข้อความแสดงข้อผิดพลาดเดียวกัน ฉันใช้ Google Analytics v3.02
Joey

นอกจากนี้ดูเหมือนว่าจะใช้ได้ในแอพจาก AppStore มันเกิดขึ้นเฉพาะในแอพเวอร์ชันพัฒนา
Joey

2
ฉันมี crashlytics สำหรับเวอร์ชัน app store และน่าเสียดายที่ดูเหมือนว่าจะเกิดขึ้นใน app store ด้วยแม้ว่าจะบ่อยน้อยกว่า dev: /
Tony

3
ฉันกำลังคิดที่จะเปลี่ยนจากพวงกุญแจเพราะข้อมูลที่เก็บไว้ในพวงกุญแจอาจสูญหายไปแบบสุ่มได้เช่นนี้ถือเป็นข้อผิดพลาดร้ายแรงสำหรับแอปพลิเคชัน
Tony

2
นอกจากนี้เรายังพบปัญหาที่ไม่ต่อเนื่องนี้ เราเพิ่มข้อยกเว้นเมื่อเราได้รับ rc ที่ไม่คาดคิดจาก secItemCopyMatching รวมถึงเคส -34018 เราพยายาม (อย่างไม่เต็มใจ) เพิ่มกลไกที่เมื่อเราได้รับค่าที่เราต้องการจากพวงกุญแจแล้วเราจะแคชไว้ในหน่วยความจำของแอปแล้วให้บริการจากที่นั่นโดยไม่ต้องเข้าถึงพวงกุญแจ แต่ตอนนี้เราได้เห็นโอกาสที่หายากที่การเข้าถึงพวงกุญแจหนึ่งอันในตอนแรกล้มเหลวด้วย a -34018 มีใครลองดำเนินการอีกครั้งหลังจาก -34018 หรือไม่?
Chris Markle

คำตอบ:


45

แก้ไข iOS 10 / XCode 8:

เพิ่มการให้สิทธิ์ KeyChain ไปที่การตั้งค่าโครงการ -> ความสามารถ -> การแชร์พวงกุญแจ -> เพิ่มกลุ่มพวงกุญแจ + เปิด

คำตอบที่นี่จาก Apple:

อัปเดต: ในที่สุดเราก็สามารถสร้างข้อผิดพลาด -34018 บน iOS 8.3 ได้แล้ว นี่เป็นขั้นตอนแรกในการระบุสาเหตุที่แท้จริงจากนั้นจึงทำการแก้ไข

ตามปกติเราไม่สามารถผูกมัดกับกรอบเวลาการเผยแพร่ได้ แต่สิ่งนี้ส่งผลกระทบต่อนักพัฒนาซอฟต์แวร์จำนวนมากและเราต้องการแก้ไขปัญหานี้อย่างแท้จริง

ก่อนหน้านี้ฉันแนะนำให้เพิ่มการหน่วงเวลาเล็กน้อยในแอปพลิเคชัน: didFinishLaunchingWithOptions และ applicationDidBecomeActive: ก่อนที่จะเข้าถึงพวงกุญแจเป็นวิธีแก้ปัญหา อย่างไรก็ตามนั่นไม่ได้ช่วยได้จริง นั่นหมายความว่าในขณะนี้ยังไม่มีวิธีแก้ปัญหาอื่นใดนอกจากการเปิดแอปอีกครั้ง

ปัญหาดูเหมือนจะเกี่ยวข้องกับแรงกดดันของหน่วยความจำดังนั้นการจัดการคำเตือนหน่วยความจำในเชิงรุกมากขึ้นอาจช่วยบรรเทาปัญหาได้

https://forums.developer.apple.com/thread/4743#14441

UPDATE

ตกลงนี่คือข้อมูลล่าสุด
นี่เป็นปัญหาที่ซับซ้อนซึ่งมีสาเหตุหลายประการ:

  • ปัญหาบางกรณีเกิดจากการลงนามแอปไม่ถูกต้อง คุณสามารถแยกแยะกรณีนี้ได้อย่างง่ายดายเนื่องจากปัญหาเกิดขึ้นซ้ำได้ 100%
  • ปัญหาบางกรณีเกิดจากข้อบกพร่องในการที่ iOS รองรับการพัฒนาแอป (r. 23,991,853) การดีบักสิ่งนี้มีความซับซ้อนเนื่องจากข้อบกพร่องอื่นในระบบปฏิบัติการ (r. เราเชื่อว่าปัญหาเหล่านี้ได้รับการแก้ไขแล้วใน iOS 9.3
  • เราสงสัยว่าอาจมีสาเหตุมากกว่านี้ของปัญหานี้

ดังนั้นหากคุณพบปัญหานี้บนอุปกรณ์ของผู้ใช้ (สิ่งที่ Xcode ไม่ได้พูดคุยด้วย) ที่ใช้ iOS 9.3 หรือใหม่กว่าโปรดส่งรายงานข้อบกพร่องเกี่ยวกับปัญหานี้ พยายามรวมบันทึกระบบอุปกรณ์ไว้ในรายงานข้อบกพร่องของคุณ (ฉันรู้ว่าอาจเป็นเรื่องยุ่งยากเมื่อต้องจัดการกับอุปกรณ์ของลูกค้าทางเลือกหนึ่งคือขอให้ลูกค้าติดตั้ง Apple Configurator ซึ่งจะช่วยให้พวกเขาดูบันทึกระบบได้) และหากคุณส่งข้อบกพร่องโปรดโพสต์หมายเลขข้อบกพร่องของคุณเพื่อบันทึกเท่านั้น

ในนามของ Apple ฉันขอขอบคุณทุกคนสำหรับความพยายามในการช่วยติดตามปัญหาที่ค่อนข้างน่ากลัวนี้ แบ่งปันและสนุก

https://forums.developer.apple.com/thread/4743#126088


2
ปัญหายังคงเกิดขึ้นบน iOS 9.2, iPhone 5S
DevGansta

1
ดูเหมือนว่า iOS 9.3 ควรแก้ไขปัญหานี้ตามคำตอบล่าสุดจาก Appleในเธรดที่คุณเชื่อมโยง @daidai คุณช่วยปรับปรุงคำตอบของคุณด้วยข้อมูลใหม่นี้ได้ไหม
jf

1
@YoonLee ยังเห็นสิ่งนี้ใน iOS10 ด้วยซึ่งใช้ 2.4.8 SDK ของ AWS ด้วย เกิดข้อผิดพลาดใน AWSClientContext.m บรรทัด 54 โชคช่วยแก้ปัญหานี้ไหม
CharlesA

1
@YoonLee btw เพิ่งแก้ไขสิ่งนี้โดยใช้หนึ่งในคำตอบด้านล่าง: 'KeyChain Sharing เปิดสำหรับความสามารถเป้าหมาย'
CharlesA

1
@CharlesA ใช่ฉันแก้ไขในวันนั้น คุณพูดถูก ดูเหมือนว่า 'KeyChain Entitlement turn on' จะแก้ไขปัญหาได้ น่าแปลกที่ข้อผิดพลาดนี้ไม่ได้เกิดขึ้นเสมอไป อย่างไรก็ตามตอนนี้ฉันกำลังเปิดสิ่งนี้อยู่
Yoon Lee

26

โดยทั่วไปคุณต้องกำหนดรหัสลงในโฟลเดอร์. xcttest ของคุณโดยการเพิ่มสิ่งต่อไปนี้เป็นสคริปต์การรันในเป้าหมายการทดสอบของคุณ

codesign --verify --force --sign "$CODE_SIGN_IDENTITY" "$CODESIGNING_FOLDER_PATH"

ฉันได้รับข้อผิดพลาด -34018 จำนวนมากเมื่อทดสอบพวงกุญแจของฉันบนอุปกรณ์และสิ่งนี้สามารถแก้ไขได้

หากปัญหาไม่มีอยู่ในเป้าหมายการทดสอบของคุณปัญหานี้อาจไม่ใช่วิธีแก้ปัญหา


ยืนยันว่าสิ่งนี้ได้รับการแก้ไขแล้วในสภาพแวดล้อมการทดสอบ ฉันต้องเพิ่มสคริปต์การรันลงในเป้าหมายการทดสอบจริง (เช่นสิ่งที่มีการทดสอบหน่วยทั้งหมดไม่ใช่เป้าหมายการสร้างที่ทำงานบนอุปกรณ์) นอกจากนี้ยังยืนยันว่านี่เป็นเพียงปัญหาในอุปกรณ์ไม่ใช่ในโปรแกรมจำลอง
iwasrobbed

2
ฉันได้รับ ": ไม่พบข้อมูลประจำตัว Command / bin / sh ล้มเหลวด้วยรหัสทางออก 1" เมื่อฉันทำสิ่งนี้? เดาว่าฉันไม่มี $ CODE_SIGN_IDENTITY มีความคิดอย่างไรที่จะแก้ไขปัญหานี้
Daniel Coffman

1
@DanielCoffman คุณต้องไปที่การตั้งค่าเป้าหมายของคุณและใน Code Signing Identity เลือก "iOS Developer" (หรือข้อมูลประจำตัวที่ถูกต้องอื่น ๆ ) วิธีนี้แก้ไขข้อผิดพลาดในการสร้างอย่างไรก็ตามอย่างน้อยสำหรับฉันก็ไม่สามารถแก้ไขปัญหาพวงกุญแจได้ ฉันยังคงได้รับรหัสข้อผิดพลาด -34018
Marcin

3
ขอบคุณ Marcin ฉันเริ่มได้รับข้อผิดพลาดนี้เมื่อเปลี่ยนเป็น xcode 6 beta ไม่มีคำแนะนำในชุดข้อความนี้ได้รับการแก้ไข การเปลี่ยนกลับเป็น xcode 5 และ -34018 จะไม่เกิดขึ้นอีกต่อไป
Daniel Coffman

ฉันพบข้อผิดพลาดนี้เป็นครั้งแรกตั้งแต่ฉันใช้ XCode 6.3
VladimírSlavík

13

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

แอปของคุณและกระบวนการรักษาความปลอดภัย 'พูดคุย' ร่วมกันผ่านเทคโนโลยีที่เรียกว่าXPC XPC

หากจำเป็นระบบความปลอดภัยจะเปิดใช้งานผ่านคำสั่ง launchd ที่รู้จักกันดีโดย XPC คุณอาจตรวจสอบได้ว่า daemon กำลังทำงานอยู่ในแอปการตรวจสอบกิจกรรม (หากรันใน Simulator แน่นอน) และกระบวนการหลักของมันถูกเปิดใช้งาน

ฉันเดาว่านี่เป็นไปได้ว่าด้วยเหตุผลใดก็ตามที่ดีมอนความปลอดภัยไม่สามารถเริ่มต้นหรือทำงานช้าเกินไปและไม่พร้อมเมื่อคุณพยายามใช้งาน

บางทีคุณอาจคิดเกี่ยวกับวิธีการเปิดตัวภูตล่วงหน้า

ต้องขออภัยที่ไม่เป๊ะกว่านี้ ฉันหวังว่ามันจะช่วยคุณในการสืบสวนต่อไป


2
ฉันได้รับปัญหานี้เฉพาะเมื่อแอปของฉันเปิดขึ้นมาใหม่ผ่าน Deep link ด้วยวิธีการมอบหมายแอปต่อไปนี้: - แอปพลิเคชัน (BOOL): (UIApplication *) application handleOpenURL: (NSURL *) url หากฉันเพิ่งเริ่มแอปการเขียนพวงกุญแจจะใช้งานได้และหากฉันย่อและขยายแอปให้ใหญ่ที่สุดก็ยังใช้งานได้ เฉพาะเมื่อฉันเปิดอีกครั้งพร้อมกับ Deep Link ที่เกิดปัญหานี้ ฉันมีการกำหนดค่า MyApp.entitlements ในโครงการของฉัน (การแชร์พวงกุญแจในแท็บความสามารถ) Xcode 7 beta 4
FranticRock

กรณีของฉันคล้ายกับของอเล็กซ์ซึ่งจะเกิดขึ้นเมื่อแอปเชื่อมโยงในรายละเอียดเท่านั้น มิฉะนั้นจะทำงานได้ดี บางทีบริบทบางอย่างอาจไม่ถูกต้องเมื่อเปิดแอปจากแอปอื่น
CodeBrew

12

ฉันสังเกตพฤติกรรมที่คล้ายกันหลังจากสร้างและเรียกใช้โค้ดของฉันใน Xcode 6 beta พร้อม iOS 8 SDK (ทำงานได้อย่างถูกต้องกับ Xcode 5 / iOS 7) ใน Xcode 6 ใน iOS Simulator SecItemCopyMatching จะคืนค่า -34018 เสมอ เริ่มทำงานหลังจากเปิด "การแชร์พวงกุญแจ" ในแท็บความสามารถ

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

ฉันได้ลองวิธีแก้ปัญหาที่โพสต์ไว้ที่นี่โดย JorgeDeCorte โดยมีการระบุรหัสในเป้าหมายการทดสอบ แต่มันไม่ได้ผลสำหรับฉัน


8
และกลับมาใน iOS 8 beta 3 :)
Mustafa

7
และกลับมาใน iOS 9.0
Alex Stone

4
และตอนนี้กลับมาใน iOS 9.2 :-(
Vamos

4
ย้อนกลับไปใน iOS 10 beta 2
Pranjal Bikash Das

3
และกลับมาใน iOS 10 beta 5
Pascal

6

ลองปิดเบรกพอยต์ทั้งหมดเมื่อเปิดแอพจาก Xcode คุณสามารถเปิดใช้งานได้ในภายหลัง

(วิธีแก้ปัญหาข้างต้นไม่ได้ผลสำหรับฉัน)


แปลก. ดูเหมือนจะแก้ไขปัญหานี้ให้ฉันด้วย! ทุกครั้งที่ฉันเริ่มการดีบักบนโปรแกรมจำลองฉันจะได้สัมผัสกับ -34018 OSStatus
midori

4

ฉันเพิ่งมีปัญหาเดียวกันกับโปรแกรมจำลองที่ใช้ 7.1 และ 8.0 ในขณะที่ทำการขุดฉันสังเกตเห็นว่าแอปตัวอย่างของ Apple เปิดใช้งาน KeyChain Sharing สำหรับความสามารถเป้าหมาย ฉันเปิดใช้งานสำหรับแอปของฉันซึ่งส่งผลให้มีการสร้างไฟล์สิทธิ์ที่ฉันทิ้งไว้พร้อมกับค่าเริ่มต้นและตอนนี้ฉันไม่ได้รับข้อผิดพลาด -34018 อีกต่อไป สิ่งนี้ไม่เหมาะ แต่ตอนนี้ฉันจะใช้ตัวเลือกการแชร์ KeyChain


4

การเขียนโค้ดชุด. xctest ไม่ใช่เรื่องง่ายอย่างที่คิดในบางกรณี โดยพื้นฐานแล้ว JorgeDeCorte ถูกต้องกับคำตอบของเขาว่าบรรทัดสั้น ๆ ที่ระบุเป็น a Run Scriptนั้นเพียงพอสำหรับ devs ส่วนใหญ่

codesign --verify --force --sign "$CODE_SIGN_IDENTITY" "$CODESIGNING_FOLDER_PATH"

แต่เมื่อคุณมีใบรับรองหลายใบในพวงกุญแจสิ่งนี้จะล้มเหลวในบรรทัดต่อไปนี้

iPhone Developer: ambiguous (matches "iPhone Developer: Your Name (ABC123DEF45)" and "iPhone Developer: Your Name (123ABC456DE)"

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

echo "codesign --verify --force --sign \"$CODE_SIGN_IDENTITY\" \"$CODESIGNING_FOLDER_PATH\""
IDENTITIES=`security find-identity -v -s "Code Signing" | grep "iPhone Developer" | awk '{ print $2 }'`

for SHA in $IDENTITIES; do
    codesign --verify --force --sign $SHA "$CODESIGNING_FOLDER_PATH"
    if [ $? -eq 0 ]; then
        echo "Matching identity found: $SHA"
        exit 0
    fi
done;

exit 1

4

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

คลิกที่ "แสดงโปรไฟล์การจัดสรร" และลบโปรไฟล์ที่เกี่ยวข้องโดยเฉพาะโปรไฟล์ของทีม:

รวมทั้งเครื่องหมายดอกจันด้วย หลังจากติดตั้งแอพใหม่ทุกอย่างก็กลับสู่สภาวะปกติ


สิ่งนี้ช่วยให้ฉันเรียกใช้แอปจาก Xcode และดำเนินการพัฒนาต่อ
salabaha

เมื่อสร้างรุ่น AdHoc คุณสามารถตรวจสอบได้ว่าใช้ PP ใดบ้าง หากคุณเห็น XC ใด ๆ : โปรไฟล์ให้ลบออกและรีเฟรช PP ของคุณ!
dogsgod

ฉันเห็นว่านี่อาจเป็นปัจจัยได้อย่างไร มีอะไรวุ่นวาย !! ทำความสะอาดบางอย่าง
เดวิด

3

ฉันได้แก้ไขปัญหานี้แล้ว (ฉันคิดว่า) ฉันมีโปรไฟล์การจัดเตรียมสัญลักษณ์ตัวแทนบนอุปกรณ์ของฉันซึ่งแสดงว่าไม่มีข้อมูลประจำตัวการลงนามที่ถูกต้อง ฉันยังมีโปรไฟล์การจัดเตรียมสำหรับแอปของฉันที่ถูกต้อง เมื่อฉันลบโปรไฟล์ตัวแทนฉันหยุดรับข้อผิดพลาด -34018

ฉันยังตรวจสอบให้แน่ใจด้วยว่าข้อมูลประจำตัวการเซ็นชื่อรหัสและโปรไฟล์การจัดเตรียมที่แสดงอยู่ในส่วนการเซ็นชื่อรหัสของการตั้งค่าการสร้างของเป้าหมายนั้นเหมือนกับรหัสสำหรับแอป (ไม่ใช่ "นักพัฒนา iPhone" ทั่วไป)


คล้ายกับสิ่งนี้ได้รับการแก้ไขสำหรับฉัน ตั้งค่าการลงนามรหัสระดับโครงการเป็น "นักพัฒนา iPhone" สำหรับการแก้ปัญหาและ "การแจกจ่าย iPhone" สำหรับรุ่น จากนั้นฉันก็ลบการแทนที่ในเป้าหมายหลักเพื่อให้พวกมันแสดงเหมือนเดิม ก่อนหน้านี้การบันทึกในพวงกุญแจล้มเหลว 100% ของเวลา หลังจากนั้นการบันทึกในพวงกุญแจดูเหมือนจะเสถียร
jowie

2

ฉันได้รับข้อผิดพลาด-34018ในแอปของฉัน (iOS 8.4) น้อยครั้งมาก หลังจากการตรวจสอบบางอย่างที่ฉันได้พบว่าปัญหานี้เกิดขึ้นเมื่อแอปขอข้อมูลจากพวงกุญแจบ่อยเกินไป
ตัวอย่างเช่นในสถานการณ์ของฉันคำขออ่านสองรายการสำหรับคีย์เฉพาะหนึ่งรายการพร้อมกันจากโมดูลแอปพลิเคชันที่แตกต่างกัน
เพื่อแก้ไขว่าฉันเพิ่งเพิ่มการแคชค่านี้ในหน่วยความจำ


1

ฉันประสบปัญหาเดียวกันหมดสีฟ้าทำงานบนอุปกรณ์ทดสอบด้วย Xcode 6.2, iPhone 6, iOS 8.3 เพื่อความชัดเจนสิ่งนี้ไม่พบในขณะที่เรียกใช้การทดสอบ Xcode แต่ในขณะที่เรียกใช้แอปจริงบนอุปกรณ์ของฉัน ในโปรแกรมจำลองนั้นใช้ได้ดีและการทำงานบนแอพนั้นมันก็ดีอย่างสมบูรณ์แบบจนกระทั่งเมื่อไม่นานมานี้

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

จากนั้นฉันเปลี่ยนระดับการช่วยการเข้าถึงชั่วคราวจากkSecAttrAccessibleAfterFirstUnlockเป็นkSecAttrAccessibleAlwaysThisDeviceOnlyเรียกใช้แอปและทำงานได้ดีและสามารถเขียนลงในพวงกุญแจได้ จากนั้นฉันก็เปลี่ยนกลับเป็นkSecAttrAccessibleAfterFirstUnlockและดูเหมือนว่าปัญหาจะหายไปอย่างถาวร "


1

เพิ่งโดนบั๊กนี้ใน Xcode 8 Beta 3 การเปิดใช้งานการแชร์พวงกุญแจดูเหมือนจะเป็นทางออกเดียว


1

ฉันมีปัญหาเดียวกัน แก้ไขโดยการตั้งค่าการแชร์พวงกุญแจ


1

(นี่ไม่ใช่คำตอบโดยตรงสำหรับคำถามของ OP แต่อาจช่วยผู้อื่นได้)

เริ่มรับข้อผิดพลาดของพวงกุญแจ -34018 อย่างต่อเนื่องในโปรแกรมจำลองหลังจากอัปเดต Xcode จากเวอร์ชัน 7.3.1 เป็น 8.0

ต่อไปนี้เคล็ดลับนี้จากคำตอบ daidai ของ ,

ปัญหาบางกรณีเกิดจากการลงนามแอปไม่ถูกต้อง คุณสามารถแยกแยะกรณีนี้ได้อย่างง่ายดายเนื่องจากปัญหาเกิดขึ้นซ้ำได้ 100%

พบว่าโปรไฟล์การจัดเตรียมได้ถูกตั้งค่าเป็นไม่มีในส่วนการลงนามของเป้าหมาย

อย่างไรก็ตามการตั้งค่าฟิลด์โปรไฟล์การจัดเตรียมเป็นค่าที่ถูกต้องไม่เพียงพอที่จะแก้ไขปัญหาในกรณีนี้

การตรวจสอบเพิ่มเติมพบว่าการให้สิทธิ์การแจ้งเตือนแบบพุชยังแสดงข้อผิดพลาด มีข้อความระบุว่า "เพิ่มคุณลักษณะการแจ้งเตือนแบบพุชไปยังรหัสแอปของคุณ" ขั้นตอนนี้เสร็จสมบูรณ์แล้ว แต่ขั้นตอน "เพิ่มสิทธิ์การแจ้งเตือนแบบพุชให้กับไฟล์สิทธิ์ของคุณ" ไม่ได้

หลังจากกด "แก้ไขปัญหา" เพื่อแก้ไขปัญหา Push Notification ข้อผิดพลาดของพวงกุญแจได้รับการแก้ไขแล้ว

สำหรับเป้าหมายนี้สิทธิ์ "แชร์พวงกุญแจ" ได้ถูกเปิดไว้แล้วในช่วงเวลาก่อนหน้านี้ การปิดเครื่องยังไม่ทำให้ข้อผิดพลาดของพวงกุญแจปรากฏขึ้นอีกครั้งดังนั้นจึงไม่ชัดเจนว่าจำเป็นในกรณีนี้หรือไม่



0

วิธีเดียวที่ใช้ได้ผลสำหรับฉันคือการจัดเก็บศูนย์สำหรับคีย์ที่ระบุก่อนจากนั้นจึงจัดเก็บค่าใหม่ของฉันด้วยการดำเนินการแยกต่างหาก มันจะล้มเหลวเนื่องจากข้อผิดพลาด -34018 ถ้าฉันพยายามเขียนทับค่าที่มีอยู่ แต่ตราบใดที่ฉันเก็บค่าศูนย์ไว้ก่อนแล้วค่าที่อัปเดตจะถูกจัดเก็บสำเร็จในทันทีหลังจากนั้น


0

วันนี้ฉันพบปัญหา -34018 นี้เมื่อเรียกใช้ SecItemDelete API สิ่งที่ฉันทำเพื่อแก้ไขปัญหานี้คือ 1. ต่อไปนี้ @ k1th solution https://stackoverflow.com/a/33085955/889892 2. เรียกใช้ SecItemDelete ในเธรดหลัก (ก่อนหน้านี้อ่านจากเธรดหลักดังนั้นให้จัดแนวนี้กับการลบ) .

ขออภัยมันกลับมาอีกครั้ง :(


0

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


0

อะไรที่เหมาะกับฉัน

  • เปิดการแชร์พวงกุญแจ
  • ใช้พวงกุญแจให้น้อยที่สุดและแคชข้อมูลในหน่วยความจำ UserPreferences ดิสก์ ฯลฯ
  • ลองใช้การดำเนินการ CRUD ของพวงกุญแจซ้ำหลาย ๆ ครั้งหากล้มเหลว
  • ใช้ DispatchQueue.sync เพื่อจัดเก็บ / ลบ / อัปเดตข้อมูล

0

สำหรับฉันมันเป็นปัญหาการลงนามแอป ฉันเพิ่งเปลี่ยนไปใช้ทีมเซ็นชื่อที่ถูกต้องใน Xcode และข้อผิดพลาดไม่เกิดขึ้นอีกต่อไป

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