User Default

Panther·2021년 4월 5일
0

https://developer.apple.com/documentation/foundation/userdefaults

"An interface to the user’s defaults database, where you store key-value pairs persistently across launches of your app."

키와 값 쌍으로 이뤄진 것을 앱의 launch에 걸쳐 저장할 수 있는 사용자의 기본값 데이터베이스를 위한 인터페이스입니다.

Declaration

class UserDefaults : NSObject

Overview

UserDefaults 클래스는 기본값 시스템과 상호작용하는 프로그램의 인터페이스를 제공합니다. 기본값 시스템은 앱이 사용자의 선호에 따라 대응할 수 있는 어떠한 움직임의 커스터마이징을 가능하도록 해줍니다. 예를 들어 측정 단위나 미디어 플레이백 속도와 같은 것을 사용자가 선호하는 형태로 설정할 수 있도록 합니다. 앱은 파라미터의 집합에 값을 부여하는 것을 통해 이러한 preference를 사용자의 기본값 데이터베이스에 저장합니다. 파라미터는 기본값으로 참조되는데, 그 이유는 앱의 기본값 상태를 결정하거나 기본값으로 설정된 작동방식을 결정하는데 사용되기 때문입니다.

런타임 시, 앱이 사용자의 기본값 데이터베이스로부터 사용하는 기본값을 읽기 위해 UserDefaults를 사용하게 될 것입니다. UserDefault는 기본값이 필요할 때마다 사용자의 기본값 데이터베이스를 여는 것을 피하기 위해서 메모리에 정보를 캐싱합니다. 기본값 값을 설정할 때, 프로세스 내부에 동기적으로 바뀌고, 비동기적으로 영구적 저장과 다른 프로세스가 바뀝니다.

중요
preference 하위시스템에 직접적으로 접근하려고 하지 않아야 합니다. preference property list 파일을 수정하는 것은 변경사항의 손실을 초래할 것이고, 변경사항 반영을 지연시키면서 앱은 충돌이 일어날 것입니다. preference를 설정하려면 macOS에 있는 defaults command-line 유틸리티를 사용하면 됩니다.

교육 기관에서 사용하는 기기를 제외하고, 사용자의 기본값은 개별 기기 로컬에 저장됩니다. 그리고 백업과 복구가 유지됩니다. preference와 연결된 사용자의 기기에 걸쳐 다른 데이터와 동기화시키려면, NSUbiquitousKeyValueStore를 사용하면 됩니다.

Storing Default Objects

UserDefaluts 클래스는 플롯, 더블, 인티저, 불린, URL처럼 일반적으로 사용하는 타입에 접근할 수 있도록 convenience 메소드를 제공합니다. Setting Default Values에서 앞서 언급한 메소드를 설명하고 있습니다.

기본값 객체는 프로퍼티 list여야 합니다. 즉 NSData, NSString, NSNumber, NSdate, NSArray, NSDictionary 인스턴스여야 한다는 의미입니다. 다른 객체 타입으로 저장하길 원한다면, NSData의 인스턴스르 생성하는 아카이빙이 필요합니다.

UserDefaults로부터 반환되는 값은 변경 가능한 객체로 설정했다고 하더라도 변경이 불가능합니다. 예를 들어 "MyStringDefault"라는 변경 가능한 스트링을 만들어놨다면, 이후 string(forKey:) 메소드를 통해 회수하게 되는 스트링은 변경이 불가능한 형태일 것입니다. 변경 가능한 스트링을 기본값으로 설정한 후 나중에 그 스트링을 바꾸려고 한다면, 기본값은 set(_:forKey:) 메소드를 다시 호출하지 않는 이상 변경하려고 했던 값이 반영되지는 않을 것입니다.

이와 관련해 더 많은 정보가 필요하다면 Preferences and Settings Programming Guide를 보시면 됩니다.

Preferences and Settings Programming Guide
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/UserDefaults/Introduction/Introduction.html#//apple_ref/doc/uid/10000059i

Persisting File References

