今日私が利用した重要な罠の1つは、次のとおりです。
多くのプロジェクトで、単一のアプリターゲットがあり、そのターゲットの構成ごとに異なるバンドル識別子が設定されているのを見ました。ここで物事は厄介になります。開発者が意図したのは、デバッグ構成用のデバッグアプリと、リリースターゲット用の本番アプリを作成することでした。
そうすると、両方のアプリがそのように設定されたときに同じ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