iOS 开发获取唯一标识
在做流量精灵的时候有这样一个需求,帐户默认需要取手机的imsi 信息。这就有一个好处,即便用户删除我们的应用后从新下载,下次进入时他们还会以同样的身份登陆,并且获得原先纪录。这样不仅对于开发公司人员来说可以统计他是不是新用户,而且对于用户来说可以不用担心之前记录是否被删除。(——我们的软件是不需要注册的,只要用户登录就默认以imsi 为唯一标示来登记的)。
但是在iOS开发中,发现不同的系统如 iOS5、iOS6.0、以及iOS7,苹果对它处理的态度是完全不同的。估计苹果是对系统安全的考虑,6.0之后你若想取这些私密信息是完全不可能的。所有的函数都已经被封锁。 虽说作为一个开发来说很不愿意看得此景,但另一方面作为一个乔布斯粉丝的我来说,完全可以理解苹果的此举。(反过来想一想,若你是一个用户,而你手机中装的每个软件都可以在任意情况下获取你的 私密信息如:imsi,imei,手机号码或者你的地理位置信息。 那是多么可怕的一件事情。——乔布斯当初不想开放iOS开发给世界就是为了不让其他人污染了他的商店,污染用户,污染了系统)。
基于种种原因,我还是相对崇拜乔布斯的。
既然不能直接解决问题,那么我们就尝试着解决吧:这里也尝试过几种吧
1、利用 NSUserDefaults 存取
- (NSString*)uniqueAppInstanceIdentifier
{
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
static NSString* UUID_KEY = @"MPUUID";
NSString* app_uuid = [userDefaults stringForKey:UUID_KEY];
if (app_uuid == nil) {
CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
CFStringRef uuidString = CFUUIDCreateString(kCFAllocatorDefault, uuidRef);
app_uuid = [NSString stringWithString:(__bridge NSString*)uuidString];
[userDefaults setObject:app_uuid forKey:UUID_KEY];
[userDefaults synchronize];
CFRelease(uuidString);
CFRelease(uuidRef);
}
return app_uuid;
}
这种方法可以保证用户不删除软件情况下的获取同一个数据。因为NSUserDefaults 数据时保存在 沙盒里面的,会随着软件删除而被清空。
2、利用 [[UIDevice currentDevice] identifierForVendor].UUIDString
此方法是官方6.0系统后推出的,指定唯一标示符号;不同软件,不同机器,运行的时候指都是不一样的;也就是说可以满足标识唯一性,前一段时间我都是用该方法来获取数据的。 但是有个让人纠结的问题:
a、大部分正版的手机在软件卸载了,然后重新安装的情况下还是会保持和原先保存同一个值。
b、我一直以为这个方法没问题的同时,在某一天,突然有个测试说:“我软件卸载了,但是数据都清空了。。。。怎么回事啊。”,后来发现 you right。有些越狱或者美版的手机 在卸载后都会重现获取数据。------我的天哪。。。。
最方便的方案,就那么被否决,还是有些失落!
也基于这些现在才有空重新来思考这个问题.... 设备唯一标示符,并且这个标示符在软件卸载重装之后能和原先保持一致.....
3、KeyChian 方案
这个方案我开发之间就一直知道,也给新中大弄个过,只是自己完全不想弄。理由很简单,一个工具软件这样弄有什么意思呢?对于没用的开发我向来都是很反感,很讨厌的。 人们总想着完美的东西,却压根不知道自己所要的完美是什么东西,总是说以后会有用的,总以为这样就会让自己变得成为一个思考全面的人。 可是在我认为并非如此,大部分都这样思考,都是由于本身思考的太少,将来太过于迷茫,而又保守于不想犯错而已..........还记得刚毕业的时候那样一句话:“做一个万能的东西是万万不能的.....也不要整天为以后的因素来进行编码。” 所以我的答案很简单:你要清楚的知道你要什么,我也会给你清楚的答案。
言归正转:
KeyChian 是保存在沙盒之外的存储数据,相当于Dictionary, 所有应用都可以获取和保存,因此当一个软件卸载之后完全不影响里面的数据,这样当软件重新安装之后,理所当然的可以获取里面的原数据。
这里我用的还是别人封装过的一些代码SFHFKeychainUtils(可以在网上任意下载):
//保存数据
BOOL s = [SFHFKeychainUtils storeUsername:name andPassword:pswd forServiceName:server updateExisting:NO error:nil];
//获取密码
NSString * psw = [SFHFKeychainUtils getPasswordForUsername:name andServiceName:server error:nil];
好吧,此方案完结。
iOS 开发获取唯一标识的更多相关文章
- ios开发-获取手机相关信息
今天在做客户端的时候,里面有个意见反馈功能. 调用系统带的邮件功能,发送邮件到指定邮箱. 然后我就想,应该在邮件正文部分添加手机相关内容,比如型号,版本,应用程序的版本等等,这样不仅使用者方便,开发者 ...
- IOS 生成设备唯一标识
前言 iOS设备5.0以上放弃使用[[UIDevice currentDevice] uniqueIdentifier]来获得设备唯一ID iOS设备私有方法禁止用户获取和使用IMEI 需求 需要一个 ...
- iOS 设备获取唯一标识符汇总
在2013年3月21日苹果已经通知开发者,从2013年5月1日起,访问UIDID的应用将不再能通过审核,替代的方案是开发者应该使用“在iOS 6中介绍的Vendor或Advertising标示符”. ...
- iOS开发-获取属性和方法
iOS开发数据存储有两种方式,属性列表和对象编码,属性列表可以通过NSArray,NSMutableArray,NSMutableDictionary,存储对象我们可以通过归档和解档来完成.如果我们想 ...
- NX二次开发-获取WCS标识
函数:UF_CSYS_ask_wcs() 函数说明:获取工作坐标系对象的标识. 用法: 1 #include <uf.h> 2 #include <uf_csys.h> 3 e ...
- Unity3d获得Android和ios设备的唯一标识
android为mac地址,ios为advertisingIdentifier 函数都比较简单,网上也搜得到,我也就不多说了,主要是对于我们没做过安卓和IOS开发的人来说,整合进工程有各种的问题. 我 ...
- NX二次开发-获取WCS标识UF_CSYS_ask_wcs
NX9+VS2012 #include <uf.h> #include <uf_csys.h> UF_initialize(); //获取WCS标识 tag_t WcsId = ...
- 怎样获取ios设备的唯一标识
非常多地方都会须要用到唯一标志. 比方: 1. 我们相用一个设备的唯一标志当作用户id,特别是网络游戏,这样就能够省去注冊的麻烦. 2. 想把app相关的文件加密,密钥哪里来的?有些人可能会说hard ...
- iOS开发 获取手机信息(UIDevice,NSBundle,NSlocale)
在开发中,需要获取当前设备的一些信息,可以通过UIDevice,NSbundle,NSlocale获取. UIDevice UIDevice 提供了多种属性,类函数及状态通知,可以检测手机电量,定位, ...
随机推荐
- jenkins+gerrit
Verified 功能 http://www.cnblogs.com/zhanchenjin/p/5032218.html
- Android实现归属地查询功能
实现归属地查询大体有两种方法可以实现,一种是通过归属地API进行查询,另一种是查询本地数据库.两种方法各有优劣,最好结合起来使用,我本次采用的是查询数据库的方法.首先需要从网上下载归属地数据库call ...
- CentOS 7下Wireshark捕获USB数据包
1. 软件准备 安装Wireshark # yum install wireshark wireshark-gnome .csharpcode, .csharpcode pre { font-size ...
- linux 循环处理文件夹下所有文件脚本
#!/bin/bashfunction ergodic(){ for file in ` ls $1 ` do if [ -d $1"/"$file ] then ergodic ...
- 复习练习(03)jquery Css方法一步步升级
jquery Css方法一步步升级 <script src="jquery-1.8.3.js"></script> <script type=&quo ...
- 【RabbitMQ】RabbitMQ在Windows的安装和简单的使用
版本说明 使用当前版本:3.5.4 安装与启动 在官网上下载其Server二进制安装包,在Windows上的安装时简单的,与一般软件没什么区别. 安装前会提示你,还需要安装Erlang,并打开下载页面 ...
- javascript 字符转换为ascii码,ascii码转换为字符
<script> str="A"; code = str.charCodeAt(); str2 = String.fromCharCode(code); str3 = ...
- GATT两个角色 服务器与客户端
两个设备应用数据的通信是通过协议栈的GATT层实现的. 从GATT角度来看,当两个设备建立连接后,他们处于以下两种角色之一: GATT服务器: 它是为GATT客户端提供数据服务的设备 GATT客户端: ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:排序、筛选和分页
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第三篇:排序.筛选和分页 原文:Sort ...
- SQL疑难杂症【5 】大量数据查询的时候要考虑结果为空的情况
最近几天怪事儿出奇的多,同一个工单.同一个产品,在A线可以正常生产,但是在H线死活都无法生产,系统直接提示TimeOut,监控发现有一条SQL语句执行缓慢,Copy出来仔细查看,很简单的一条语句,如下 ...