Friday, November 28, 2014

iOS: Unique Identifiers - Lấy ID duy nhất theo thiết bị




Một bài viết rất hay mình đọc được từ nguồn:

Hôm nay tạm dịch lại để mọi người cùng tham khảo.


Kể từ khi Apple không cho phép sử dụng hàm lấy UUID trong iOS, thì việc các lập trình viên muốn có được 1 ID duy nhất theo thiết bị để phục vụ cho một số mục đích trong ứng dụng của mình đã trở nên khó khăn. Apple đã đưa ra cho chúng ta 2 lựa chọn khác "Vendor hoặc Advertising identifiers". Bên cạnh đó, chúng ta còn có một số các phương thức khác nữa. Mỗi cách đều có những đặc điểm khác nhau và chúng ta phải quyết định chọn sử dụng cách nào cho mục đích trong ứng dụng của mình.



CFUUID

CFUUID có từ iOS 2.0, nó là một phần của gói CoreFoundation và vì vậy nó là API được viết theo phong cách C.

CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault);
NSString *cfuuidString = (NSString*)CFBridgingRelease(
                                        CFUUIDCreateString(kCFAllocatorDefault, cfuuid));

Điều mà chúng ta cần biết về CFUUID, nó không duy nhất trong mọi trường hợp. Mỗi lần mà chúng ta gọi CFUUIDCreate thì hệ thống trẻ về một ID mới. Do vậy, nếu bạn muốn một ID tồn tại duy nhất thì bạn sẽ phải tự làm điều đó thông qua việc lưu trữ bằng NSUserDefaults, Keychain, Pasteboard hoặc những thứ tương tự như vậy.


Ví dụ một CFUUID: 68753A44-4D6F-1226-9C60-0050E4C00067


NSUUID

NSUUID có mặt từ iOS 6, nó gần như giống hệt với CFUUID ngoại trừ nó đẹp hơn, hiện đại hơn với giao diện Objective-C

NSString *uuid = [[NSUUID UUID] UUIDString];

Và giống như CFUUID, nó cũng không tồn tại duy nhất, bạn phải tự giải quyết việc làm sao cho nó được duy nhất.

Ví dụ một NSUUID: 68753A44-4D6F-1226-9C60-0050E4C00067

Advertiser Identifier

Kể từ iOS 6, advertiser Identifier là một phần của framework AdSupport. Lớp singleton ASIdentifierManager định nghĩa phương thức advertisingIdentifier và trả về một thể hiện của lớp NSUUID

NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

Không giống như CFUUID và NSUUID, Advertiser Identifier tồn tại theo hệ thống, tuy nhiên sự tồn tại này không phải tuyệt đối. Một số trường hợp nếu người dùng reset lại hệ thống, reset lại các thiết lập thì ID này cũng sẽ được sinh mới lại mỗi khi chúng ta gọi hàm.

Settings.app -> General -> Reset -> Reset All Content and SettingsadvertisingIdentifier 
Settings.app -> General -> About -> Advertising -> Reset Advertising Identifier

Trong trường hợp ứng dụng của bạn đang chạy ngầm, ở background mode, nếu Advertiser Identifier bị reset, ứng dụng của bạn phải được khởi động lại thì giá trị ID mới sinh ra mới được cập nhật lại. Điều này có lẽ một phần là do lớp Singleton ASIdentifierManager.

Hơn nữa, khi sử dụng kiểu ID này, ứng dụng của bạn phải được khai báo với Apple khi bạn submit ứng dụng lên AppStore, trong đó bạn phải đánh dấu các điều khoản, xác nhận mình sử dụng Advertiser ID với mục đích gì, cũng hơi khó chịu :)

Ví dụ: 1E2DFA89-496A-47FD-9941-DF1FC4E6484A

Vendor ID (IDFV)

Có mặt trong iOS 6, cũng giống như AdverstisingIdentifier, nó trả về một đối tượng NSUUID 

NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

Một Vender được định nghĩa là phần một và phần 2 trong định dạng DNS của CFBundleIdentifier của ứng dụng. Ví dụ com.kensai.app1 và com.kensai.app2 sẽ có thể có cùng một Vendor ID là com.kensai. Nhưng với com.cannshine và com.mucdong sẽ có 2 Vendor ID hoàn toàn khác nhau.

Và nếu người sử dụng un-install toàn bộ các app trong một Vendor thì khi re-install lại, giá trị của Vendor ID sẽ bị thay đổi.

Ví dụ: 599F9C00-92DC-4B5C-9464-7971F01F8370

UUID

ID này đã bị Apple cấm sử dụng từ iOS 5

NSString *udid = [[UIDevice currentDevice] uniqueIdentifier];


Ví dụ: bb4d786633053a0b9c0da20d54ea7e38e8776da4

OpenUUID

Kể từ sau khi release iOS 5 và việc sử dụng UUID bị cấm thì OpenUUID là một mã nguồn mở cho việc tìm kiếm một UUID duy nhất được sử dụng rộng rãi nhất. Nó rất đơn giản để sử dụng và được hỗ trợ bởi một loại các nhà cung cấp quảng cáo.

NSString *openUDID = [OpenUDID value];

OpenUUID sử dụng một các rất hay để tạo ra ID tồn tại duy nhất trên các ứng dụng. Nó sử dụng một PasteBoard có tên đặc biệt để lưu trữ ID này. Với các này, các ứng dụng sử dụng OpenUUID khác biết nơi nào để tìm và lấy lại giá trị ID thay vì tạo mới nó.

Trong trường hợp hệ thống bị reset hoàn toàn thì giá trị ID này mới bị thay đổi lại.

Ví dụ: 0d943976b24c85900c764dd9f75ce054dc5986ff


Tải mã nguồn OpenUUID.


Sau đây là bản so sánh đánh giá của các loại UUID








No comments:

Post a Comment