在做流量精灵的时候有这样一个需求,帐户默认需要取手机的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 开发获取唯一标识的更多相关文章

  1. ios开发-获取手机相关信息

    今天在做客户端的时候,里面有个意见反馈功能. 调用系统带的邮件功能,发送邮件到指定邮箱. 然后我就想,应该在邮件正文部分添加手机相关内容,比如型号,版本,应用程序的版本等等,这样不仅使用者方便,开发者 ...

  2. IOS 生成设备唯一标识

    前言 iOS设备5.0以上放弃使用[[UIDevice currentDevice] uniqueIdentifier]来获得设备唯一ID iOS设备私有方法禁止用户获取和使用IMEI 需求 需要一个 ...

  3. iOS 设备获取唯一标识符汇总

    在2013年3月21日苹果已经通知开发者,从2013年5月1日起,访问UIDID的应用将不再能通过审核,替代的方案是开发者应该使用“在iOS 6中介绍的Vendor或Advertising标示符”. ...

  4. iOS开发-获取属性和方法

    iOS开发数据存储有两种方式,属性列表和对象编码,属性列表可以通过NSArray,NSMutableArray,NSMutableDictionary,存储对象我们可以通过归档和解档来完成.如果我们想 ...

  5. NX二次开发-获取WCS标识

    函数:UF_CSYS_ask_wcs() 函数说明:获取工作坐标系对象的标识. 用法: 1 #include <uf.h> 2 #include <uf_csys.h> 3 e ...

  6. Unity3d获得Android和ios设备的唯一标识

    android为mac地址,ios为advertisingIdentifier 函数都比较简单,网上也搜得到,我也就不多说了,主要是对于我们没做过安卓和IOS开发的人来说,整合进工程有各种的问题. 我 ...

  7. NX二次开发-获取WCS标识UF_CSYS_ask_wcs

    NX9+VS2012 #include <uf.h> #include <uf_csys.h> UF_initialize(); //获取WCS标识 tag_t WcsId = ...

  8. 怎样获取ios设备的唯一标识

    非常多地方都会须要用到唯一标志. 比方: 1. 我们相用一个设备的唯一标志当作用户id,特别是网络游戏,这样就能够省去注冊的麻烦. 2. 想把app相关的文件加密,密钥哪里来的?有些人可能会说hard ...

  9. iOS开发 获取手机信息(UIDevice,NSBundle,NSlocale)

    在开发中,需要获取当前设备的一些信息,可以通过UIDevice,NSbundle,NSlocale获取. UIDevice UIDevice 提供了多种属性,类函数及状态通知,可以检测手机电量,定位, ...

随机推荐

  1. 滑动的Button

    在介绍SwitchButton之前,先来看一下系统Button是如何实现的.源码如下: @RemoteView public class Button extends TextView { publi ...

  2. 卸载cygwin

    1.下载takeown.exe(貌似win自带,你可以打开cmd 输入takeown.exe查看,貌似不行)所以还是去网上下载吧,亲测http://download.csdn.net/download ...

  3. centos7忘记root密码修改方式

    1.在进入系统选择时按下e键

  4. zigbee学习之路(六):Time3(查询方式)

    一.前言 通过上次的学习,相信大家对cc2530单片机的定时器的使用有了一定的了解,今天我们来介绍定时器3的使用,为什么介绍定时器3呢,因为它和定时器4功能是差不多的,所以学会定时器3,就基本掌握了c ...

  5. Java堆和栈详解

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...

  6. Python数据分析之pandas学习

    Python中的pandas模块进行数据分析. 接下来pandas介绍中将学习到如下8块内容:1.数据结构简介:DataFrame和Series2.数据索引index3.利用pandas查询数据4.利 ...

  7. PHP 回调、匿名函数和闭包

    <?php class Product{ public $name; public $price; function __construct($name, $price){ $this-> ...

  8. MultiProvider

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  9. 《BI项目笔记》创建时间维度(2)

    创建步骤:   序号 选择的属性 重命名后的名称 属性类别 1 DateKey DateKey 常规 2 Month Key Month Key 月份 3 English Month Name Eng ...

  10. sublime text3 快捷方式汇总

    sublime text. 用过的都给赞, 哈哈-- 下面是快捷方式汇总啦: 选择类: Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本. Alt+F3 选中文本按下快捷键,即可一次 ...