XYUUID.m 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. //
  2. // XYUUID.m
  3. // XYUUID
  4. //
  5. // Created by steve on 2016/7/21.
  6. // Copyright © 2020 guojunliu.github.io. All rights reserved.
  7. //
  8. #import "XYUUID.h"
  9. #import <AdSupport/AdSupport.h>
  10. #import <UIKit/UIKit.h>
  11. #import "XYDeviceInfoUUID.h"
  12. #import "XYKeyChain.h"
  13. #if __has_include(<AppTrackingTransparency/AppTrackingTransparency.h>)
  14. #import <AppTrackingTransparency/AppTrackingTransparency.h>
  15. #endif
  16. static NSString *XY_ZeroIdfa = @"00000000-0000-0000-0000-000000000000";
  17. static NSString *STR_XYUUIDForInstall = @"XYUUID-Install";
  18. static NSString *STR_XYUUIDForKeyChain = @"XYUUID-KeyChain-ServiceDomain";
  19. static NSString *STR_XYUUIDForKeyChainAndDeviceOrIdfa = @"XYUUID-KeyChain-Device-Idfa";
  20. //static NSString *STR_XYUUIDForKeyChain = base64Decode:@"Y29tLkhvbGF2ZXJzZS5Ib2xhU3RhdGlzdGljYWw=";
  21. @interface XYUUID ()
  22. @property (nonatomic,copy) NSString *appOpenUUID;
  23. @end
  24. @implementation XYUUID
  25. + (instancetype)shareManager{
  26. static XYUUID *instantce = nil;
  27. static dispatch_once_t onceToken;
  28. dispatch_once(&onceToken, ^{
  29. if (instantce == nil) {
  30. instantce = [[XYUUID alloc] init];
  31. }
  32. });
  33. return instantce;
  34. }
  35. + (NSString *)uuid {
  36. return [[NSUUID UUID] UUIDString];
  37. }
  38. + (NSString *)uuidForInstall {
  39. NSString *uuid = [[NSUserDefaults standardUserDefaults] objectForKey:STR_XYUUIDForInstall];
  40. if (uuid && ![uuid isEqualToString:@""]) {
  41. return uuid;
  42. }
  43. uuid = [self uuid];
  44. [[NSUserDefaults standardUserDefaults] setObject:uuid forKey:STR_XYUUIDForInstall];
  45. return uuid;
  46. }
  47. + (NSString *)uuidForAppOpen {
  48. if ([XYUUID shareManager].appOpenUUID && ![[XYUUID shareManager].appOpenUUID isEqualToString:@""]) {
  49. return [XYUUID shareManager].appOpenUUID;
  50. }
  51. NSString *appOpenUUID = [self uuid];
  52. [XYUUID shareManager].appOpenUUID = appOpenUUID;
  53. return appOpenUUID;
  54. }
  55. + (NSString *)uuidForIDFA {
  56. if (@available(iOS 14.0, *)) {
  57. ATTrackingManagerAuthorizationStatus states = [ATTrackingManager trackingAuthorizationStatus];
  58. if (states == ATTrackingManagerAuthorizationStatusNotDetermined) {
  59. // 未提示用户
  60. return XY_ZeroIdfa;
  61. }
  62. else if (states == ATTrackingManagerAuthorizationStatusRestricted) {
  63. // 限制使用
  64. return XY_ZeroIdfa;
  65. }
  66. else if (states == ATTrackingManagerAuthorizationStatusDenied) {
  67. // 拒绝
  68. return XY_ZeroIdfa;
  69. }
  70. else if (states == ATTrackingManagerAuthorizationStatusAuthorized) {
  71. NSString *idfa = [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString];
  72. return idfa;
  73. }
  74. return XY_ZeroIdfa;
  75. }
  76. if (@available(iOS 10.0, *)) {
  77. BOOL canUseIDFA = [ASIdentifierManager sharedManager].advertisingTrackingEnabled; //如果返回的YES说明没有 “开启限制广告跟踪”,可以获取到正确的idfa 如果返回的是NO,说明等待你的就是00000000-0000-0000-0000-000000000000
  78. if (canUseIDFA) {
  79. NSString *idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
  80. return idfa;
  81. }
  82. return XY_ZeroIdfa;
  83. }
  84. // iOS 10以下关闭广告追踪,也可以正常获取到IDFA
  85. NSString *idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
  86. return idfa;
  87. }
  88. + (NSString *)uuidForIDFV {
  89. NSString *idfv = [UIDevice currentDevice].identifierForVendor.UUIDString;
  90. return idfv;
  91. }
  92. + (NSString *)uuidForDeviceInfo {
  93. NSString *uuid = [XYDeviceInfoUUID createDeviceInfoUUID];
  94. return uuid;
  95. }
  96. + (NSString *)uuidForKeychain {
  97. NSString *uuid = [XYKeyChain getDataWithServiceDomain:STR_XYUUIDForKeyChain];
  98. if (uuid && ![uuid isEqualToString:@""]) {
  99. return uuid;
  100. }
  101. uuid = [self uuid];
  102. [XYKeyChain setData:uuid serviceDomain:STR_XYUUIDForKeyChain];
  103. return uuid;
  104. }
  105. + (NSString *)uuidForDevice {
  106. NSString *deviceUUID = [XYKeyChain getDataWithServiceDomain:STR_XYUUIDForKeyChainAndDeviceOrIdfa];
  107. if (deviceUUID && ![deviceUUID isEqualToString:@""] && ![deviceUUID isEqualToString:XY_ZeroIdfa]) {
  108. return deviceUUID;
  109. }
  110. NSString *idfa = [self uuidForIDFA];
  111. if (idfa && ![idfa isEqualToString:@""] && ![idfa isEqualToString:XY_ZeroIdfa]) {
  112. [XYKeyChain setData:idfa serviceDomain:STR_XYUUIDForKeyChainAndDeviceOrIdfa];
  113. return idfa;
  114. }
  115. NSString *deviceInfoUUID = [self uuidForDeviceInfo];
  116. if (deviceInfoUUID && ![deviceInfoUUID isEqualToString:@""]) {
  117. [XYKeyChain setData:deviceInfoUUID serviceDomain:STR_XYUUIDForKeyChainAndDeviceOrIdfa];
  118. return deviceInfoUUID;
  119. }
  120. NSString *uuid = [self uuid];
  121. if (uuid && ![uuid isEqualToString:@""]) {
  122. [XYKeyChain setData:uuid serviceDomain:STR_XYUUIDForKeyChainAndDeviceOrIdfa];
  123. return uuid;
  124. }
  125. return @"";
  126. }
  127. @end