Cách tạo GUID / UUID bằng iOS


207

Tôi muốn có thể tạo GUID / UUID trên iPhone và iPad.

Mục đích là có thể tạo các khóa cho dữ liệu phân tán, tất cả đều duy nhất. Có cách nào để làm điều này với SDK iOS không?


3
Có một bài viết về cách đảm bảo bạn không bao giờ mất UUID đã tạo, ngay cả đối với iOS 5 trở lên khi sử dụng KeyChain. blog.onl Liquid.com/ từ
jasoares

Câu trả lời:


323
[[UIDevice currentDevice] uniqueIdentifier]

Trả về ID duy nhất của iPhone của bạn.

EDIT: -[UIDevice uniqueIdentifier]hiện không được chấp nhận và các ứng dụng đang bị từ chối khỏi App Store vì sử dụng nó. Phương pháp dưới đây bây giờ là phương pháp ưa thích.

Nếu bạn cần tạo một số UUID, chỉ cần sử dụng phương pháp này (với ARC):

+ (NSString *)GetUUID
{
  CFUUIDRef theUUID = CFUUIDCreate(NULL);
  CFStringRef string = CFUUIDCreateString(NULL, theUUID);
  CFRelease(theUUID);
  return (__bridge NSString *)string;
}

EDIT: Jan, 29 2014: Nếu bạn đang nhắm mục tiêu iOS 6 trở lên, giờ đây bạn có thể sử dụng phương pháp đơn giản hơn nhiều:

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

21
[[UIDevice currentDevice] uniqueIdentifier] đã bị từ chối kể từ iOS 5 và Apple hiện đang từ chối các ứng dụng sử dụng nó (kể từ tháng 3 năm 2012). Phần còn lại của phản ứng vẫn chính xác.
Gorm

13
Đã có câu hỏi này được một thời gian, tôi khá chắc chắn rằng câu hỏi ban đầu không phải là về định danh duy nhất của thiết bị, mà là về việc nhận được một định danh duy nhất chung hữu ích cho một cái gì đó.
Ryan McCuaig

12
Để làm cho ARC này tuân thủ, bạn phải truyền đối tượng chuỗi và loại bỏ lệnh gọi tự động. Nói cách khác, thêm các diễn viên: NSString * string = (__bridge_transfer NSString *) CFUUIDCreateString (NULL, theUUID);
Paul de Lange

65
Kể từ iOS 6, bạn có thể sử dụng: NSString * UUID = [[NSUUID UUID] UUIDString];
xứng

1
Nếu tôi sử dụng [[NSUUID UUID] UUIDString]; trong iOS7 trở lên, ứng dụng của tôi có bị Apple từ chối không?
Whoami

100

Đây là mã đơn giản tôi đang sử dụng, tuân thủ ARC.

+(NSString *)getUUID
{
    CFUUIDRef newUniqueId = CFUUIDCreate(kCFAllocatorDefault);
    NSString * uuidString = (__bridge_transfer NSString*)CFUUIDCreateString(kCFAllocatorDefault, newUniqueId);
    CFRelease(newUniqueId);

    return uuidString;
}

35
Thành thật mà nói đây phải là câu trả lời được chấp nhận, câu hỏi ban đầu yêu cầu trình tạo GUID hoặc UUID và mọi người trả lời với cách lấy UDID của điện thoại. Mã định danh duy nhất toàn cầu (UUID) và Mã nhận dạng thiết bị duy nhất (UDID) không giống nhau.
Joe

1
đây là một đường thẳng một NSString * UUID = [[NSUUID UUID] UUIDString];
Adeel

89

Trong iOS 6, bạn có thể dễ dàng sử dụng:

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

Thêm chi tiết trong Tài liệu của Apple


5
Đây là giải pháp đơn giản nhất. Nếu bạn không phải hỗ trợ trước iOS 6, hãy sử dụng cái này. Tôi đã sử dụng dữ liệu cốt lõi tạo ID vĩnh viễn, nhưng điều này tốt hơn nhiều. +1
Sean

Hoàn hảo, cảm ơn bạn vì điều này! Đây là câu trả lời +1 của tôi trong ngày :)
justinhartman

Nó thay đổi mỗi khi tôi chạy ứng dụng trong trình giả lập.
Gajendra K Chauhan

46

Xem lại tài liệu Nhà phát triển của Apple, tôi thấy đối tượng CFUUID có sẵn trên iPhone OS 2.0 trở lên.



22

Kỹ thuật đơn giản nhất là sử dụng NSString *uuid = [[NSProcessInfo processInfo] globallyUniqueString]. Xem tham chiếu lớp NSProcessInfo .


8
Điều đó trả về một định danh duy nhất cho quá trình. Nó không giống với GUID. Từ các tài liệu: "ID bao gồm tên máy chủ, ID tiến trình và dấu thời gian, đảm bảo rằng ID là duy nhất cho mạng"
Matt Spradley

Bạn có thể đúng. Đó là một lớp lót thực dụng và có lẽ không chống đạn như CFUUID. Bất cứ ai cần sự nghiêm ngặt hơn nên thả xuống CoreFoundation.
Ryan McCuaig


7

Tôi đã tải lên bản triển khai đơn giản nhưng nhanh chóng của lớp Guid cho ObjC tại đây: obj-c GUID

Guid* guid = [Guid randomGuid];
NSLog("%@", guid.description);

Nó có thể phân tích cú pháp đến và từ các định dạng chuỗi khác nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.