ระวังกรณีนี้เมื่อแอปของคุณทำงานในพื้นหลังและคุณไม่สามารถเข้าถึงค่าที่เก็บไว้ใน NSUserDefaults:
ปัญหาคือในที่สุด NSUserDefaults ได้รับการสนับสนุนโดยไฟล์ในคอนเทนเนอร์ของแอปและคอนเทนเนอร์ของแอปของคุณอยู่ภายใต้การปกป้องข้อมูล หากคุณไม่ได้ทำอะไรเป็นพิเศษใน iOS 7 ขึ้นไปคอนเทนเนอร์ของคุณจะใช้ NSFileProtectionCompleteUntilFirstUserAuthentication ซึ่งเป็นค่าที่สืบทอดมาจากที่เก็บสำรองของ NSUserDefaults ดังนั้นคุณจึงไม่สามารถเข้าถึงได้ก่อนปลดล็อกครั้งแรก
IMO วิธีที่ดีที่สุดในการหลีกเลี่ยง NSUserDefaults สำหรับสิ่งที่คุณพึ่งพาในเส้นทางรหัสที่สามารถดำเนินการในพื้นหลังได้ แทนที่จะเก็บการตั้งค่าเหล่านั้นไว้ในไฟล์การตั้งค่าของคุณเองซึ่งเป็นการป้องกันข้อมูลที่คุณสามารถจัดการได้อย่างชัดเจน (ในกรณีนี้หมายถึง 'ตั้งค่าเป็น NSFileProtectionNone')
มีปัญหาสองประการกับ NSUserDefaults ในบริบทการปกป้องข้อมูล:
API ที่เป็นนามธรรมโดยสิ้นเชิง: การมีอยู่และที่ตั้งของที่เก็บสำรองไม่ถือว่าเป็นส่วนหนึ่งของ API นั้นดังนั้นคุณจึงไม่สามารถจัดการการปกป้องข้อมูลได้อย่างชัดเจน
หมายเหตุใน OS X NSUserDefaults เวอร์ชันล่าสุดได้รับการจัดการโดย daemon และผู้ที่พยายามจัดการที่เก็บสำรองโดยตรงจะประสบปัญหา เป็นเรื่องง่ายที่จะจินตนาการถึงสิ่งเดียวกันที่กำลังจะมาถึง iOS ในบางจุด
แม้ว่าจะสามารถเปลี่ยนการปกป้องข้อมูลได้ แต่ NSUserDefaults ก็ไม่มีกลไกในการจำแนกข้อมูลตามบริบทที่คุณใช้ มันเป็น API 'ทั้งหมดหรือไม่มีเลย' ในกรณีของคุณคุณไม่ต้องการลบการป้องกันออกจากค่าเริ่มต้นของผู้ใช้ทั้งหมดเฉพาะการป้องกันที่คุณต้องการเข้าถึงในพื้นหลังก่อนที่จะปลดล็อกครั้งแรก
สุดท้ายหากข้อมูลใดมีความละเอียดอ่อนอย่างแท้จริงคุณควรใส่ไว้ในพวงกุญแจ ที่น่าสังเกตคือพวงกุญแจมีความสามารถในการตั้งค่าการปกป้องข้อมูลแบบทีละรายการ