码迷,mamicode.com
首页 > 移动开发 > 详细

iOS 开发获取唯一标识

时间:2014-11-20 11:41:37      阅读:8560      评论:0      收藏:0      [点我收藏+]

标签:style   io   ar   os   sp   for   数据   on   问题   

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

标签:style   io   ar   os   sp   for   数据   on   问题   

原文地址:http://www.cnblogs.com/kingbo/p/4110143.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!