NSUserDefaults ไม่ถูกล้างหลังจากถอนการติดตั้งแอปบนโปรแกรมจำลอง


95

นี่อาจฟังดู NOOB จริง! ฉันต้องการตรวจสอบว่าเป็นครั้งที่สองที่ผู้ใช้เข้าสู่แอปพลิเคชันของฉันหรือไม่ดังนั้นเพื่อรักษาจำนวนการรันที่ฉันใช้NSUserDefaultsอยู่ ฉันได้ดำเนินรหัสต่อไปนี้ในของฉันrootViewController's viewDidLoadวิธีการ:

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    NSLog(@"hello %ld", (long)[userDefaults integerForKey:@"runCount"]);

    if ([userDefaults integerForKey:@"runCount"] != 1) {
        //not the 2nd run
        [userDefaults setInteger:1 forKey:@"runCount"];
        NSLog(@"not 2nd run");
    } else {
        //second run or more
        NSLog(@"2nd run");
    }

    [userDefaults synchronize];

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


2
คุณได้ลองทดสอบบนอุปกรณ์จริงหรือยัง?
Henry F

คุณต้องล้างมันออกด้วยตนเองบนโปรแกรมจำลอง นี่คือวิธีการ
Sergey Kalinichenko

โปรดทำเครื่องหมายคำตอบที่ถูกต้องดังนั้นคำถามนี้จะไม่มีอีกต่อไปที่ยังไม่ได้
Anders

1
@Reza: [[NSUserDefaults standardUserDefaults] setObject: selectedLists forKey: UserID] แอพของฉันขัดข้องที่นี่ใน ios8 แม้ว่าจะทำงานได้ดีใน ios6 และ ios7 รายการที่เลือกใน NSMutable Array และUserIdเป็นสตริง
Manthan

@ แมนธานนี่เป็นปัญหาที่แตกต่างกันออกไป แต่ฉันประสบปัญหาเดียวกันกับที่อื่นและสาเหตุที่ทำให้เกิดความผิดพลาดคือแม้ว่าวัตถุที่ฉันบันทึกไว้สำหรับคีย์บางอย่างNSMutableArrayมันถูกบันทึกเป็น a NSArrayและการเปลี่ยนแปลงทำให้แอปของฉันขัดข้อง .. ผมขอแนะนำให้ประหยัดNSArrayและเมื่อคุณต้องการที่จะใช้มันในภายหลังหล่อมันใช้NSMutableArray [NSMutableArray arrayWithArray:array];ฉันหวังว่าจะช่วยได้
Reza Shayestehpour

คำตอบ:


169

ฉันคิดว่านี่เป็นเพราะข้อบกพร่องใน iOS8 Beta Simulator

ลักษณะการทำงานที่คาดไว้คือเมื่อแอปถูกลบ NSUserDefaults สำหรับแอปนั้นจะถูกลบเช่นกัน

  • อย่างไรก็ตาม NSUserDefaults จะไม่ถูกลบเมื่อคุณลบแอพออกจากตัวจำลอง
  • จะถูกลบอย่างถูกต้องเมื่อคุณลบออกจากอุปกรณ์จริงที่ใช้ iOS8

วิธีแก้ปัญหาที่รวดเร็วและน่ารำคาญในตอนนี้คือการคลิก iOS Simulator -> รีเซ็ตเนื้อหาและการตั้งค่า

Xcode 9.2 พร้อม Simulator 10 ยังคงแสดงปัญหานี้ ตอนนี้ตัวเลือกเมนูคือฮาร์ดแวร์ .. ลบเนื้อหาและการตั้งค่าทั้งหมด

ฉันส่งรายงานข้อผิดพลาด btw


45
ทดสอบบน iOS 8 GM แล้วและยังพบข้อบกพร่องอยู่ น่ารำคาญมาก.
Manfred Scheiner

1
ฉันยังสามารถยืนยันพฤติกรรมบั๊กกี้นี้ใน Xcode 6 GM simulator และ iOS 8 (12A365)!
Boris Brdarić

1
ลิงก์ Open Radar ที่มีอยู่สำหรับผู้ที่ต้องการติดตามกรณี: openradar.appspot.com/18540702
viggio24

1
ดูเหมือนว่าข้อบกพร่องจะได้รับการแก้ไขใน SDK 8.1 หลังจากอัปเดตเป็น XCode 6.1 (6A1052d)
kas-kad

2
สำหรับใครก็ตามที่ประสบปัญหาเดียวกัน หากคุณมีแอพมากกว่า 1 แอพในกลุ่มเดียวกันและแอพทั้งหมดกำลังใช้กลุ่มแอพ (เปิดภายใต้ความสามารถ) คุณจะต้องลบแอพทั้งหมดออกจากอุปกรณ์เพื่อให้ค่าเริ่มต้นของผู้ใช้ถูกล้าง เนื่องจากมีการแชร์ค่าเริ่มต้นของผู้ใช้แม้ว่าแอปใดแอปหนึ่งจะอยู่ในอุปกรณ์แอปนั้นจะไม่ถูกลบเนื่องจากแอปนั้นจะใช้ค่าเริ่มต้นของผู้ใช้
Ankit Srivastava

