Однією з важливих пасток, яку я зачепив сьогодні, є наступне:
У багатьох проектах я бачив єдину ціль програми та з різними ідентифікаторами набору, встановленими для кожної конфігурації цієї цілі. Тут все стає безладним. Розробники планували створити програму налагодження для конфігурації налагодження та робочу програму для цілі випуску.
Якщо ви зробите це, обидва додатки матимуть однакові 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