파일 URL은 파일 시스템 내부 위치에 구체화되어 있습니다. 특정 파일을 위치에 저장하기 위해 set(:forKey:) 메소드를 사용하고 사용자가 그 파일을 옮기면, 앱이 다음에 launch될 때 그 파일은 위치하지 않을 것입니다. 레퍼런스의 시스템 아이덴티티를 파일에 저장하기 위해서는 NSURL 북마크 데이터를 생성하면 됩니다. bookmarkData(options:includingResourceValuesForKeys:relativeTo:) 메소드를 사용하면 되고, set(:forKey:) 메소드를 통해 보존시킬 수 있습니다. user default에 저장되어 있는 북마크 데이터를 해결하려면 URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error: 메소드를 사용하면 됩니다.

Responding to Defaults Changes

특정 기본값의 업데이트를 전달하려면 key-value observing을 사용할 수 있습니다. didChangeNotification을 위한 옵저버를 등록할 수 있고, 이를 통해 로컬 기본값 데이터베이스에 있는 모든 업데이트가 기본값 노티피케이션 센터를 통해 전달될 수 있도록 할 것입니다.

더 자세한 사항은 Key-Value Observing Programming Guide와 Notification Programming Topics에 설명되어 있습니다.

Key-Value Observing Programming Guide
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid/10000177i

Notification Programming Topics.
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Notifications/Introduction/introNotifications.html#//apple_ref/doc/uid/10000043i

Using Defaults in Managed Environments

앱이 managed environments를 지원하는 상황이라면, 사용자 이익을 위한 어떤 preference가 관리자로부터 결정되어야 하는지를 위해 UserDefaults를 사용할 수도 있습니다. 컴퓨터 연구실 혹은 classroom과 같은 managed environment에서는 관리자 혹은 선생님이 기본값 preference를 설정하는 것을 통해 시스템을 configure할 수 있습니다. Accessing Managed Environment Key에 나와 있는 메소드를 통해 preference를 결정하는 경우 설정된 preference를 변경할 수 없도록 disabling하거나 컨트롤을 숨겨야 합니다.

이에 대한 더 많은 정보가 필요하다면 Mobile Device Management Protocol Reference를 참고하면 됩니다.

Mobile Device Management Protocol Reference
https://developer.apple.com/business/documentation/MDM-Protocol-Reference.pdf#//apple_ref/doc/uid/TP40017387

교육기관에서 관리하는 기기를 실행하는 경우 적은 양의 데이터를 공유하기 위해서 아이클라우드 key-value store를 사용할 수 있습니다. 예를 들어 텍스트북 앱이 있다고 가정할 때, launch 시 앱의 다른 인스턴스가 같은 페이지를 열 수 있도록 현재 페이지가 어디인지 저장할 수 있도록 해줄 것입니다.

위와 관련해 참고할 수 있는 문서는 Preferences and Settings Programming Guide에 있는 Storing Preferences in iCloud 문서이며, 아래와 같습니다.

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/UserDefaults/StoringPreferenceDatainiCloud/StoringPreferenceDatainiCloud.html#//apple_ref/doc/uid/10000059i-CH7

Sandbox Considerations

샌드박스가 된 앱은 다른 앱에서 preference에 접근하거나 수정할 수 없습니다. 아래처럼 예외사항이 있긴 합니다.

  • macOS, iOS에서 앱 extension
  • macOS에 있는 앱 그룹 내 다른 앱

addSuite(named:) 메소드를 사용해 써드 파티 앱의 도메인을 추가한다고 해서 그 앱의 preference에 접근할 수 있도록 하지는 않습니다. 다른 앱의 preference를 접근하거나 수정하는 것을 시도하려고 해도 오류가 발생할 것입니다. 대신 macOS는 다른 앱의 실제 preference 파일을 읽거나 쓰는 것이 아니라 앱의 컨테이너 내에 존재하는 파일을 읽고 쓰게될 것입니다.

Thread Safety

UserDefaults 클래스는 스레드 세이프합니다.

0개의 댓글