Apakah NSUserDefaults tetap ada melalui Pembaruan ke aplikasi di Appstore?

106

Apakah ini masalahnya? Apakah NSUserDefaults disetel ulang saat Anda mengirimkan pembaruan ke aplikasi di App Store, atau apakah mereka disetel ulang?

Aplikasi saya mogok saat diperbarui tetapi tidak mogok saat diunduh sepenuhnya - jadi saya mencoba menentukan apa yang mungkin berbeda dalam sesi yang diperbarui dengan sesi yang baru diunduh.

Cheers, Nick.

Nick Cartwright
sumber
File dalam Dokumen , dan Perpustakaan akan dipertahankan sebagai klaim dokumentasi: developer.apple.com/library/ios/#DOCUMENTATION/iPhone/…
Geri Borbás

Jawaban:

116

Mereka biasanya tidak disetel ulang kecuali pengguna menghapus aplikasi. Untuk data dasar, NSUserDefaults adalah cara terbaik untuk menyimpan data seperti preferensi, tanggal, string, dll. Jika Anda ingin menyimpan gambar dan file, sistem file adalah pilihan yang lebih baik.

coneybeare
sumber
5
Apakah ada di suatu tempat di dokumentasi Apple hal ini disebutkan?
Nick Cartwright
1
Maaf - saya lupa berterima kasih atas jawaban cepat Anda! - Jika ada yang dapat menemukan tautan ke segala bentuk dokumentasi Apple yang mengatakan ini, Ini akan sangat baik .... Dalam dokumentasi untuk NSUserDefaults tidak disebutkan apa-apa tentang ini, jadi saya pikir saya telah (secara tidak benar) mengasumsikan default dihapus. Tampaknya ini cara teraman bagi Apple untuk memperbarui aplikasi!
Nick Cartwright
Ini mungkin cara teraman, tetapi akan sangat menjengkelkan bagi pengguna jika mereka harus mengatur ulang semua preferensi mereka setiap kali aplikasi diperbarui. Saya biasanya memiliki tiga atau empat pembaruan aplikasi per hari; Saya yakin pengguna iPhone lain memiliki lebih banyak lagi. Menghapus preferensi untuk setiap pembaruan pada dasarnya akan membuat iPhone saya tidak dapat digunakan.
Kristopher Johnson
1
Data di folder dokumen bisa hilang semudah NSUserDefaults. Keduanya jarang terjadi, dan sama sekali tidak ada hubungannya dengan proses peningkatan normal
coneybeare
1
Terima kasih Kristopher - dan ya saya setuju. Masalah saya adalah saya telah menggunakan NSUserDefaults untuk menyimpan acara terprogram dan mengandalkannya untuk disetel ulang ketika aplikasi dipasang. Semua pengujian saya pada perangkat iPhone (dan pengujian Apel) menguji aplikasi sebagai penginstalan baru. Tanpa dokumentasi atau cara untuk menguji sebagai pembaruan, saya tidak dapat mengulangi kerusakan pembaruan yang dialami semua pelanggan kami sekarang. Singkatnya - mungkin pelajaran yang dipelajari dengan cara yang sulit !!
Nick Cartwright
7

Saya percaya jawabannya adalah YA, itu akan terus berlanjut. Ini juga sepenuhnya didokumentasikan di bawah bab Direktori Aplikasi di Panduan Pemrograman Apple iPhone OS.

leon
sumber
4
  1. Jawaban langsung untuk pertanyaan yang diposting: YA.
  2. Masalah Anda: Aplikasi Anda mengalami error karena masalah logika. Misalkan Anda menyimpan objek secara default dan aplikasi memeriksa nilainya saat peluncuran (atau di tempat lain). Dalam pembaruan Anda dapat mengubah cara pemeriksaan atau penggunaan, misalnya Anda mengharapkan nilai, tetapi objeknya nihil, atau sebaliknya. Ini dapat menyebabkan SIGABRT atau EXC_BAD_ACCESS.
John Smith
sumber
2

Jika Anda memiliki model CoreData dan Anda mengubah sesuatu dalam model dan pembaruan Anda, tanpa mengelola migrasi, itu mungkin alasan mengapa aplikasi Anda mogok saat pembaruan ...

Bojan Bozovic
sumber
Saya berharap itu mungkin kasus :) bukan NSUserdefault
Julian Król
1

Saya memiliki pengalaman serupa. Aplikasi kami menyimpan nomor versi di Settings.Bundle / Root.Plist. Ini akan ditampilkan melalui aplikasi Pengaturan iPhone. Apa yang kami temukan adalah bahwa pada Instal, nomor versi dimuat dari app bundle - oleh karena itu nomor versinya benar. Pada pembaruan namun nomor versi tidak berubah. Ini memberi kesan bahwa pengguna menjalankan versi aplikasi sebelumnya. Kami tidak memiliki logika apa pun yang ditautkan ke nomor versi, ini hanya untuk tampilan (ini dapat digunakan oleh staf pusat kontak saat mendiagnosis kesalahan).

Pengalaman kami adalah NSUserDefaults tidak dihapus ketika pengguna memperbarui aplikasi kami, tetapi tampilan Pengaturan juga tidak diperbarui.

Derek Knight
sumber
0

Waspadai kasus ini, saat aplikasi Anda berjalan di latar belakang dan Anda tidak dapat mengakses nilai yang disimpan di NSUserDefaults:

Eric:

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?

Eskimo ([email protected]):

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.

Sumber: https://webcache.googleusercontent.com/search?q=cache:sR9eZNHpZtwJ:https://forums.developer.apple.com/thread/15685

Grand M
sumber