NSUserDefaults ยังคงมีอยู่ผ่านการอัปเดตแอปใน Appstore หรือไม่


106

กรณีนี้หรือไม่ NSUserDefaults จะได้รับการรีเซ็ตเมื่อคุณส่งการอัปเดตไปยังแอปบน App Store หรือถูกรีเซ็ต

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

ไชโยนิค


ไฟล์ในเอกสารและไลบรารีจะถูกเก็บรักษาไว้ตามที่เอกสารอ้าง: developer.apple.com/library/ios/#DOCUMENTATION/iPhone/…
Geri Borbás

คำตอบ:


116

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


5
มีบางแห่งในเอกสารของ Apple ที่กล่าวถึงนี้หรือไม่?
Nick Cartwright

1
ขอโทษ - ฉันลืมขอบคุณสำหรับคำตอบด่วน! - หากใครสามารถหาลิงค์ไปยังเอกสารของ Apple ในรูปแบบใดก็ได้ที่ระบุว่าสิ่งนี้จะดีมาก .... ในเอกสารสำหรับ NSUserDefaults ไม่มีข้อความเกี่ยวกับเรื่องนี้ดังนั้นฉันคิดว่าฉัน (ไม่ถูกต้อง) ถือว่าค่าเริ่มต้นถูกล้าง นี่เป็นวิธีที่ปลอดภัยที่สุดสำหรับ Apple ในการอัปเดตแอปอย่างแน่นอน!
Nick Cartwright

อาจเป็นวิธีที่ปลอดภัยที่สุด แต่จะน่ารำคาญอย่างมากสำหรับผู้ใช้หากพวกเขาต้องตั้งค่าการตั้งค่าใหม่ทั้งหมดเมื่อใดก็ตามที่มีการอัปเดตแอป โดยทั่วไปฉันมีการอัปเดตแอปสามหรือสี่ครั้งต่อวัน ฉันแน่ใจว่าผู้ใช้ iPhone คนอื่น ๆ มีมากกว่านี้ การตั้งค่าการเช็ดสำหรับการอัปเดตแต่ละครั้งโดยทั่วไปจะทำให้ iPhone ของฉันใช้งานไม่ได้
Kristopher Johnson

1
ข้อมูลในโฟลเดอร์เอกสารสามารถหายไปได้อย่างง่ายดายเช่นเดียวกับ NSUserDefaults อย่างไรก็ตามทั้งคู่เป็นโอกาสที่หายากและไม่มีส่วนเกี่ยวข้องกับกระบวนการอัปเกรดตามปกติอย่างแน่นอน
coneybeare

1
ขอบคุณคริสโตเฟอร์ - และใช่ฉันเห็นด้วย ปัญหาของฉันคือฉันใช้ NSUserDefaults เพื่อจัดเก็บเหตุการณ์ที่เป็นโปรแกรมและต้องอาศัยการรีเซ็ตเมื่อติดตั้งแอป การทดสอบทั้งหมดของฉันบนอุปกรณ์ iPhone (และการทดสอบแอปเปิ้ล) ทดสอบแอปเป็นการติดตั้งใหม่ หากไม่มีเอกสารหรือวิธีทดสอบเป็นการอัปเดตฉันไม่สามารถทำซ้ำการอัปเดตขัดข้องที่ลูกค้าของเราประสบอยู่ในขณะนี้ สรุป - อาจเป็นบทเรียนที่เรียนรู้วิธีที่ยาก !!
Nick Cartwright

7

ฉันเชื่อคำตอบคือใช่มันจะยังคงมีอยู่ นอกจากนี้ยังได้รับการบันทึกไว้อย่างสมบูรณ์ภายใต้บท Application Directory ในคู่มือการเขียนโปรแกรม Apple iPhone OS


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

2

หากคุณมีโมเดล CoreData และคุณเปลี่ยนแปลงบางอย่างในโมเดลและอัปเดตโดยไม่จัดการการย้ายข้อมูลนั่นอาจเป็นสาเหตุที่ทำให้แอปของคุณขัดข้องเมื่ออัปเดต ...


ฉันคาดหวังว่ามันอาจจะเป็นกรณี :) ไม่ใช่ NSUserdefault
Julian Król