14

เนื่องจากรีเซ็ตเนื้อหาและการตั้งค่าเป็นตัวเลือกนิวเคลียร์คุณสามารถพิจารณาตัวเลือกอื่น ๆ อีกสองตัวเลือกจนกว่าจะแก้ไขข้อบกพร่องในโปรแกรมจำลอง iOS 8 / Xcode 6 GM:

  1. คุณสามารถลบไฟล์ plist ที่NSUserDefaultsเก็บไฟล์ได้ด้วยตนเอง ขณะนี้ตั้งอยู่ที่~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist มันน่าเบื่อเล็กน้อยที่จะค้นหาตัวจำลองที่เหมาะสมที่จะทำงานร่วมกับชื่อไดเรกทอรี UUID แก้ไข : 2014-10-28 20-34-52 เส้นทางที่ถูกต้อง: ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/data/Library/Preferences/com.yourcompany.yourapp.plist

  2. คุณสามารถทำการ "ผ่าตัด" บน plist นั้นได้ (อาจใช้ run script build phase) โดยใช้plistbuddyเช่น

/usr/libexec/plistbuddy -c "Set :BSDidMoveSqliteDb 0" path_to_plist


คุณหายไป / data / after / * some_device_id * /
เพื่อน

5

สำหรับใครก็ตามที่ประสบปัญหาเดียวกัน

หากคุณมีแอพมากกว่า 1 แอพในกลุ่มเดียวกันและแอพทั้งหมดกำลังใช้กลุ่มแอพ (เปิดภายใต้ความสามารถ) คุณจะต้องลบแอพทั้งหมดออกจากอุปกรณ์เพื่อให้ค่าเริ่มต้นของผู้ใช้ถูกล้าง

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


4

รหัสควรทำงานได้ดีบนอุปกรณ์ อาจมีข้อบกพร่องบางอย่างในโปรแกรมจำลอง

ลองรีเซ็ตเนื้อหาและการตั้งค่าสำหรับโปรแกรมจำลอง


1
การรีเซ็ตเนื้อหาและการตั้งค่าใช้งานได้และฉันไม่มีอุปกรณ์ให้ตรวจสอบในขณะนี้ tnx :)
Reza Shayestehpour

4

มันเป็นจุดบกพร่องและคุณสามารถลบ NSUserDefaults ด้วยรหัสต่อไปนี้

 NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
 [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];

2

แม้ว่านี่จะยังคงเป็นข้อบกพร่องอีกทางเลือกหนึ่งคือการลบคีย์เฉพาะใน NSUserDefaults เวลาส่วนใหญ่ในการทดสอบ / พัฒนาเราสนใจเพียงไม่กี่คีย์ไม่ใช่ทุกอย่างใน NSUserDefaults หากคุณสนใจเพียงไม่กี่คีย์มากกว่าที่ฉันเสนอให้เพิ่มremoveObjectForKey:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// ADD THIS TO SIMULATE CLEAN/EMPTY DEFAULTS, COMMENT OUT AFTER INITIAL EXECUTION.
// This will cause the TRUE case to be executed.
[userDefaults removeObjectForKey:@"runCount"]

NSLog(@"hello %ld", (long)[userDefaults integerForKey:@"runCount"]);

if ([userDefaults integerForKey:@"runCount"] != 1) {
    //not the 2nd run
    [userDefaults setInteger:1 forKey:@"runCount"];
    NSLog(@"not 2nd run");
} else {
    //second run or more
    NSLog(@"2nd run");
}

[userDefaults synchronize];

การเพิ่มremoveObjectForKeyการจำลองการเรียกใช้แอปครั้งแรกการแสดงความคิดเห็นจะจำลองการดำเนินการของแอปที่ตามมาทั้งหมด


2

ในกรณีของฉันฉันพบ * .plist ในไดเร็กทอรีต่อไปนี้:

[1] / Users / SOME-USERNAME / Library / Developer / CoreSimulator / Devices / SOME-DEVICE-ID /data/Library/Preferences/SP.UserDefaultsTest.plist

ปัญหา: การลบแอปใน xCode 6 (โปรแกรมจำลอง iOS 8) แต่ไฟล์ยังคงอยู่ในดิสก์ดังที่กล่าวไว้ข้างต้น

วิธีแก้ไข: การลบไฟล์ที่อยู่จากพา ธ [1] ด้วยตนเองและ NSUserDefaults จะหายไป

ดังนั้นวิธีที่น่ารำคาญในการรีเซ็ตตัวจำลองจึงไม่จำเป็นอีกต่อไป

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