오늘 제가 활용 한 한 가지 중요한 함정은 다음과 같습니다.
많은 프로젝트에서 단일 앱 대상과 해당 대상의 각 구성에 대해 다른 번들 식별자가 설정된 것을 보았습니다. 여기 일이 더러워집니다. 개발자가 의도 한 것은 디버그 구성 용 디버그 앱과 릴리스 대상 용 프로덕션 앱을 만드는 것이 었습니다.
그렇게하면 두 앱이 이렇게 설정 될 때 동일한 NSUserDefaults를 공유합니다.
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults!.setObject("user12345", forKey: "userId")
userDefaults!.synchronize()
이로 인해 여러 곳에서 문제가 발생합니다.
- 사용자에게 특별한 앱 소개 화면이 표시 될 때 키에 대해 YES를 설정했다고 가정 해보십시오. 이제 다른 앱도 YES를 읽고 인트로를 표시하지 않습니다.
- 예 일부 앱은 사용자 기본값에 oAuth 토큰도 저장합니다. 어쨌든 ... 구현에 따라 앱은 토큰이 있음을 인식하고 잘못된 토큰을 사용하여 데이터 검색을 시작합니다. 이상한 오류로 인해 실패 할 가능성이 높습니다.
일반적으로이 문제에 대한 해결책은 기본 키에 현재 빌드 된 구성을 접두사로 붙이는 것입니다. 구성에 대해 다른 번들 식별자를 설정하여 런타임에 구성을 쉽게 감지 할 수 있습니다. 그런 다음에서 번들 식별자를 읽습니다 NSBundle.mainBundle()
. 동일한 번들 식별자가있는 경우 다음과 같은 다른 전 처리기 매크로를 설정해야합니다.
#ifdef DEBUG
NSString* configuration = @"debug";
#elif RELEASE
NSString* configuration = @"release";
#endif
Swift에서는 거의 동일하게 보입니다.
#if DEBUG
let configuration = "debug"
#elseif RELEASE
let configuration = "release"
#endif