1

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

ประสบการณ์ของเราคือ NSUserDefaults จะไม่ถูกล้างเมื่อผู้ใช้อัปเดตแอปของเรา แต่หน้าจอการตั้งค่าไม่ได้รับการอัปเดตเช่นกัน


0

ระวังกรณีนี้เมื่อแอปของคุณทำงานในพื้นหลังและคุณไม่สามารถเข้าถึงค่าที่เก็บไว้ใน NSUserDefaults:

เอริค:

มีเธรดและข้อบกพร่องมากมายเกี่ยวกับเรื่องนี้ แต่มันเกิดขึ้นกับฉันอีกครั้งใน ios 9 ฉันมีแอพที่เปิดตัวในพื้นหลังเพื่อตอบสนองงาน NSURLSession และการผลักดันที่มีเนื้อหา หากฉันรีบูตโทรศัพท์และรอให้แอปเปิดใช้งานพื้นหลังเกิดขึ้นเมื่อเปิดแอปขึ้นมาฉันพบว่า [[NSUserDefaults standardUserDefaults] dictionaryRepresentation] มีค่าของระบบทั้งหมดเช่น AppleITunesStoreItemKinds เป็นต้น แต่ไม่มี ค่าใด ๆ ที่ฉันตั้งไว้ หากฉันบังคับออกและเปิดแอปใหม่ค่าทั้งหมดของฉันจะกลับมา มีวิธีใดบ้างที่จะหลีกเลี่ยงไม่ให้มันแคช standardUserDefaults "ว่าง" ก่อนที่โทรศัพท์จะถูกปลดล็อกหรืออย่างน้อยก็เพื่อกำหนดเวลาที่จะเกิดความสับสนและแก้ไขโดยไม่ต้องบังคับให้ออกจากแอป

เอสกิโม (eskimo1@apple.com):

ปัญหาคือในที่สุด NSUserDefaults ได้รับการสนับสนุนโดยไฟล์ในคอนเทนเนอร์ของแอปและคอนเทนเนอร์ของแอปของคุณอยู่ภายใต้การปกป้องข้อมูล หากคุณไม่ได้ทำอะไรเป็นพิเศษใน iOS 7 ขึ้นไปคอนเทนเนอร์ของคุณจะใช้ NSFileProtectionCompleteUntilFirstUserAuthentication ซึ่งเป็นค่าที่สืบทอดมาจากที่เก็บสำรองของ NSUserDefaults ดังนั้นคุณจึงไม่สามารถเข้าถึงได้ก่อนปลดล็อกครั้งแรก

IMO วิธีที่ดีที่สุดในการหลีกเลี่ยง NSUserDefaults สำหรับสิ่งที่คุณพึ่งพาในเส้นทางรหัสที่สามารถดำเนินการในพื้นหลังได้ แทนที่จะเก็บการตั้งค่าเหล่านั้นไว้ในไฟล์การตั้งค่าของคุณเองซึ่งเป็นการป้องกันข้อมูลที่คุณสามารถจัดการได้อย่างชัดเจน (ในกรณีนี้หมายถึง 'ตั้งค่าเป็น NSFileProtectionNone')

มีปัญหาสองประการกับ NSUserDefaults ในบริบทการปกป้องข้อมูล:

API ที่เป็นนามธรรมโดยสิ้นเชิง: การมีอยู่และที่ตั้งของที่เก็บสำรองไม่ถือว่าเป็นส่วนหนึ่งของ API นั้นดังนั้นคุณจึงไม่สามารถจัดการการปกป้องข้อมูลได้อย่างชัดเจน

หมายเหตุใน OS X NSUserDefaults เวอร์ชันล่าสุดได้รับการจัดการโดย daemon และผู้ที่พยายามจัดการที่เก็บสำรองโดยตรงจะประสบปัญหา เป็นเรื่องง่ายที่จะจินตนาการถึงสิ่งเดียวกันที่กำลังจะมาถึง iOS ในบางจุด

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

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

ที่มา: https://webcache.googleusercontent.com/search?q=cache:sR9eZNHpZtwJ:https://forums.developer.apple.com/thread/15685

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