Waspadai kasus ini, saat aplikasi Anda berjalan di latar belakang dan Anda tidak dapat mengakses nilai yang disimpan di NSUserDefaults:
Ada banyak utas dan bug tentang ini, tetapi itu terjadi lagi pada saya di ios 9. Saya memiliki aplikasi yang diluncurkan di latar belakang sebagai tanggapan terhadap tugas NSURLSession dan dorongan yang tersedia konten. Reproduksi, jika saya me-reboot ponsel saya dan menunggu peluncuran latar belakang aplikasi saya terjadi, maka ketika saya membuka aplikasi saya menemukan bahwa [[NSUserDefaults standardUserDefaults] dictionaryRepresentation] berisi semua nilai sistem, misalnya AppleITunesStoreItemKinds, dll. Tetapi tidak mengandung salah satu nilai yang telah saya tetapkan. Jika saya menutup paksa dan meluncurkan kembali aplikasi, semua nilai saya kembali. Apakah ada cara untuk menghindarinya dengan melakukan cache pada standardUserDefaults yang "kosong" dari sebelum ponsel dibuka kuncinya, atau setidaknya untuk menentukan kapan ponsel rusak dan memperbaikinya tanpa harus menutup paksa aplikasi?
Masalahnya di sini adalah bahwa NSUserDefaults pada akhirnya didukung oleh file dalam penampung aplikasi Anda dan penampung aplikasi Anda tunduk pada perlindungan data. Jika Anda tidak melakukan apa pun yang khusus, pada iOS 7 dan yang lebih baru, penampung Anda menggunakan NSFileProtectionCompleteUntilFirstUserAuthentication, nilai yang diwarisi oleh penyimpanan pendukung NSUserDefaults, sehingga Anda tidak dapat mengaksesnya sebelum membuka kunci pertama.
IMO cara terbaik untuk mengatasi ini adalah dengan menghindari NSUserDefaults untuk hal-hal yang Anda andalkan di jalur kode yang dapat dijalankan di latar belakang. Alih-alih, simpan setelan tersebut di file preferensi Anda sendiri, yang perlindungan datanya dapat Anda kelola secara eksplisit (dalam hal ini berarti 'setel ke NSFileProtectionNone').
Ada dua masalah dengan NSUserDefaults dalam konteks perlindungan data:
Ini adalah API yang sepenuhnya abstrak: keberadaan dan lokasi penyimpanan cadangannya tidak dianggap sebagai bagian dari API tersebut, jadi Anda tidak dapat mengelola perlindungan datanya secara eksplisit.
Catatan Pada versi terbaru OS X NSUserDefaults dikelola oleh daemon dan orang-orang yang mencoba memanipulasi penyimpanan pendukungnya secara langsung mengalami masalah. Sangat mudah untuk membayangkan hal yang sama datang ke iOS di beberapa titik.
Bahkan jika perlindungan data dapat diubah, NSUserDefaults tidak memiliki mekanisme untuk mengklasifikasikan data berdasarkan konteks yang Anda gunakan; ini adalah API 'semua atau tidak sama sekali'. Dalam kasus Anda, Anda tidak ingin menghapus perlindungan dari semua default pengguna Anda, hanya yang perlu Anda akses di latar belakang sebelum membuka kunci pertama.
Terakhir, jika ada dari data ini yang benar-benar sensitif, Anda harus meletakkannya di rantai kunci. Khususnya, rantai kunci memang memiliki kemampuan untuk mengatur perlindungan data berdasarkan item per item.