이것이 사실입니까? NSUserDefaults는 App Store에서 앱에 업데이트를 제출할 때 재설정됩니까, 아니면 재설정됩니까?
내 앱이 업데이트 될 때 충돌이 발생하지만 완전히 다운로드 될 때 충돌하지 않습니다. 따라서 업데이트 된 세션에서 새로 다운로드 한 세션과 다를 수있는 사항을 확인하려고합니다.
건배, 닉.
이것이 사실입니까? NSUserDefaults는 App Store에서 앱에 업데이트를 제출할 때 재설정됩니까, 아니면 재설정됩니까?
내 앱이 업데이트 될 때 충돌이 발생하지만 완전히 다운로드 될 때 충돌하지 않습니다. 따라서 업데이트 된 세션에서 새로 다운로드 한 세션과 다를 수있는 사항을 확인하려고합니다.
건배, 닉.
답변:
사용자가 앱을 삭제하지 않는 한 일반적으로 재설정되지 않습니다. 기본 데이터의 경우 NSUserDefaults는 기본 설정, 날짜, 문자열 등과 같은 데이터를 저장하는 가장 좋은 방법입니다. 이미지와 파일을 저장하려는 경우 파일 시스템이 더 나은 방법입니다.
비슷한 경험이 있습니다. 우리 앱은 Settings.Bundle / Root.Plist에 버전 번호를 저장합니다. 이것은 iPhone 설정 앱을 통해 표시됩니다. 우리가 찾은 것은 설치에서 버전 번호가 앱 번들에서로드되므로 버전 번호가 정확하다는 것입니다. 그러나 업데이트시 버전 번호는 변경되지 않습니다. 이것은 사용자가 이전 버전의 앱을 실행하고 있다는 인상을줍니다. 우리는 버전 번호에 연결된 로직이 없으며 단지 디스플레이를위한 것입니다 (결함을 진단 할 때 컨택 센터 직원이 사용할 수 있음).
우리의 경험은 사용자가 앱을 업데이트 할 때 NSUserDefaults가 지워지지 않지만 설정 디스플레이도 업데이트되지 않는다는 것입니다.
앱이 백그라운드에서 실행 중이고 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입니다. 귀하의 경우 모든 사용자 기본값에서 보호를 제거하지 않고 처음 잠금을 해제하기 전에 백그라운드에서 액세스해야하는 항목 만 제거하고 싶지 않습니다.
마지막으로이 데이터가 정말로 민감한 경우 키 체인에 넣어야합니다. 특히, 키 체인에는 항목별로 데이터 보호를 설정할 수있는 기능이 있습니다.