Một cái bẫy quan trọng mà tôi đã mắc phải hôm nay là:
Trong nhiều dự án, tôi đã thấy một mục tiêu ứng dụng duy nhất và với các số nhận dạng gói khác nhau được đặt cho từng cấu hình của mục tiêu đó. Ở đây mọi thứ trở nên lộn xộn. Mục đích của các nhà phát triển là tạo một ứng dụng gỡ lỗi cho cấu hình gỡ lỗi và một ứng dụng sản xuất cho mục tiêu phát hành.
Nếu bạn làm như vậy, cả hai ứng dụng sẽ chia sẻ cùng một NSUserDefaults khi chúng được thiết lập như vậy
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults!.setObject("user12345", forKey: "userId")
userDefaults!.synchronize()
Điều này gây ra vấn đề ở nhiều nơi:
- Hãy tưởng tượng bạn đặt CÓ cho một khóa khi màn hình giới thiệu ứng dụng đặc biệt được hiển thị cho người dùng. Ứng dụng khác bây giờ cũng sẽ đọc CÓ và không hiển thị phần giới thiệu.
- Có một số ứng dụng cũng lưu trữ mã thông báo oAuth ở chế độ mặc định của người dùng. Dù sao thì ... Tùy thuộc vào việc triển khai, ứng dụng sẽ nhận ra rằng có một mã thông báo và bắt đầu truy xuất dữ liệu bằng cách sử dụng mã thông báo sai. Khả năng cao là điều này sẽ không thành công với các lỗi lạ.
Giải pháp cho vấn đề này nói chung là đặt tiền tố cho các khóa mặc định với cấu hình hiện tại được xây dựng. Bạn có thể dễ dàng phát hiện cấu hình trong thời gian chạy bằng cách đặt các số nhận dạng gói khác nhau cho cấu hình của mình. Sau đó, chỉ cần đọc số nhận dạng gói từ NSBundle.mainBundle()
. Nếu bạn có cùng một số nhận dạng gói, bạn cần đặt các macro tiền xử lý khác nhau như
#ifdef DEBUG
NSString* configuration = @"debug";
#elif RELEASE
NSString* configuration = @"release";
#endif
Trong Swift, nó sẽ gần như giống nhau:
#if DEBUG
let configuration = "debug"
#elseif RELEASE
let configuration = "release"
#endif