(绝对有用)iOS获取UUID,并使用keychain存储

iOS获取UUID使用keychain存储,将账号密码存到keychain 1.新建一个工程,看一下自己的Bundle Id.这个Bundle Id 要和你用真机测试时的证书上面的Bundle Id相匹配。 2.Target - Capabilities - Keychain Sharing - ON 左侧的目录会自动生成Entitlements文件,不需要自己创建了。 也就是说,Bundle Iden 阅读详情
UDID被弃用,使用UUID来作为设备的唯一标识。获取到UUID后,如果用NSUserDefaults存储,当程序被卸载后重装时,再获得的UUID和之前就不同了。使用keychain存储可以保证 程序 卸载重装时,UUID不变。但当刷机或者升级系统后,UUID还是会改变的。但这仍是目前为止最佳的解决办法了,如果有更好的解决办法,欢迎留言。
(我整理的解决办法的参考来源:http://blog.k-res.net/archives/1081.html)

首先对于之前写的文章自己没有用真机测试,以及这段时间大家加我的QQ或者私信我也好,有的甚至找到了我的旺旺上,但是我没有给大家及时回复很抱歉。


进入正题,我之后又试了下自己写的方法,发现用模拟器可以,但是真机不可以。

真机卸载后和之前获取的uuid不同,究其原因就是之前生成的uuid并没有被keychain成功存储。


所以问题在keychain.我之前给大家的KeychainItemWrapper类是苹果官方的,但是有些朋友反映运行时会崩溃。

除此之外,Code SigningEntitlements的创建方法也不够严谨。


所以,请大家重新跟我走一遍吧。



1.新建一个工程,看一下自己的BundleId.这个BundleId 要和你用真机测试时的证书上面的Bundle Id相匹配。

(绝对有用)iOS获取UUID,并使用keychain存储

比如我的是house.xianrou.xianrou


2.Target - Capabilities - KeychainSharing - ON


(绝对有用)iOS获取UUID,并使用keychain存储

 


(绝对有用)iOS获取UUID,并使用keychain存储

这步主要目的是打开KeychainSharing,将它由灰色状态的OFF改为蓝色状态的ON。

打开之后的变化如下:


(绝对有用)iOS获取UUID,并使用keychain存储



(绝对有用)iOS获取UUID,并使用keychain存储

左侧的目录会自动生成Entitlements文件,不需要自己创建了。


也就是说,BundleIdentifier、Keychain Sharing的Keychain Groups、Entitlements文件的KeychainAccess Groups的第一个元素,它们要保持上图所示的一致性。

设置好了以后可以运行下程序,没问题可以进行下一步。


3.传说中的uuid类和keychain类来啦

既然苹果的keychain方法会崩溃而且有些复杂,我们只保存一个uuid的话可以用下面的简单方法:

(这也是我自己百度的keychain拷贝别人的,然后改改)

UUID.h

#import 尖括号(Foundation/Foundation.h


@interface UUID: NSObject


+(NSString*)getUUID;


 

@end


UUID.m


#import "UUID.h"

#import"KeyChainStore.h"



@implementation UUID


+(NSString*)getUUID

{

   NSString*strUUID = (NSString*)[KeyChainStoreload:@"com.company.app.usernamepassword"];

    

   //首次执行该方法时,uuid为空

    if([strUUID isEqualToString:@""]|| !strUUID)

    {

      //生成一个uuid的方法

      CFUUIDRef uuidRef= CFUUIDCreate(kCFAllocatorDefault);

       

       strUUID = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault,uuidRef));

   

      //将该uuid保存到keychain

       [KeyChainStoresave:KEY_USERNAME_PASSWORDdata:strUUID];

       

    }

    returnstrUUID;

}

 

@end


KeyChainStore.h


#import尖括号(Foundation/Foundation.h


@interfaceKeyChainStore : NSObject


+ (void)save:(NSString*)service data:(id)data;

+ (id)load:(NSString*)service;

+ (void)deleteKeyData:(NSString*)service;

 

@end


KeyChainStore.m

#import"KeyChainStore.h"



@implementation KeyChainStore


