精华内容
下载资源
问答
  • iOS 设备唯一标识UUID获取
    2020-09-14 14:57:22

    获取UUID  写了两个文件 CMKeyChain   CMUUIDManager

    用了好几年 表示挺好用的 分享下  该方法App卸载 UUID不变  可上架AppStore 本人已上线N个该方法App  相当于安卓的IMEI  

     

    用法很简单 写一个类方法就行了 导入头文件#import "CMUUIDManager.h"   代码如下

    + (NSString *)UUID{

        //获得UUID存入keyChain中

        NSUUID *UUID=[UIDevice currentDevice].identifierForVendor;

        NSString *uuidStr=[CMUUIDManager readUUID];

        

        if (uuidStr==nil){

            [CMUUIDManager deleteUUID];

            [CMUUIDManager saveUUID:UUID.UUIDString];

            uuidStr = UUID.UUIDString;

        }

        

        NSString *uuid = [[uuidStr componentsSeparatedByString:@"-"]lastObject];

        if (uuid.length>15) {

            uuid = [uuid substringFromIndex:uuid.length-15];

        }

        

        if (!uuid.length){

            uuid = @"UUID";

        }

        return uuid;

    }

     

    CMKeyChain   CMUUIDManager代码下载地址

    https://download.csdn.net/download/lixianyue1991/12840441

     

    更多相关内容
  • iOS获取唯一标识uuid

    2019-01-15 15:45:19
    iOS获取唯一标识,在不刷机的前提下,无论多次获取,还是卸载后重装程序,获取的 uuid 都不会发生改变
  • iOS-设置uuid卸载安装后保持不变问题 因为系统的获取方法[UIDevice currentDevice].identifierForVendor.UUIDString 拿到的uuidstring,再次卸载后,有可能会变化,所以不能保证...参考: iOS获取UUID(唯一不变哦) ...

    iOS-设置uuid卸载安装后保持不变问题

    参考: iOS获取UUID(唯一不变哦)

    UUIDString 的理解

    因为系统的获取方法[UIDevice currentDevice].identifierForVendor.UUIDString 拿到的uuidstring,再次卸载后,有可能会变化,所以不能保证拿到的值是唯一不变的。

    需要将获取到的值保存到钥匙串来保证卸载重装之后,能取到不变的值。
    先配置项目打开钥匙串权限:
    在这里插入图片描述

    实现保存keychain的方法后,获取uuid可以通过gleGetKeyCWithUUIDKey的方法来拿到唯一不变的值。

    uuid说明

    UUIDString 的理解
    [UIDevice currentDevice].identifierForVendor.UUIDString
    通过系统提供的获取uuidstring 的方式返回的由数字和字母组成的用来标识唯一设备的字符串。
    identifierForVendor
    一个由字母和数字组成的字符串,唯一地将设备标识给应用程序的供应商
    按个人理解,就是uuidstring的变化,有vendor决定。 如果同一厂商有不同的app,同时存在,删除某一个(A),则在重新安装那一个(A),A的uuidstring还是不变的,不会重置,如果该厂商下的app全部删除了,那么A的uuidstring就会被重置。

    代码参考

    [UIDevice currentDevice].identifierForVendor.UUIDString
    通过系统提供的获取uuidstring 的方式返回的由数字和字母组成的用来标识唯一设备的字符串。

    保存到keychain到方法如下:

    //  GLEKeyCStore.h
    #import <Foundation/Foundation.h>
    NS_ASSUME_NONNULL_BEGIN
    
    @interface GLEKeyCStore : NSObject
    + (void)gleSave:(NSString*)service data:(id)data;
    + (id)gleLoad:(NSString*)service;
    + (void)gleDeleteKeyData:(NSString*)service;
    + (NSString *)gleGetKeyCWithUUIDKey:(NSString *)uuidKey;
    @end
    
    NS_ASSUME_NONNULL_END
    
    
    //  GLEKeyCStore.m
    #import "GLEKeyCStore.h"
    @implementation GLEKeyCStore
    
    + (NSMutableDictionary *)gleGetKeyChainQuery:(NSString *)service {
        return [NSMutableDictionary dictionaryWithObjectsAndKeys:
                (id)kSecClassGenericPassword, (id)kSecClass,
                service, (id)kSecAttrService,
                service, (id)kSecAttrAccount,
                (id)kSecAttrAccessibleAfterFirstUnlock, (id)kSecAttrAccessible,
                nil];
    }
    
    + (void)gleSave:(NSString *)service data:(id)data {
        NSMutableDictionary *keyCQuery = [self gleGetKeyChainQuery:service];
        
        SecItemDelete((CFDictionaryRef)keyCQuery);
        [keyCQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData];
        SecItemAdd((CFDictionaryRef)keyCQuery, NULL);
    }
    
    + (id)gleLoad:(NSString *)service {
        id ret = nil;
        NSMutableDictionary *keyCQery = [self gleGetKeyChainQuery:service];
        [keyCQery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
        [keyCQery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
        CFDataRef keyData = NULL;
        if (SecItemCopyMatching((CFDictionaryRef)keyCQery, (CFTypeRef *)&keyData) == noErr) {
            @try {
                ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge  NSData *)keyData];
            } @catch (NSException *exception) {
                DEBUGLog(@"saveKeyStore: unarchiveof %@", service, exception);
            } @finally {
                
            }
        }
        if (keyData) {
            CFRelease(keyData);
        }
        return ret;
    }
    
    + (void)gleDeleteKeyData:(NSString *)service {
        NSMutableDictionary *keyCQuery = [self gleGetKeyChainQuery:service];
        SecItemDelete((CFDictionaryRef)keyCQuery);
    }
    
     
    + (NSString *)gleGetKeyCWithUUIDKey:(NSString *)uuidKey {
        // uuid 通过系统方法第一次拿到uuid的值,然后保存到keychain,主要是通过ad的方式,用户拒绝的话有可能拿到空值,所以直接取了uuidstring的值,该值也可以通过算法自己生成,需要保持唯一。
        // key 直接用的bundId
        NSString *tmpKeyStr = [NSBundle mainBundle].bundleIdentifier;
        NSString *strUUID = (NSString *)[GLEKeyCStore gleLoad:tmpKeyStr];
        if ((!strUUID) || (strUUID.length == 0) || [strUUID isEqual:@""]) {
            strUUID = [tmpKeyStr stringByAppendingFormat:@"%@-enterpriseOfGlbank", [[UIDevice currentDevice].identifierForVendor UUIDString]];
            [GLEKeyCStore gleSave:tmpKeyStr data:strUUID];
        }
        return strUUID;
    }
    @end
    
    展开全文
  • iOS UUID库可以替代旧的良好UDID和identifierForVendor 。 该库提供了最简单的API,以获取具有不同级别的通用唯一标识符。 可以检索为同一用户的所有设备创建的UUID ,通过这种方式在服务器端的帮助下,可以轻松...
  • iOS获取UUID(唯一不变哦)

    万次阅读 2018-06-04 16:53:44
    获取UUID的方法有很多,但是都会因为各种原因改变/** 卸载应用重新安装后会不一致*/ + (NSString *)getUUID{ CFUUIDRef uuid = CFUUIDCreate(NULL); NSString *UUID = (__bridge_transfer NSString *)...

    获取UUID的方法有很多,但是都会因为各种原因改变

    /**  卸载应用重新安装后会不一致*/
    + (NSString *)getUUID{
        CFUUIDRef uuid = CFUUIDCreate(NULL);
        NSString *UUID = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, uuid);
        CFRelease(uuid);
        return UUID;
    }
    
    /**  卸载应用重新安装后会不一致*/
    + (NSString *)getUUID{
        return [UIDevice currentDevice].identifierForVendor.UUIDString;;
    }
    
    /** 不会因为应用卸载改变 
      * 但是用户在设置-隐私-广告里面限制广告跟踪后会变成@"00000000-0000-0000-0000-000000000000"
      * 重新打开后会变成另一个,还原广告标识符也会变
      */
    + (NSString *)getUUID{
        return [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
    }
    

    作为设备唯一的标识符,一言不合就变了肯定是不行的呀

    在产品汪的逼迫下,在我不懈的努力下,我终于找到一个可以一直保持一致的方法。第一次获取成功后保存到钥匙串,然后每次使用都通过钥匙串去拿。

    第一步,打开应用的钥匙串权限

    Target - Capabilities - KeychainSharing - ON

    第二步,复制粘贴代码,懒得复制的可以去我的Github上直接下载

    先粘.h文件

    #import <Foundation/Foundation.h>
    
    @interface KeyChainStore : NSObject
    + (void)save:(NSString*)service data:(id)data;
    + (id)load:(NSString*)service;
    + (void)deleteKeyData:(NSString*)service;
    @end
    

    再粘.m文件

    #import "KeyChainStore.h"
    
    @implementation KeyChainStore
    
    + (NSMutableDictionary*)getKeychainQuery:(NSString*)service {
        return[NSMutableDictionary dictionaryWithObjectsAndKeys:
               (id)kSecClassGenericPassword,(id)kSecClass,
               service,(id)kSecAttrService,
               service,(id)kSecAttrAccount,
               (id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,
               nil];
    }
    
    + (void)save:(NSString*)service data:(id)data{
        //Get search dictionary
        NSMutableDictionary*keychainQuery = [self getKeychainQuery:service];
        //Delete old item before add new item
        SecItemDelete((CFDictionaryRef)keychainQuery);
        //Add new object to searchdictionary(Attention:the data format)
        [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data]forKey:(id)kSecValueData];
        //Add item to keychain with the searchdictionary
        SecItemAdd((CFDictionaryRef)keychainQuery,NULL);
    }
    
    + (id)load:(NSString*)service {
        id ret =nil;
        NSMutableDictionary*keychainQuery = [self getKeychainQuery:service];
        //Configure the search setting
        //Since in our simple case we areexpecting only a single attribute to be returned (the password) wecan set the attribute kSecReturnData to kCFBooleanTrue
        [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
        [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
        CFDataRef keyData =NULL;
        if(SecItemCopyMatching((CFDictionaryRef)keychainQuery,(CFTypeRef*)&keyData) ==noErr){
            @try{
                ret =[NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData*)keyData];
            }@catch(NSException *e) {
                NSLog(@"Unarchiveof %@ failed: %@",service, e);
            }@finally{
            }
        }
        if(keyData)
            CFRelease(keyData);
        return ret;
    }
    
    + (void)deleteKeyData:(NSString*)service {
        NSMutableDictionary*keychainQuery = [self getKeychainQuery:service];
        SecItemDelete((CFDictionaryRef)keychainQuery);
    }
    
    @end

    第三步,使用(直接调这个方法就可以了)

    /**  获取UUID*/
    + (NSString *)getUUIDByKeyChain{
        // 这个key的前缀最好是你的BundleID
        NSString*strUUID = (NSString*)[KeyChainStore load:@"com.mycompany.myapp.usernamepassword"];
        //首次执行该方法时,uuid为空
        if([strUUID isEqualToString:@""]|| !strUUID)
        {
            // 获取UUID 这个是要引入<AdSupport/AdSupport.h>的
            strUUID = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
            
            if(strUUID.length ==0 || [strUUID isEqualToString:@"00000000-0000-0000-0000-000000000000"])
            {
                //生成一个uuid的方法
                CFUUIDRef uuidRef= CFUUIDCreate(kCFAllocatorDefault);
                strUUID = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault,uuidRef));
                CFRelease(uuidRef);
            }
            
            //将该uuid保存到keychain
            [KeyChainStore save:@"com.mycompany.myapp.usernamepassword" data:strUUID];
        }
        return strUUID;
    }

    无论你怎么折腾都会保证同一设备每次获取到的UUID都是一致的,卸载应用,开启广告限制跟踪,系统升级都不会有影响。越狱刷机这种骚操作我没有测过,即使有问题,感觉这些调皮的用户也可以忽略了,因为这个已经是目前最好的解决办法了,如果大家有什么更好的解决方案,还请评论区指正。

    参考资料:https://blog.csdn.net/wsdxsYB/article/details/51773494

    展开全文
  • ios确保UUID唯一

    2017-02-21 13:11:19
    ios在需要用到上报客户端的时候需要确保UUID的一致性,几句代码就能搞定! 自己使用的时候需注意: 在Build Phases里面将 KeychainItemWrapper.m添加支持非arc模式:需要输入 -fno-objc-arc
  • iOS生成唯一UUID方法

    2021-02-12 09:04:15
    //uuid 消息的唯一标识+ (NSString *)uuidString{CFUUIDRef uuid_ref = CFUUIDCreate(NULL);CFStringRef uuid_string_ref= CFUUIDCreateString(NULL, uuid_ref);NSString *uuid = [NSString stringWithString:(__...

    //uuid 消息的唯一标识

    + (NSString *)uuidString

    {

    CFUUIDRef uuid_ref = CFUUIDCreate(NULL);

    CFStringRef uuid_string_ref= CFUUIDCreateString(NULL, uuid_ref);

    NSString *uuid = [NSString stringWithString:(__bridge NSString *)uuid_string_ref];

    CFRelease(uuid_ref);

    CFRelease(uuid_string_ref);

    return [uuid lowercaseString];

    }

    通过时间戳生成UUID

    -(NSString*) uuid {

    char data[10];

    for (int x=0;x<10;data[x++] = (char)('A' + (arc4random_uniform(26))));

    NSDate * datenow=[NSDate date];

    NSString *ns_sendCount = [[NSUserDefaults standardUserDefaults] objectForKey:@"sendMessageCount"];

    int sendCount = [ns_sendCount intValue];

    NSDate *preSendTime = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"preSendTime"];

    if (preSendTime == nil)

    {

    [[NSUserDefaults standardUserDefaults] setObject:datenow forKey:@"preSendTime"];

    }

    else

    {

    NSCalendar *chineseClendar = [ [ NSCalendar alloc ] initWithCalendarIdentifier:NSGregorianCalendar];

    NSUInteger unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit |NSSecondCalendarUnit | NSDayCalendarUnit| NSMonthCalendarUnit | NSYearCalendarUnit;

    NSDateComponents *DateComponent = [chineseClendar components:unitFlags fromDate:preSendTime toDate:datenow options:0];

    if ([DateComponent day] > 0)

    {

    [[NSUserDefaults standardUserDefaults] setObject:datenow forKey:@"preSendTime"];

    [[NSUserDefaults standardUserDefaults] setObject:@"0" forKey:@"sendMessageCount"];

    sendCount = 0;

    }

    else

    {

    sendCount ++;

    [[NSUserDefaults standardUserDefaults] setObject:[NSString stringWithFormat:@"%d",sendCount] forKey:@"sendMessageCount"];

    }

    }

    NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]];

    NSString * n_str = [NSString stringWithFormat:@"%@%@%@%@%@",

    [[NSString alloc] initWithBytes:data length:10 encoding:NSUTF8StringEncoding]

    ,@"-"

    ,timeSp

    ,@"-"

    ,[NSString stringWithFormat:@"%d",sendCount]];

    return n_str;

    }

    展开全文
  • 如何获取iOS设备的UUID

    2016-06-28 16:04:39
    UDID自从被苹果公司禁止开发者使用,UUID便成为替代品,一般使用UUID的时候,当程序被卸载重装之后,UUID一般会被改变,无法保证唯一。但使用我代码里的方法,便可以保证唯一,即使程序被卸载重装之后也仍然是卸载前...
  • 这是为了实现iOS获取手机唯一标示实现的工具类,只需下载添加至项目中调用getUUID即可
  • # iOS获取设备唯一标识和UUID方案 以下获取**uuidString**的方法,每次重启都会改变。 ```swift UIDevice.current.identifierForVendor?.uuidString ``` 但是项目的要求是不变,并且删除app 只有也有有保留的...
  • ios获取UUID的方法

    千次阅读 2021-01-05 10:17:47
    方法一:直接在手机上查看 打开网址:https://www.pgyer.com/udid,如果是在微信里打开,点击右上角按钮,在Safari打开 每个iPhoe设备都有一个唯一的设备标识符UUID,由40个字符或数字构成。 方法二:手机连接电脑,...
  • UDID被弃用,使用UUID来作为设备的唯一标识。获取到UUID后,如果用NSUserDefaults存储,当程序被卸载后重装时,再获得的UUID和之前就不同了。使用keychain存储可以保证程序卸载重装时,UUID不变。但当刷机或者升级...
  • iOS 2.0版本以后UIDevice提供一个获取设备唯一标识符的方法uniqueIdentifier,通过该方法我们可以获取设备的序列号,这个也是目前为止唯一可以确认唯一的标示符。好景不长,因为该唯一标识符与手机一一对应,苹果...
  • 读取设备的UUID(Universally Unique Identifier)并通过KeyChain记录。
  • 大致原理:通过将首次安装生成的UUID保存到keychain中,以后每次生成都先读取keychain里面的UUID 当然,同一个开发者账号用同一个key来保存,那么该账号下面所有的应用都能获取到同一个UUID 1.Prefix.pch 定义宏 ...
  • iOS UDID与UUID

    千次阅读 2020-04-21 17:27:29
    iOS UDID与UUID 1.UDID 通用唯一识别码 UDID(Unique Device Identifier) 是一串由40位16进制数组成的字符串,用以标识唯一的设备,现在想通过代码获取是不可能的了,如果你想看看你设备的UDID,可以通过iTunes来...
  • 获取iOS设备唯一标示UUID

    千次阅读 2021-01-11 22:21:08
    在开发过程中,我们经常会被要求获取每个设备的唯一标示,以便后台做相应的处理。我们来看看有哪些方法来获取设备的唯一标示,然后再分析下这些方法的利弊。具体可以分为如下几种:UDIDIDFAIDFVMACkeychain下面我们...
  • iOS-通过UUID来获取iOS设备唯一标识

    千次阅读 2019-01-03 16:35:20
    在之前的版本是可以使用UDID获取iOS设备唯一标识, NSString *udidString = [[UIDevice currentDevice] uniqueIdentifier]; 但是iOS5及以后,被苹果禁止使用了(弃用了) 而直接获取的UUID系统不会存储,每次...
  • iOS 7 中获取唯一标识符(UDID/UUID) 本站文章除注明转载外,均为本站原创或者翻译。 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商; 本站部分原创...
  • ios中获得UUID的方法,ios怎么获得uuid

    千次阅读 2016-05-06 11:42:00
    一.UDID(Unique Device Identifier)  UDID是Unique Device Identifier的缩写,中文意思是设备唯一标识.... 在很多需要限制一台设备一个账号的应用中经常会用到,在Symbian时代,...ios5 sdk中的获取方法:  [UIDe
  • 各种获取设备唯一标识的方法介绍一.UDID(Unique Device Identifier)UDID的全称是Unique Device Identifier,它就是苹果iOS设备的唯一识别码,它由40位16进制数的字母和数字组成(越狱的设备通过某些工具可以改变设备...
  • iOS获取设备唯一UUID(解决删除应用UUID变更的问题)
  • UDID被弃用,使用UUID来作为设备的唯一标识。获取到UUID后,如果用NSUserDefaults存储,当程序被卸载后重装时,再获得的UUID和之前就不同了。使用keychain存储可以保证程序卸载重装时,UUID不变。但当刷机或者升级...
  • iOS UUID&&UDID

    2018-07-13 14:56:53
    iOS UDID&amp;amp;amp;&amp;amp;amp;UUID 一、基本概念 UDID Unique Device Identifier :设备唯一标识符,用来唯一识别某台设备。在很多需要限制一台设备一个账号的应用中经常会用到,在Symbian时代,...
  • uuid:Kotlin多平台UUID

    2021-02-04 16:04:44
    经过macOS / iOS UUID测试以验证正确性 建立 在您的build.gradle(.kts)中: 将mavenCentral()添加到您的存储库 在您的commonMain sourceSets添加implementation "com.benasher44:uuid:<version>"作为依赖sou
  • iOS 关于UUID的理解

    千次阅读 2016-11-03 17:45:55
    UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境 (Distributed Computing Environment, ...
  • 由于我们后台判断App登录时根据唯一标识来判断的在不同终端登录的,如果唯一标识不一样,说明是换了设备,但是我们的用户名密码是我们同一系列的app公用的,所以得保证同一公司旗下的app在同一设备下的唯一标识是同...
  • 使用这个原生 iOS Titanium 模块,您将能够获得替代品(UUID、identifierForVendor 和 AdvertisingIdentifier),用于在 iOS 7 上获取 UDID/Open UDID/MAC 地址的已弃用方法。 ##获取最新编译的模块: ##用法示例...
  • 1.UDID 通用唯一识别码 UDID(Unique Device Identifier) 是一串由40位16进制数组成的字符串,用以标识唯一的设备,现在想通过代码获取是不可能的了,如果你想看看你设备的...设备唯一标识 UUID(Universally ...
  • iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式,每个iOS程序都有一个独立的keychain存储。相对于NSUserDefaults、文件保存等一般方式,keychain保存更为安全,而且keychain里保存的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,603
精华内容 1,841
关键字:

IOS uuid唯一