2009-01-09 15 views
188

Tôi muốn có thể tạo GUID/UUID trên iPhone và iPad.Cách tạo GUID/UUID bằng SDK iPhone

Mục đích là để có thể tạo khóa cho dữ liệu được phân phối là tất cả 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 bằng cách sử dụng KeyChain. https://blog.onliquid.com/persistent-device-unique-identifier-ios-keychain/ – jasoares

Trả lời

306
[[UIDevice currentDevice] uniqueIdentifier] 

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

CHỈNH SỬA: -[UIDevice uniqueIdentifier] hiện không còn được dùng nữa và các ứng dụng đang bị từ chối từ App Store để sử dụng. Phương pháp dưới đây bây giờ là cách tiếp cận ưa thích.

Nếu bạn cần phải tạo ra nhiều 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 năm 2014: Nếu bạn đang nhắm mục tiêu iOS 6 trở lên, bạn có thể bây giờ sử dụng phương pháp đơn giản hơn nhiều:

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

[[UIDevice currentDevice] uniqueIdentifier] đã không còn được dùng như iOS 5, và Apple là bây giờ từ chối các ứng dụng sử dụng nó (tính đến tháng 3 năm 2012). Phần còn lại của câu trả lời vẫn chính xác. – Gorm

+11

Có được xung quanh câu hỏi này trong một thời gian, tôi khá chắc chắn câu hỏi ban đầu không phải là về định danh duy nhất của thiết bị, nhưng về chỉ nhận được một định danh duy nhất chung hữu ích cho một cái gì đó. –

+12

Để thực hiện việc tuân thủ ARC này, bạn phải bỏ đối tượng chuỗi và xóa cuộc gọi autorelease.Nói cách khác, thêm diễn viên: NSString * string = (__bridge_transfer NSString *) CFUUIDCreateString (NULL, theUUID); –

44

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

+0

đó là chính xác những gì tôi đã làm sau, nhờ – rustyshelf

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 số nhận dạng duy nhất cho quy trình. Nó không giống với GUID. Từ 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" –

+0

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

7

Tôi đã tải lên thực hiện đơn giản nhưng nhanh chóng của tôi về một lớp Guid cho ObjC đây: obj-c GUID

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

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

98

Đây là mã đơn giản mà 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; 
} 
+34

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

+1

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

82

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

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

Xem thêm chi tiết tại Apple's Documentations

+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 tính năng này. Tôi đã sử dụng dữ liệu cốt lõi được tạo ID cố định nhưng điều này tốt hơn nhiều. +1 – Sean

+0

Tuyệt vời, 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

+0

Nó thay đổi mỗi khi tôi chạy ứng dụng trong trình mô phỏng. –

19

Trong Swift:

var uuid: String = NSUUID().UUIDString 
println("uuid: \(uuid)") 
12

Trong Swift 3.0

var uuid = UUID().uuidString