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];

好吧,此方案完结。

时间: 2024-12-24 16:40:46

iOS 开发获取唯一标识的相关文章

iOS开发- 获取精确剩余电量

[UIDevice currentDevice].batteryMonitoringEnabled = YES; double deviceLevel = [UIDevice currentDevice].batteryLevel; 获取当前剩余电量, 我们通常采用上述方法.这也是苹果官方文档提供的. 它返回的是0.00-1.00之间的浮点值.  另外, -1.00表示模拟器. 貌似这个方法不错, 也很简单. 但是仔细观察它的返回值, 我们可以发现. 它是以0.05递变的. 折算成100% 也就

iOS开发 - 获取真机沙盒数据

今天要获取之前真机测试时写入沙盒的数据, 本来以为挺麻烦的. 后来捣腾了一下, 才知道原来这么简单... 下面直接看具体步骤. 前提: 真机已经通过USB和你的电脑连接上了! 1.进入Organizer 2.选择你的应用. 并导出数据.(点击Download) 3.保存数据到相应位置.(点击Save) 4.打开, 查看数据. 保存完毕后, 你后发现一个这样的文件. 选中它, 右键---->显示包内容. 然后进入------->AppData ------>Documents. 即可看到你

IOS开发 获取当前视图所在的类名

NSString *stringClass = NSStringFromClass([(UINavigationController *)self.window.rootViewController topViewController].class); IOS开发 获取当前视图所在的类名

获取唯一标识UUID

本文是iOS7系列文章第一篇文章,主要介绍使用KeyChain保存和获取APP数据,解决iOS7上获取不变UDID的问题.并给出一个获取UDID的工具类,使用方便,只需要替换两个地方即可. 一.iOS不用版本获取UDID的方法比较 1)iOS 5.0 iOS 2.0版本以后UIDevice提供一个获取设备唯一标识符的方法uniqueIdentifier,通过该方法我们可以获取设备的序列号,这个也是目前为止唯一可以确认唯一的标示符.好景不长,因为该唯一标识符与手机一一对应,苹果觉得可能会泄露用户隐

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

在2013年3月21日苹果已经通知开发者,从2013年5月1日起,访问UIDID的应用将不再能通过审核,替代的方案是开发者应该使用“在iOS 6中介绍的Vendor或Advertising标示符”. unique Identifier即将退出,苹果给了我们Vendor和Advertising identifier两个选择,但应该用哪一个?文档并没有给出确切答案,具体使用哪个完全由你根据自己app的目的来决定.下面我将列出iOS中目前支持的,以及被废弃的唯一标示符方法,并对其做出相应的解释,希望可

如何获取ios设备的唯一标识

很多地方都会需要用到唯一标志. 比如: 1. 我们相用一个设备的唯一标志当作用户id,特别是网络游戏,这样就可以省去注册的麻烦. 2. 想把app相关的文件加密,密钥哪里来的?有些人可能会说hard code,但是hard code的key比较容易被破解.而去hard code密钥加密的文件可以copy到其他设备.比如游戏的本地文件保存了一些游戏相关的数据,那么只要有一台机器购买100个金币,然后就可以把本地文件copy给其他设备,其他设备也可以有100金币了,因为所有的设备用的是同一个hard

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

在开发中,需要获取当前设备的一些信息,可以通过UIDevice,NSbundle,NSlocale获取. UIDevice UIDevice 提供了多种属性,类函数及状态通知,可以检测手机电量,定位,感应,机型,当前系统版本等等. //设备相关信息的获取 NSString *strName = [[UIDevice currentDevice] name]; NSLog(@"设备名称:%@", strName);//e.g. "My iPhone" NSString

iOS开发-获取设备型号信息

开发中有的时候查看设计统计数据,或者通过日志查看错误信息,这个时候我们就需要获取获取设备信息,看下关于设备有几种方法: NSLog(@"%@",[[UIDevice currentDevice] name]);//设备名称 NSLog(@"%@",[[UIDevice currentDevice] model]);//设备类型 NSLog(@"%@",[[UIDevice currentDevice] localizedModel]); NSLo

ios开发获取验证码按钮读秒效果

方法一: - (void)startCountDown { _seconds = 60; NSString *str = [NSString stringWithFormat:@"%d秒后可重新获取", _seconds]; [_btnVerify setTitle:str forState:UIControlStateDisabled]; [_btnVerify.titleLabel setFont:[UIFont systemFontOfSize:12]]; [_btnVerify