Одна из важных ловушек, в которую я сегодня попался, заключается в следующем:
Во многих проектах я видел одну цель приложения и с разными идентификаторами пакетов, установленными для каждой конфигурации этой цели. Здесь все запутывается. Разработчики намеревались создать приложение отладки для конфигурации отладки и производственное приложение для целевой версии.
Если вы это сделаете, оба приложения будут использовать одни и те же NSUserDefaults, когда они настроены так
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults!.setObject("user12345", forKey: "userId")
userDefaults!.synchronize()
Это вызывает проблемы во многих местах:
- Представьте, что вы установили ДА для клавиши, когда пользователю был показан специальный вводный экран приложения. Другое приложение теперь также будет читать ДА и не показывать вступление.
- Да, некоторые приложения также хранят токены 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