+ (NSMutableDictionary*)getKeychainQuery:(NSString*)service {

   return[NSMutableDictionarydictionaryWithObjectsAndKeys:

          (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 = [selfgetKeychainQuery:service];

   //Delete old item before add new item

    SecItemDelete((CFDictionaryRef)keychainQuery);

   //Add new object to searchdictionary(Attention:the data format)

   [keychainQuery setObject:[NSKeyedArchiverarchivedDataWithRootObject:data]forKey:(id)kSecValueData];

   //Add item to keychain with the searchdictionary

    SecItemAdd((CFDictionaryRef)keychainQuery,NULL);

}


+ (id)load:(NSString*)service {

    idret = nil;

    NSMutableDictionary*keychainQuery = [selfgetKeychainQuery: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)kCFBooleanTrueforKey:(id)kSecReturnData];

   [keychainQuery setObject:(id)kSecMatchLimitOneforKey:(id)kSecMatchLimit];

    CFDataRefkeyData = NULL;

    if(SecItemCopyMatching((CFDictionaryRef)keychainQuery,(CFTypeRef*)&keyData) == noErr){

       @try{

           ret =[NSKeyedUnarchiverunarchiveObjectWithData:(__bridgeNSData*)keyData];

       } @catch(NSException *e) {

          NSLog(@"Unarchiveof %@ failed: %@",service, e);

       } @finally{

       }

    }

    if(keyData)

       CFRelease(keyData);

    returnret;

}


+ (void)deleteKeyData:(NSString*)service {

    NSMutableDictionary*keychainQuery = [selfgetKeychainQuery:service];

    SecItemDelete((CFDictionaryRef)keychainQuery);

}


 

@end


将这两个类添加到工程中

4.新建一个pch文件,然后pch文件的内容如下:


#ifndef PrefixHeader_pch

#define PrefixHeader_pch


#define KEY_USERNAME_PASSWORD@"com.company.app.usernamepassword"

#define KEY_USERNAME @"com.company.app.username"

#define KEY_PASSWORD @"com.company.app.password"


#endif


pch文件的创建方法可参考:http://blog.csdn.net/huang2009303513/article/details/40375235
你有可能会在填Prefix Header即pch文件的路径那里报错,最近又学习到一种更好的方式$(SRCROOT)/$(PROJECT_NAME)/PrefixHeader.pch,其中$(PROJECT_NAME)是相对工程名,比上面的方法更便捷.


5.在viewcontroller.m里面执行如下代码

  NSString * uuid= [UUID getUUID];

  NSLog(@"uuid=%@",uuid);

 得到的uuid类似于这种
   uuid=19AAB430-9CB8-4325-ACC5-D7D386B68960
  
然后卸载掉,再重新运行,看前后得到的uuid是不是一样吧!
iOS小技巧-使用UUID+keychain替代udid方案 众所周知,苹果对用户的隐私越来越重视,导致app要获取用户的信息越来越少,参考网上的资料,写这篇文章作为日后的参考。 首先是KeyChainStore.h #import @interface KeyChainStore : NSObject + (void)save:(NSString *)service data:(id)data; + (id)load:(NSString *)s 阅读详情

相关推荐

iOS小技能:获取设备唯一标识符(idfa、idfv 、使用Keychain 存储UUID及通过Safari与mobileconfig获取

文章目录引言I、知识储备1.1 什么是Keychain?1.2 OpenUDID的使用II 、设备唯一标识符获取方案2.1 通过Safari浏览器获取iOS设备UDID(设备唯一标识符)2.2 替代方案:使用Keychain 存储UUIDIII、IDFA(Identifier For Advertising,广告标识符)3.1 判断 是否限制了广告追踪IV、IDFV (Identifier For Vendor,应用开发商标识符)V、iOS设备指纹大全5.1 iPhone型号认知5.2 iOS设备指纹大全

专注于计算机研发知识和资讯分享 4358

获取设备UUID

我们经常需要获取用户设备的唯一标识符,一般来说都是使用UUID,本文介绍简单的获取UUID的方法。 一般来说都是通过UUID获取设备的UUID的,虽然UUID也不是独一无二的,但大多还是使用的这个来标识。 要获取UUID也很简单,几行代码就可以了。我们在使用的时候,可以将UUID也保存在Keychain中,这样用户在卸载或者更新的时候,依然可以保证唯一性。关于如何保存在

mazegong的博客 5266

iOS小技能:设备ID除了使用_idfa、_idfv 还可使用其他替代方案(使用Keychain 存储UUID

设备信息的获取:除了使用_idfa、_idfv, 还使用sysctl 获取cpu、macaddress信息,以及使用sysctlbyname获取设备型号等信息、 使用CNCopyCurrentNetworkInfo获取ssid、bssid 关于设备ID的心得: 通过逆向研究,发现大部分的app设备ID以及OpenUDID都是基于CFUUIDCreate、CFUUIDCreateString 进行创建 ........................

专注于计算机研发知识和资讯分享 1万+

iOS各种设备识别码IDFA、UDID、UUID、MAC、OpenUDID、IDFV

今天在app服务端接口文档中看到2个接口名称,是和idfa相关的,就搜索了解了一下,顺便梳理了ios各种设备识别码。 *IDFA英文全称Identifier+for+Advertising,即广告标示符,目前是苹果生态内广告交易的主要标示符,一般和广告商交易一个用户后,广告商会提供用户的idfa作为凭证。主流广告平台腾讯广点通,新浪粉丝通都是基于idfa。 *ios中路径:设置-->>隐私-->>广告-->>还原广告标识符; 每次切换开关按钮和点击...

u013712343的博客 2万+

怎么获取iPhone手机的UUID,Windows和Mac电脑

3、新建一个文档或文本文件,粘贴就会出现类似于3cfe09dc0a545766ed912db6c32a65b37cc06ae5这就是iPhone手机的UUID。1、数据线连接iPhone手机,在Windows下打开iTunes,在 iPhone 管理界面下zhi点击“序列号”查看自己的 UUID 标识符。方法一:通过Windows下的iTunes。方法二:通过Mac电脑线的finder。2、此dao时点击菜单-编辑->复制。

weixin_43950297的博客 9245

QQ音频文件服务器,unlock-music:支持解密网易云/QQ音乐的加密文件和ID3信息补全...

说明:最近有小伙伴推荐了个解密工具unlock-music,支持网易云音乐/QQ音乐的VIP音乐文件批量解密导出为MP3或无损格式,包括ncm、qmc0、qmc3、mcflac、qmcogg、mflac格式及补全ncm的ID3信息,挺实用的,毕竟通常情况下,当这些客户端VIP会员到期后会自动删除已下载的VIP音乐文件。而且文件是加密格式的只能用客户端播放,会员到期后就算保留音乐文件也无法使用,而且...

weixin_35982453的博客 6431

iOS开发 生成设备唯一标识符,卸载重装也不会改变

iOS开发的时候,有时候需要设备的唯一标识符,但是uuid在卸载重装或者更新之后会变动,无法保持不变,这个时候我们使用。以上俩文件结合就可以实现iOS手机设备唯一标识符,且卸载重装也不会变动。2.管理uuid的文件。

zhaofahseng的博客 960

(绝对有用)iOS获取UUID使用keychain存储(转载)

UDID被弃用,使用UUID来作为设备的唯一标识。获取UUID后,如果用NSUserDefaults存储,当程序被卸载后重装时,再获得的UUID和之前就不同了。使用keychain存储可以保证程序卸载重装时,UUID不变。但当刷机或者升级系统后,UUID还是会改变的。但这仍是目前为止最佳的解决办法了,如果有更好的解决办法,欢迎留言。 (我整理的解决办法的参考来源:http://blog.k

baidu_23493547的博客 566

iOS获取和管理UUID的完整指南

通用唯一识别码(UUID)是一种标准化的128位长度的标识符,用于在网络系统中唯一标识信息。在iOS中,UUID通常用于识别设备而不是用户。其特点包括:唯一性:理论上每个UUID都是独一无二的,几乎不可能产生重复。不可预测性:UUID的生成算法确保生成的标识符无法被第三方预测。不依赖网络:可以在设备上本地生成,无需网络通信。KeychainiOS系统中用于存储敏感信息的密钥链,它是一个安全的存储系统,可以用来保存密码、密钥、证书、私钥和其他敏感信息。

weixin_31720909的博客 1935

iOS UUID获取方法与实践指南

Vendor ID,也被称作Vendor Identifier,是一个用于替代UDID的解决方案,用来唯一识别应用的供应商。它与UDID不同的是,Vendor ID的获取是受到限制的,不能用来唯一标识每一台iOS设备。Vendor ID主要用在需要区分不同供应商设备的情况下,比如广告系统中用来区分不同广告平台来源的设备,但不涉及具体设备的唯一识别。是苹果在iOS 6.0版本之后推出的一个属性,它为同一厂商(Vendor)的不同应用提供了一个通用的标识符。

weixin_35920379的博客 1904

vue怎么获取uuid_开发中常用工具 - 获取设备的唯一标识、UDID、UUIDkeychain保存UUID、判断网络...

UDID全名:Unique Device Identifie(设备唯一标识符)说明:UDID,即设备唯一标识符,这是除序列号之外每台iOS设备的独一无二的号码。UDID只是和设备相关的,是用来区分每一个唯一的iOS设备(包括iPhone、iPad等),是由40个字符的字母和数字组成的。作用:可以关联其它各种数据到相关设备上。比如:程序发布前的通过测试版本进行测试等都需要UDID。获取方法: UDI...

weixin_39777242的博客 6711
上一篇: 在IOS中使用KeychainItemWrapper保存用户名和密码实现记住密码功能
下一篇: iOS的UDID废用以及UUID配合keychain的替换方案实现
Joycecsdn
博客等级 码龄12年 110粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值