├── .DS_Store ├── uuid ├── .DS_Store ├── ViewController.h ├── AppDelegate.h ├── main.m ├── ViewController.m ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── Info.plist ├── Base.lproj │ ├── Main.storyboard │ └── LaunchScreen.storyboard └── AppDelegate.m ├── uuid.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── wei.zhang.xcuserdatad │ │ └── UserInterfaceState.xcuserstate ├── xcuserdata │ └── wei.zhang.xcuserdatad │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── uuid.xcscheme └── project.pbxproj └── DeviceIDSource ├── UIDevice+DeviceIDByKeychainThisDeviceOnly.h └── UIDevice+DeviceIDByKeychainThisDeviceOnly.m /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrZhang-iOS/DeviceIdentifier/HEAD/.DS_Store -------------------------------------------------------------------------------- /uuid/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrZhang-iOS/DeviceIdentifier/HEAD/uuid/.DS_Store -------------------------------------------------------------------------------- /uuid.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /uuid.xcodeproj/project.xcworkspace/xcuserdata/wei.zhang.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrZhang-iOS/DeviceIdentifier/HEAD/uuid.xcodeproj/project.xcworkspace/xcuserdata/wei.zhang.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /uuid/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // uuid 4 | // 5 | // Created by wei.zhang on 2017/3/28. 6 | // Copyright © 2017年 wei.zhang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /uuid/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // uuid 4 | // 5 | // Created by wei.zhang on 2017/3/28. 6 | // Copyright © 2017年 wei.zhang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /DeviceIDSource/UIDevice+DeviceIDByKeychainThisDeviceOnly.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIDevice+DeviceIDByKeychainThisDeviceOnly.h 3 | // uuid 4 | // 5 | // Created by wei.zhang on 2017/3/28. 6 | // Copyright © 2017年 wei.zhang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UIDevice (DeviceIDByKeychainThisDeviceOnly) 12 | 13 | + (NSString*)identifierByKeychain; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /uuid/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // uuid 4 | // 5 | // Created by wei.zhang on 2017/3/28. 6 | // Copyright © 2017年 wei.zhang. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /uuid/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // uuid 4 | // 5 | // Created by wei.zhang on 2017/3/28. 6 | // Copyright © 2017年 wei.zhang. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | #import "UIDevice+DeviceIDByKeychainThisDeviceOnly.h" 11 | 12 | @interface ViewController () 13 | 14 | @end 15 | 16 | @implementation ViewController 17 | 18 | - (void)viewDidLoad { 19 | [super viewDidLoad]; 20 | 21 | NSString* test = [UIDevice identifierByKeychain]; 22 | NSLog(@"%@", test); 23 | } 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /uuid.xcodeproj/xcuserdata/wei.zhang.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | uuid.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | C855FAF61E8A6CAD00E23140 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /uuid/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "ipad", 35 | "size" : "29x29", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "29x29", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "40x40", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "40x40", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "76x76", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "76x76", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /uuid/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /uuid/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /uuid/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /uuid/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // uuid 4 | // 5 | // Created by wei.zhang on 2017/3/28. 6 | // Copyright © 2017年 wei.zhang. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | // Override point for customization after application launch. 20 | return YES; 21 | } 22 | 23 | 24 | - (void)applicationWillResignActive:(UIApplication *)application { 25 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 26 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 27 | } 28 | 29 | 30 | - (void)applicationDidEnterBackground:(UIApplication *)application { 31 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 32 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 33 | } 34 | 35 | 36 | - (void)applicationWillEnterForeground:(UIApplication *)application { 37 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 38 | } 39 | 40 | 41 | - (void)applicationDidBecomeActive:(UIApplication *)application { 42 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 43 | } 44 | 45 | 46 | - (void)applicationWillTerminate:(UIApplication *)application { 47 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 48 | } 49 | 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /uuid.xcodeproj/xcuserdata/wei.zhang.xcuserdatad/xcschemes/uuid.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /DeviceIDSource/UIDevice+DeviceIDByKeychainThisDeviceOnly.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIDevice+DeviceIDByKeychainThisDeviceOnly.m 3 | // uuid 4 | // 5 | // Created by wei.zhang on 2017/3/28. 6 | // Copyright © 2017年 wei.zhang. All rights reserved. 7 | // 8 | 9 | #import "UIDevice+DeviceIDByKeychainThisDeviceOnly.h" 10 | #import 11 | 12 | @implementation UIDevice (DeviceIDByKeychainThisDeviceOnly) 13 | 14 | + (NSString*)identifierByKeychain; 15 | { 16 | //该类方法没有线程保护,所以可能因异步而导致创建出不同的设备唯一ID,故而增加此线程锁! 17 | @synchronized ([NSNotificationCenter defaultCenter]) 18 | { 19 | NSString* service = @"CreateDeviceIdentifierByKeychain"; 20 | NSString* account = @"VirtualDeviceIdentifier"; 21 | //获取iOS系统推荐的设备唯一ID 22 | NSString* recommendDeviceIdentifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; 23 | recommendDeviceIdentifier = [recommendDeviceIdentifier stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 24 | NSMutableDictionary* queryDic = [NSMutableDictionary dictionary]; 25 | [queryDic setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; 26 | [queryDic setObject:service forKey:(__bridge id)kSecAttrService]; 27 | [queryDic setObject:(__bridge id)kCFBooleanFalse forKey:(__bridge id)kSecAttrSynchronizable]; 28 | [queryDic setObject:account forKey:(__bridge id)kSecAttrAccount]; 29 | [queryDic setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit];//默认值为kSecMatchLimitOne,表示返回结果集的第一个 30 | [queryDic setObject:(__bridge id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData]; 31 | CFTypeRef keychainPassword = NULL; 32 | //首先查询钥匙串是否存在对应的值,如果存在则直接返回钥匙串中的值 33 | OSStatus queryResult = SecItemCopyMatching((__bridge CFDictionaryRef)queryDic, &keychainPassword); 34 | if (queryResult == errSecSuccess) 35 | { 36 | NSString *pwd = [[NSString alloc] initWithData:(__bridge NSData * _Nonnull)(keychainPassword) encoding:NSUTF8StringEncoding]; 37 | if ([pwd isKindOfClass:[NSString class]] && pwd.length > 0) 38 | { 39 | return pwd; 40 | } 41 | else 42 | { 43 | //如果钥匙串中的相关数据不合法,则删除对应的数据重新创建 44 | NSMutableDictionary* deleteDic = [NSMutableDictionary dictionary]; 45 | [deleteDic setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; 46 | [deleteDic setObject:service forKey:(__bridge id)kSecAttrService]; 47 | [deleteDic setObject:(__bridge id)kCFBooleanFalse forKey:(__bridge id)kSecAttrSynchronizable]; 48 | [deleteDic setObject:account forKey:(__bridge id)kSecAttrAccount]; 49 | OSStatus status = SecItemDelete((__bridge CFDictionaryRef)deleteDic); 50 | if (status != errSecSuccess) 51 | { 52 | return recommendDeviceIdentifier; 53 | } 54 | } 55 | } 56 | if (recommendDeviceIdentifier.length > 0) 57 | { 58 | //创建数据到钥匙串,达到APP即使被删除也不会变更的设备唯一ID,除非系统抹除数据,否则该数据将存储在钥匙串中 59 | NSMutableDictionary* createDic = [NSMutableDictionary dictionary]; 60 | [createDic setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; 61 | [createDic setObject:service forKey:(__bridge id)kSecAttrService]; 62 | [createDic setObject:account forKey:(__bridge id)kSecAttrAccount]; 63 | [createDic setObject:(__bridge id)kCFBooleanFalse forKey:(__bridge id)kSecAttrSynchronizable];//不可以使用iCloud同步钥匙串数据,否则导致同一个iCloud账户的多个设备获取的唯一ID相同 64 | [createDic setObject:(__bridge id)kSecAttrAccessibleAlwaysThisDeviceOnly forKey:(__bridge id)kSecAttrAccessible];//增加一道保险,防止钥匙串数据被同步到其他设备,保证设备ID绝对唯一。 65 | [createDic setObject:[recommendDeviceIdentifier dataUsingEncoding:NSUTF8StringEncoding] forKey:(__bridge id)kSecValueData]; 66 | OSStatus createResult = SecItemAdd((__bridge CFDictionaryRef)createDic, nil); 67 | if (createResult != errSecSuccess) 68 | { 69 | NSLog(@"通过钥匙串创建设备唯一ID不成功!"); 70 | } 71 | } 72 | return recommendDeviceIdentifier; 73 | } 74 | } 75 | 76 | @end 77 | -------------------------------------------------------------------------------- /uuid.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | C855FAFC1E8A6CAD00E23140 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C855FAFB1E8A6CAD00E23140 /* main.m */; }; 11 | C855FAFF1E8A6CAD00E23140 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C855FAFE1E8A6CAD00E23140 /* AppDelegate.m */; }; 12 | C855FB021E8A6CAD00E23140 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C855FB011E8A6CAD00E23140 /* ViewController.m */; }; 13 | C855FB051E8A6CAD00E23140 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C855FB031E8A6CAD00E23140 /* Main.storyboard */; }; 14 | C855FB071E8A6CAD00E23140 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C855FB061E8A6CAD00E23140 /* Assets.xcassets */; }; 15 | C855FB0A1E8A6CAD00E23140 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C855FB081E8A6CAD00E23140 /* LaunchScreen.storyboard */; }; 16 | C8605E411E8BCF0600BBAD82 /* UIDevice+DeviceIDByKeychainThisDeviceOnly.m in Sources */ = {isa = PBXBuildFile; fileRef = C8605E401E8BCF0600BBAD82 /* UIDevice+DeviceIDByKeychainThisDeviceOnly.m */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXFileReference section */ 20 | C855FAF71E8A6CAD00E23140 /* uuid.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = uuid.app; sourceTree = BUILT_PRODUCTS_DIR; }; 21 | C855FAFB1E8A6CAD00E23140 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 22 | C855FAFD1E8A6CAD00E23140 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 23 | C855FAFE1E8A6CAD00E23140 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 24 | C855FB001E8A6CAD00E23140 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 25 | C855FB011E8A6CAD00E23140 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 26 | C855FB041E8A6CAD00E23140 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 27 | C855FB061E8A6CAD00E23140 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 28 | C855FB091E8A6CAD00E23140 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 29 | C855FB0B1E8A6CAD00E23140 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 30 | C8605E3F1E8BCF0600BBAD82 /* UIDevice+DeviceIDByKeychainThisDeviceOnly.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIDevice+DeviceIDByKeychainThisDeviceOnly.h"; sourceTree = ""; }; 31 | C8605E401E8BCF0600BBAD82 /* UIDevice+DeviceIDByKeychainThisDeviceOnly.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIDevice+DeviceIDByKeychainThisDeviceOnly.m"; sourceTree = ""; }; 32 | /* End PBXFileReference section */ 33 | 34 | /* Begin PBXFrameworksBuildPhase section */ 35 | C855FAF41E8A6CAD00E23140 /* Frameworks */ = { 36 | isa = PBXFrameworksBuildPhase; 37 | buildActionMask = 2147483647; 38 | files = ( 39 | ); 40 | runOnlyForDeploymentPostprocessing = 0; 41 | }; 42 | /* End PBXFrameworksBuildPhase section */ 43 | 44 | /* Begin PBXGroup section */ 45 | C855FAEE1E8A6CAD00E23140 = { 46 | isa = PBXGroup; 47 | children = ( 48 | C855FAF91E8A6CAD00E23140 /* uuid */, 49 | C855FAF81E8A6CAD00E23140 /* Products */, 50 | ); 51 | sourceTree = ""; 52 | }; 53 | C855FAF81E8A6CAD00E23140 /* Products */ = { 54 | isa = PBXGroup; 55 | children = ( 56 | C855FAF71E8A6CAD00E23140 /* uuid.app */, 57 | ); 58 | name = Products; 59 | sourceTree = ""; 60 | }; 61 | C855FAF91E8A6CAD00E23140 /* uuid */ = { 62 | isa = PBXGroup; 63 | children = ( 64 | C8605E3E1E8BCF0600BBAD82 /* DeviceIDSource */, 65 | C855FAFD1E8A6CAD00E23140 /* AppDelegate.h */, 66 | C855FAFE1E8A6CAD00E23140 /* AppDelegate.m */, 67 | C855FB001E8A6CAD00E23140 /* ViewController.h */, 68 | C855FB011E8A6CAD00E23140 /* ViewController.m */, 69 | C855FB031E8A6CAD00E23140 /* Main.storyboard */, 70 | C855FB061E8A6CAD00E23140 /* Assets.xcassets */, 71 | C855FB081E8A6CAD00E23140 /* LaunchScreen.storyboard */, 72 | C855FB0B1E8A6CAD00E23140 /* Info.plist */, 73 | C855FAFA1E8A6CAD00E23140 /* Supporting Files */, 74 | ); 75 | path = uuid; 76 | sourceTree = ""; 77 | }; 78 | C855FAFA1E8A6CAD00E23140 /* Supporting Files */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | C855FAFB1E8A6CAD00E23140 /* main.m */, 82 | ); 83 | name = "Supporting Files"; 84 | sourceTree = ""; 85 | }; 86 | C8605E3E1E8BCF0600BBAD82 /* DeviceIDSource */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | C8605E3F1E8BCF0600BBAD82 /* UIDevice+DeviceIDByKeychainThisDeviceOnly.h */, 90 | C8605E401E8BCF0600BBAD82 /* UIDevice+DeviceIDByKeychainThisDeviceOnly.m */, 91 | ); 92 | path = DeviceIDSource; 93 | sourceTree = SOURCE_ROOT; 94 | }; 95 | /* End PBXGroup section */ 96 | 97 | /* Begin PBXNativeTarget section */ 98 | C855FAF61E8A6CAD00E23140 /* uuid */ = { 99 | isa = PBXNativeTarget; 100 | buildConfigurationList = C855FB0E1E8A6CAD00E23140 /* Build configuration list for PBXNativeTarget "uuid" */; 101 | buildPhases = ( 102 | C855FAF31E8A6CAD00E23140 /* Sources */, 103 | C855FAF41E8A6CAD00E23140 /* Frameworks */, 104 | C855FAF51E8A6CAD00E23140 /* Resources */, 105 | ); 106 | buildRules = ( 107 | ); 108 | dependencies = ( 109 | ); 110 | name = uuid; 111 | productName = uuid; 112 | productReference = C855FAF71E8A6CAD00E23140 /* uuid.app */; 113 | productType = "com.apple.product-type.application"; 114 | }; 115 | /* End PBXNativeTarget section */ 116 | 117 | /* Begin PBXProject section */ 118 | C855FAEF1E8A6CAD00E23140 /* Project object */ = { 119 | isa = PBXProject; 120 | attributes = { 121 | LastUpgradeCheck = 0820; 122 | ORGANIZATIONNAME = wei.zhang; 123 | TargetAttributes = { 124 | C855FAF61E8A6CAD00E23140 = { 125 | CreatedOnToolsVersion = 8.2.1; 126 | DevelopmentTeam = 5R53TQY5U4; 127 | ProvisioningStyle = Automatic; 128 | }; 129 | }; 130 | }; 131 | buildConfigurationList = C855FAF21E8A6CAD00E23140 /* Build configuration list for PBXProject "uuid" */; 132 | compatibilityVersion = "Xcode 3.2"; 133 | developmentRegion = English; 134 | hasScannedForEncodings = 0; 135 | knownRegions = ( 136 | en, 137 | Base, 138 | ); 139 | mainGroup = C855FAEE1E8A6CAD00E23140; 140 | productRefGroup = C855FAF81E8A6CAD00E23140 /* Products */; 141 | projectDirPath = ""; 142 | projectRoot = ""; 143 | targets = ( 144 | C855FAF61E8A6CAD00E23140 /* uuid */, 145 | ); 146 | }; 147 | /* End PBXProject section */ 148 | 149 | /* Begin PBXResourcesBuildPhase section */ 150 | C855FAF51E8A6CAD00E23140 /* Resources */ = { 151 | isa = PBXResourcesBuildPhase; 152 | buildActionMask = 2147483647; 153 | files = ( 154 | C855FB0A1E8A6CAD00E23140 /* LaunchScreen.storyboard in Resources */, 155 | C855FB071E8A6CAD00E23140 /* Assets.xcassets in Resources */, 156 | C855FB051E8A6CAD00E23140 /* Main.storyboard in Resources */, 157 | ); 158 | runOnlyForDeploymentPostprocessing = 0; 159 | }; 160 | /* End PBXResourcesBuildPhase section */ 161 | 162 | /* Begin PBXSourcesBuildPhase section */ 163 | C855FAF31E8A6CAD00E23140 /* Sources */ = { 164 | isa = PBXSourcesBuildPhase; 165 | buildActionMask = 2147483647; 166 | files = ( 167 | C855FB021E8A6CAD00E23140 /* ViewController.m in Sources */, 168 | C8605E411E8BCF0600BBAD82 /* UIDevice+DeviceIDByKeychainThisDeviceOnly.m in Sources */, 169 | C855FAFF1E8A6CAD00E23140 /* AppDelegate.m in Sources */, 170 | C855FAFC1E8A6CAD00E23140 /* main.m in Sources */, 171 | ); 172 | runOnlyForDeploymentPostprocessing = 0; 173 | }; 174 | /* End PBXSourcesBuildPhase section */ 175 | 176 | /* Begin PBXVariantGroup section */ 177 | C855FB031E8A6CAD00E23140 /* Main.storyboard */ = { 178 | isa = PBXVariantGroup; 179 | children = ( 180 | C855FB041E8A6CAD00E23140 /* Base */, 181 | ); 182 | name = Main.storyboard; 183 | sourceTree = ""; 184 | }; 185 | C855FB081E8A6CAD00E23140 /* LaunchScreen.storyboard */ = { 186 | isa = PBXVariantGroup; 187 | children = ( 188 | C855FB091E8A6CAD00E23140 /* Base */, 189 | ); 190 | name = LaunchScreen.storyboard; 191 | sourceTree = ""; 192 | }; 193 | /* End PBXVariantGroup section */ 194 | 195 | /* Begin XCBuildConfiguration section */ 196 | C855FB0C1E8A6CAD00E23140 /* Debug */ = { 197 | isa = XCBuildConfiguration; 198 | buildSettings = { 199 | ALWAYS_SEARCH_USER_PATHS = NO; 200 | CLANG_ANALYZER_NONNULL = YES; 201 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 202 | CLANG_CXX_LIBRARY = "libc++"; 203 | CLANG_ENABLE_MODULES = YES; 204 | CLANG_ENABLE_OBJC_ARC = YES; 205 | CLANG_WARN_BOOL_CONVERSION = YES; 206 | CLANG_WARN_CONSTANT_CONVERSION = YES; 207 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 208 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 209 | CLANG_WARN_EMPTY_BODY = YES; 210 | CLANG_WARN_ENUM_CONVERSION = YES; 211 | CLANG_WARN_INFINITE_RECURSION = YES; 212 | CLANG_WARN_INT_CONVERSION = YES; 213 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 214 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 215 | CLANG_WARN_UNREACHABLE_CODE = YES; 216 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 217 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 218 | COPY_PHASE_STRIP = NO; 219 | DEBUG_INFORMATION_FORMAT = dwarf; 220 | ENABLE_STRICT_OBJC_MSGSEND = YES; 221 | ENABLE_TESTABILITY = YES; 222 | GCC_C_LANGUAGE_STANDARD = gnu99; 223 | GCC_DYNAMIC_NO_PIC = NO; 224 | GCC_NO_COMMON_BLOCKS = YES; 225 | GCC_OPTIMIZATION_LEVEL = 0; 226 | GCC_PREPROCESSOR_DEFINITIONS = ( 227 | "DEBUG=1", 228 | "$(inherited)", 229 | ); 230 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 231 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 232 | GCC_WARN_UNDECLARED_SELECTOR = YES; 233 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 234 | GCC_WARN_UNUSED_FUNCTION = YES; 235 | GCC_WARN_UNUSED_VARIABLE = YES; 236 | IPHONEOS_DEPLOYMENT_TARGET = 10.2; 237 | MTL_ENABLE_DEBUG_INFO = YES; 238 | ONLY_ACTIVE_ARCH = YES; 239 | SDKROOT = iphoneos; 240 | TARGETED_DEVICE_FAMILY = "1,2"; 241 | }; 242 | name = Debug; 243 | }; 244 | C855FB0D1E8A6CAD00E23140 /* Release */ = { 245 | isa = XCBuildConfiguration; 246 | buildSettings = { 247 | ALWAYS_SEARCH_USER_PATHS = NO; 248 | CLANG_ANALYZER_NONNULL = YES; 249 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 250 | CLANG_CXX_LIBRARY = "libc++"; 251 | CLANG_ENABLE_MODULES = YES; 252 | CLANG_ENABLE_OBJC_ARC = YES; 253 | CLANG_WARN_BOOL_CONVERSION = YES; 254 | CLANG_WARN_CONSTANT_CONVERSION = YES; 255 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 256 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 257 | CLANG_WARN_EMPTY_BODY = YES; 258 | CLANG_WARN_ENUM_CONVERSION = YES; 259 | CLANG_WARN_INFINITE_RECURSION = YES; 260 | CLANG_WARN_INT_CONVERSION = YES; 261 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 262 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 263 | CLANG_WARN_UNREACHABLE_CODE = YES; 264 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 265 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 266 | COPY_PHASE_STRIP = NO; 267 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 268 | ENABLE_NS_ASSERTIONS = NO; 269 | ENABLE_STRICT_OBJC_MSGSEND = YES; 270 | GCC_C_LANGUAGE_STANDARD = gnu99; 271 | GCC_NO_COMMON_BLOCKS = YES; 272 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 273 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 274 | GCC_WARN_UNDECLARED_SELECTOR = YES; 275 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 276 | GCC_WARN_UNUSED_FUNCTION = YES; 277 | GCC_WARN_UNUSED_VARIABLE = YES; 278 | IPHONEOS_DEPLOYMENT_TARGET = 10.2; 279 | MTL_ENABLE_DEBUG_INFO = NO; 280 | SDKROOT = iphoneos; 281 | TARGETED_DEVICE_FAMILY = "1,2"; 282 | VALIDATE_PRODUCT = YES; 283 | }; 284 | name = Release; 285 | }; 286 | C855FB0F1E8A6CAD00E23140 /* Debug */ = { 287 | isa = XCBuildConfiguration; 288 | buildSettings = { 289 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 290 | DEVELOPMENT_TEAM = 5R53TQY5U4; 291 | INFOPLIST_FILE = uuid/Info.plist; 292 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 293 | PRODUCT_BUNDLE_IDENTIFIER = ZZ.uuid; 294 | PRODUCT_NAME = "$(TARGET_NAME)"; 295 | }; 296 | name = Debug; 297 | }; 298 | C855FB101E8A6CAD00E23140 /* Release */ = { 299 | isa = XCBuildConfiguration; 300 | buildSettings = { 301 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 302 | DEVELOPMENT_TEAM = 5R53TQY5U4; 303 | INFOPLIST_FILE = uuid/Info.plist; 304 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 305 | PRODUCT_BUNDLE_IDENTIFIER = ZZ.uuid; 306 | PRODUCT_NAME = "$(TARGET_NAME)"; 307 | }; 308 | name = Release; 309 | }; 310 | /* End XCBuildConfiguration section */ 311 | 312 | /* Begin XCConfigurationList section */ 313 | C855FAF21E8A6CAD00E23140 /* Build configuration list for PBXProject "uuid" */ = { 314 | isa = XCConfigurationList; 315 | buildConfigurations = ( 316 | C855FB0C1E8A6CAD00E23140 /* Debug */, 317 | C855FB0D1E8A6CAD00E23140 /* Release */, 318 | ); 319 | defaultConfigurationIsVisible = 0; 320 | defaultConfigurationName = Release; 321 | }; 322 | C855FB0E1E8A6CAD00E23140 /* Build configuration list for PBXNativeTarget "uuid" */ = { 323 | isa = XCConfigurationList; 324 | buildConfigurations = ( 325 | C855FB0F1E8A6CAD00E23140 /* Debug */, 326 | C855FB101E8A6CAD00E23140 /* Release */, 327 | ); 328 | defaultConfigurationIsVisible = 0; 329 | defaultConfigurationName = Release; 330 | }; 331 | /* End XCConfigurationList section */ 332 | }; 333 | rootObject = C855FAEF1E8A6CAD00E23140 /* Project object */; 334 | } 335 | --------------------------------------------------------------------------------