Jedna ważna pułapka, w którą dziś wpadłem, jest następująca:
W wielu projektach widziałem jeden cel aplikacji iz różnymi identyfikatorami pakietów ustawionymi dla każdej konfiguracji tego celu. Tutaj robi się bałagan. Programiści zamierzali stworzyć aplikację do debugowania dla konfiguracji debugowania i aplikację produkcyjną dla celu wydania.
Jeśli to zrobisz, obie aplikacje będą współdzielić te same NSUserDefaults, gdy zostaną skonfigurowane w ten sposób
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults!.setObject("user12345", forKey: "userId")
userDefaults!.synchronize()
Powoduje to problemy w wielu miejscach:
- Wyobraź sobie, że ustawiłeś TAK dla klawisza, gdy specjalny ekran wprowadzający do aplikacji został pokazany użytkownikowi. Druga aplikacja również odczyta teraz TAK i nie pokaże wprowadzenia.
- Tak, niektóre aplikacje przechowują również tokeny OAuth w domyślnych ustawieniach użytkownika. W każdym razie ... W zależności od implementacji aplikacja rozpozna, że istnieje token i zacznie pobierać dane przy użyciu niewłaściwego tokena. Jest duża szansa, że zakończy się to niepowodzeniem z dziwnymi błędami.
Ogólnym rozwiązaniem tego problemu jest poprzedzenie kluczy domyślnych bieżącą, zbudowaną konfiguracją. Konfigurację można łatwo wykryć w czasie wykonywania, ustawiając różne identyfikatory pakietów dla swoich konfiguracji. Następnie po prostu przeczytaj identyfikator pakietu z NSBundle.mainBundle()
. Jeśli masz te same identyfikatory pakietów, musisz ustawić różne makra preprocesora, takie jak
#ifdef DEBUG
NSString* configuration = @"debug";
#elif RELEASE
NSString* configuration = @"release";
#endif
W Swift będzie wyglądać prawie tak samo:
#if DEBUG
let configuration = "debug"
#elseif RELEASE
let configuration = "release"
#endif