NSUserDefaults는 Appstore의 앱 업데이트를 통해 유지됩니까?


106

이것이 사실입니까? NSUserDefaults는 App Store에서 앱에 업데이트를 제출할 때 재설정됩니까, 아니면 재설정됩니까?

내 앱이 업데이트 될 때 충돌이 발생하지만 완전히 다운로드 될 때 충돌하지 않습니다. 따라서 업데이트 된 세션에서 새로 다운로드 한 세션과 다를 수있는 사항을 확인하려고합니다.

건배, 닉.


DocumentsLibrary 의 파일은 다음 과 같은 문서 클레임 으로 보존 됩니다. 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
감사합니다 Kristopher-네, 동의합니다. 내 문제는 NSUserDefaults를 사용하여 프로그래밍 이벤트를 저장하고 앱이 설치 될 때 재설정되는 데 의존했다는 것입니다. iPhone 장치에 대한 모든 테스트 (및 Apple 테스트)는 앱을 새 설치로 테스트했습니다. 문서 나 업데이트 테스트 방법이 없으면 모든 고객이 겪고있는 업데이트 충돌을 반복 할 수 없었습니다. 요약하자면, 아마도 어려운 방법으로 배운 교훈 일 것입니다!
Nick Cartwright

7

나는 대답이 예라고 믿는다. 그것은 지속될 것이다. 이 내용은 Apple iPhone OS 프로그래밍 가이드의 응용 프로그램 디렉토리 장에도 자세히 설명되어 있습니다.


4
  1. 게시 된 질문에 대한 직접 답변 : 예.
  2. 문제 : 논리 문제로 인해 앱이 다운됩니다. 개체를 기본값으로 저장하고 앱이 시작시 (또는 다른 곳에서) 값을 확인한다고 가정합니다. 업데이트에서 확인 또는 사용 방법을 변경할 수 있습니다. 예를 들어 값이 예상되지만 객체가 nil이거나 그 반대의 경우도 마찬가지입니다. 이로 인해 SIGABRT 또는 EXC_BAD_ACCESS가 발생할 수 있습니다.

2

CoreData 모델이 있고 마이그레이션을 관리하지 않고 모델 및 업데이트에서 무언가를 변경 한 경우 업데이트시 앱이 충돌하는 이유 일 수 있습니다.


나는 경우 :) 아닌 NSUserdefault 될 수 있다는 기대
줄리안 크롤

1

비슷한 경험이 있습니다. 우리 앱은 Settings.Bundle / Root.Plist에 버전 번호를 저장합니다. 이것은 iPhone 설정 앱을 통해 표시됩니다. 우리가 찾은 것은 설치에서 버전 번호가 앱 번들에서로드되므로 버전 번호가 정확하다는 것입니다. 그러나 업데이트시 버전 번호는 변경되지 않습니다. 이것은 사용자가 이전 버전의 앱을 실행하고 있다는 인상을줍니다. 우리는 버전 번호에 연결된 로직이 없으며 단지 디스플레이를위한 것입니다 (결함을 진단 할 때 컨택 센터 직원이 사용할 수 있음).

우리의 경험은 사용자가 앱을 업데이트 할 때 NSUserDefaults가 지워지지 않지만 설정 디스플레이도 업데이트되지 않는다는 것입니다.


0

앱이 백그라운드에서 실행 중이고 NSUserDefaults에 저장된 값에 액세스 할 수없는 경우이 경우에 유의하십시오.

Eric :

이에 대해 많은 스레드와 버그가 있었지만 iOS 9에서 다시 발생합니다. NSURLSession 작업 및 콘텐츠 사용 가능 푸시에 대한 응답으로 백그라운드에서 시작되는 앱이 있습니다. 재현 가능하게, 휴대 전화를 재부팅하고 앱의 백그라운드 실행이 발생할 때까지 기다리면 앱을 열 때 [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]에 모든 시스템 값 (예 : AppleITunesStoreItemKinds 등)이 포함되어 있지만 포함되지 않은 것을 발견했습니다. 내가 설정 한 값 중 하나입니다. 강제 종료하고 앱을 다시 실행하면 모든 가치가 다시 돌아옵니다. 전화가 잠금 해제되기 전에 "빈"standardUserDefaults를 캐싱하는 것을 피할 수있는 방법이 있습니까? 아니면 적어도 앱을 강제 종료 할 필요없이 언제 엉망이되었는지 확인하고 수정할 수 있습니까?

에스키모 (eskimo1@apple.com) :

여기서 문제는 NSUserDefaults가 궁극적으로 앱 컨테이너의 파일에 의해 지원되고 앱 컨테이너가 데이터 보호를 받는다는 것입니다. 특별한 조치를 취하지 않으면 iOS 7 이상에서 컨테이너가 NSUserDefaults 백업 저장소에 상속 된 값인 NSFileProtectionCompleteUntilFirstUserAuthentication을 사용하므로 처음 잠금을 해제하기 전에 액세스 할 수 없습니다.

IMO는이 문제를 해결하는 가장 좋은 방법은 백그라운드에서 실행할 수있는 코드 경로에서 의존하는 항목에 대해 NSUserDefaults를 피하는 것입니다. 대신 데이터 보호를 명시 적으로 관리 할 수있는 자체 환경 설정 파일에 이러한 설정을 저장하십시오 (이 경우 'NSFileProtectionNone으로 설정'을 의미 함).

데이터 보호 컨텍스트에서 NSUserDefaults에는 두 가지 문제가 있습니다.

완전히 추상적 인 API : 백업 저장소의 존재와 위치는 해당 API의 일부로 간주되지 않으므로 데이터 보호를 명시 적으로 관리 할 수 ​​없습니다.

참고 최근 버전의 OS X에서 NSUserDefaults는 데몬에 의해 관리되며 백업 저장소를 직접 조작하려는 사람들은 문제에 봉착했습니다. 어떤 시점에서 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.