กับดักที่สำคัญอย่างหนึ่งที่ฉันใช้ในวันนี้มีดังต่อไปนี้:
ในหลายโครงการฉันเห็นเป้าหมายแอปเดียวและมีการตั้งค่าตัวระบุกลุ่มที่แตกต่างกันสำหรับแต่ละการกำหนดค่าของเป้าหมายนั้น ที่นี่สิ่งต่างๆยุ่งเหยิง สิ่งที่นักพัฒนาตั้งใจไว้คือสร้างแอปดีบักสำหรับการกำหนดค่าการดีบักและแอปที่ใช้งานจริงสำหรับเป้าหมายรุ่น
หากคุณทำเช่นนั้นทั้งสองแอปจะแชร์ 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