Tìm hiểu về Unique Identifiers trên ios
Ngày 21 tháng 3, 2013 Apple thông báo rằng từ ngày 01 tháng 5, 2013 tất cả các ứng dụng truy cập UDID của thiết bị sẽ không được chấp thuận and các nhà phát triển nên chuyển sang sử dụng "Vendor or Advertising identifiers introduced" trên iOS 6. Như vậy uniqueIdentifier đã không còn được sử dụng ...
Ngày 21 tháng 3, 2013 Apple thông báo rằng từ ngày 01 tháng 5, 2013 tất cả các ứng dụng truy cập UDID của thiết bị sẽ không được chấp thuận and các nhà phát triển nên chuyển sang sử dụng "Vendor or Advertising identifiers introduced" trên iOS 6.
Như vậy uniqueIdentifier đã không còn được sử dụng nữa, và bây giờ Apple cho chúng ta không phải một mà là 2 phương án lựa chọn thay thế.Nhưng cái nào là thích hợp để sử dụng? Trong bài viết này tôi sẽ nói về đặc điểm của mỗi phương án và bạn sẽ là người quyết định phương án tốt nhất cho dự án của mình.
CFUUID
Bắt đầu với phương pháp có từ sớm nhất, CFUUID đã có từ iOS 2.0. Nó nó là một phần của CoreFoundation package. CFUUIDCreate là phương thức bạn có thể sử dụng dể tạo CFUUIDRef và chúng ta có thể nhận một chuỗi NSString như sau:
CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault); NSString *cfuuidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid));
Điều càn biết về CFUUID là mỗi khi bạn gọi hàm CFUUIDCreate hệ thống sẽ trả về một mã định danh mới. Nếu bạn muốn lưu lại mã định danh này thì bạn phải sử dụng phương pháp lưu lại như NSUserDefaults, Keychain...
NSUUID
Đây là người em của CFUUID. NSUUID chỉ mới xuất hiện từ iOS 6. Nó hàu như là giống CFUUID ngoại trừ việc nó được viết bằng Objective-c. + (id)UUID là phương thức của lớp bạn có thể sử dụng để lấy một UUID và bạn có thể lấy một chuỗi NSString như bên dưới
NSString *uuid = [[NSUUID UUID] UUIDString];
Cũng giống như CFUUID thì mỗi lần gọi phương thức trên thì hệ thống sẽ trả về một mã định danh mới.
Advertiser Identifier
Một phương án mới trên iOS 6 là Advertiser Identifier đây là môt phần của AdSupport.framework. ASIdentifierManager singleton cung cấp phương thức advertisingIdentifier và khi bạn gọi phương thức trên bạn sẽ nhận được một biến NSUUID
NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
Không giống như việc gọi trực tiếp CFUUID và NSUUID, advertisingIdentifier được lưu trữ bởi hệ thống. Mặc dù vậy, trong một vài trường hợp nó sẽ bị khởi tạo lại. Nếu như người sử dụng thực hiện system reset (Settings.app -> General -> Reset -> Reset All Content and Settings) advertisingIdentifier sẽ được khởi tạo lại. Nếu người sử dụng thực hiện Settings.app -> General -> About -> Advertising -> Reset Advertising Identifier thì nó cũng sẽ bị khởi tạo lại. Có một điểm lưu ý là khi Advertising bị reset và ứng dụng của bạn đang chạy background thì việc bạn thực hiện câu lệnh để lấy advertisingIdentifier thì ngay lúc này advertisingIdentifier mới sẽ chưa dược trả về cho ứng dụng của ban. Bạn phải tắt hoàn toàn ứng dụng và khởi động lại ứng dụng thì bạn mới nhận được advertisingIdentifier mới từ hệ thống.
Identifier for Vendor (IDFV)
Phương pháp này được thêm vào từ iOS 6, nó là một phương thức mới của class UIDevice. Cũng giống như advertisingIdentifier, phương thức này trả về một NSUUID object.
NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
Tài liệu cho identifierForVendor nói như sau :
The value of this property is the same for apps that come from the same vendor running on the same device. A different value is returned for apps on the same device that come from different vendors, and for apps on different devices regardless of vendor.
Câu hỏi đặt ra là vendor là gì? Suy nghĩ đầu tiên của tôi là một tài khoản apple developer. Đây là một nhận định sai lầm. Tiếp theo tôi nghĩ có thể là AppIdentifierPrefix cũng là một nhận định sai làm. Vendor được định nghĩa rất đơn giản bởi 2 phần đầu tiên của CFBundleIdentifier. Ví dụ com.framgia.app1 và com.framgia.app2 sẽ có cùng một identifierForVendor do có cùng com.framgia.
Một lưu ý là khi tất cả các ứng dụng của cùng một vendor bị xoá bởi người sử dụng thì identifierForVendor sẽ bị reset.
UDID
Một phương pháp đáng tin cậy nhưng đã bị deprecated từ iOS 5. Khi sử dụng phương pháp này thì bạn sẽ nhận được một mã định danh mà không bị thay đổi trong bất kỳ trường hợp nào. Nhưng từ iOS 5 bạn không còn được sử dụng phương pháp này nữa.
NSString *udid = [[UIDevice currentDevice] uniqueIdentifier];
Tổng kết
*Các ứng dụng phải được khởi động lại để thấy sự thay đổi.
**Tất cả các ứng dụng từ nhà cung cấp đó phải được xóa để thay đổi giá trị.
Bài gốc