ios开发——实用技术篇OC篇&获取设备唯一标识

获取设备唯一标识

WWDC 2013已经闭幕,IOS7 Beta随即发布,界面之难看无以言表...,简直就是山寨Android。

更让IOS程序猿悲催的是,设备唯一标识的MAC Address在IOS7中也失效了。

IOS系统中,获取设备唯一标识的方法有很多:

一.UDID(Unique Device Identifier)

UDID的全称是Unique Device Identifier,顾名思义,它就是苹果IOS设备的唯一识别码,它由40个字符的字母和数字组成。

二.UUID(Universally Unique Identifier) 

UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码.

三.MAC Address

四.OPEN UDID

五.广告标示符(IDFA-identifierForIdentifier)

六.Vindor标示符 (IDFV-identifierForVendor)

Vendor是CFBundleIdentifier(反转DNS格式)的前两部分。来自同一个运营商的应用运行在同一个设备上,此属性的值是相同的;不同的运营商应用运行在同一个设备上值不同。

经测试,只要设备上有一个tencent的app,重新安装后的identifierForVendor值不变,如果tencent的app全部删除,重新安装后的identifierForVendor值改变。

但是很不幸,上面所有这些表示设备唯一号的标识,在IOS7中要么被禁止使用,要么重新安装程序后两次获取的标识符不一样。

由于IOS系统存储的数据都是在sandBox里面,一旦删除App,sandBox也不复存在。好在有一个例外,那就是keychain(钥匙串)。

通常情况下,IOS系统用NSUserDefaults存储数据信息,但是对于一些私密信息,比如密码、证书等等,就需要使用更为安全的keychain了。

keychain里保存的信息不会因App被删除而丢失。所以,可以利用这个keychain这个特点来保存设备唯一标识。

那么,如何在应用里使用使用keyChain呢,我们需要导入Security.framework ,keychain的操作接口声明在头文件SecItem.h里。

直接使用SecItem.h里方法操作keychain,需要写的代码较为复杂,我们可以使用已经封装好了的工具类KeychainItemWrapper来对keychain进行操作。

KeychainItemWrapper是apple官方例子“GenericKeychain”里一个访问keychain常用操作的封装类,在官网上下载了GenericKeychain项目后,

只需要把“KeychainItemWrapper.h”和“KeychainItemWrapper.m”拷贝到我们项目,并导入Security.framework 。KeychainItemWrapper的用法:

/** 初始化一个保存用户帐号的KeychainItemWrapper */

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Account Number"

accessGroup:@"YOUR_APP_ID_HERE.com.yourcompany.AppIdentifier"];

//保存数据

[wrapper setObject:@"<帐号>" forKey:(id)kSecAttrAccount];

[wrapper setObject:@"<帐号密码>" forKey:(id)kSecValueData];

//从keychain里取出帐号密码

NSString *password = [wrapper objectForKey:(id)kSecValueData];

//清空设置

[wrapper resetKeychainItem];

其中方法“- (void)setObject:(id)inObject forKey:(id)key;”里参数“forKey”的值应该是Security.framework 里头文件“SecItem.h”里定义好的key,用其他字符串做key程序会出错!

时间: 2024-10-12 19:46:21

ios开发——实用技术篇OC篇&获取设备唯一标识的相关文章

ios开发——实用技术篇OC篇&amp;获取内存使用情况

获取内存使用情况 1 iOS 获取 当前设备 可用内存 及当前 应用 所占内存 (2012-05-15 11:12:39) 2 转载 3 ▼ 4 标签: ios 设备 可用内存 所占内存 内存 it 分类: iOS 5 6 // 获取当前设备可用内存及所占内存的头文件 7 8 #import <sys/sysctl.h> 9 10 #import <mach/mach.h> 11 12 13 14 15 16 17 // 获取当前设备可用内存(单位:MB) 18 19 - (dou

iOS开发日记20-7.0之后获取设备唯一标识

今天博主有一个获取设备唯一标识的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. 在iOS7.0之前,获取设备唯一标识的方法主要是获取UDID或MAC地址,但是在iOS7.0之后,为了保护用户隐私,苹果把他们都禁止了,使得设备的数据追踪变得越来越难. iOS7.0之后,获取设备唯一标识的方法主要有两种: 1.广告标识符 IDFA 苹果为了完善自己的生态圈,在2010年前后推出了iAd广告网络.那么这个IDFA和这个iAd的关系就不言自喻了.如果不了解广告也没关系,简单来讲,现在的互联网

ios开发——实用技术篇OC篇&amp;iOS的主要框架

iOS的主要框架         阅读目录 Foundation框架为所有的应用程序提供基本系统服务 UIKit框架提供创建基于触摸用户界面的类 Core Data框架管着理应用程序数据模型 Core Graphics框架帮助你创建图形 Core Animation允许你创建高级的动画和虚拟效果 OpenGL ES 框架提供2D和3D绘图工具 将别的框架添加到工程里 本文是<Sunvey the Major Framworks>一文的翻译 框架是一个目录,这个目录包含了共享库,访问共享库里代码

ios开发——实用技术篇Swift篇&amp;地址薄、短信、邮件

1 //返回按钮事件 2 @IBAction func backButtonClick() 3 { 4 self.navigationController?.popViewControllerAnimated(true) 5 } 6 7 //新增联系人 8 @IBAction func addPeople () 9 { 10 //取得电话薄句柄 11 var error:Unmanaged<CFError>? 12 var addressBook: ABAddressBookRef? = AB

ios开发——实用技术篇Swift篇&amp;播放MP3

播放MP3 1 // MARK: - 播放MP3 2 /*----- mp3 ------*/ 3 //定时器- 4 func updateTime() 5 { 6 //获取音频播放器播放的进度,单位秒 7 var cuTime:Float = Float(audioPlayer.currentTime) 8 9 //更新进度条 10 jinDuSlider.value = cuTime 11 12 //获取总时间 13 var duTime:Float = Float(audioPlayer.

ios开发——实用技术篇Swift篇&amp;加速计和陀螺仪

加速计和陀螺仪 1 //返回按钮事件 2 @IBAction func backButtonClick() 3 { 4 self.navigationController?.popViewControllerAnimated(true) 5 } 6 7 8 @IBOutlet var xLabel:UILabel! 9 @IBOutlet var yLabel:UILabel! 10 @IBOutlet var zLabel:UILabel! 11 12 @IBOutlet var orient

ios开发——实用技术篇Swift篇&amp;多点触摸与手势识别

多点触摸与手势识别 1 2 //点击事件 3 var atap = UITapGestureRecognizer(target: self, action: "tapDo:") 4 self.view.addGestureRecognizer(atap) 5 atap.numberOfTapsRequired = 1 //单击次数 6 atap.numberOfTouchesRequired = 1 //手指个数 7 8 //拖动事件 9 var aPan = UIPanGesture

ios开发——实用技术篇Swift篇&amp;系统声音

系统声音 1 // MARK: - 系统声音 2 /*----- 系统声音 ------*/ 3 @IBAction func systemSound() 4 { 5 //建立的SystemSoundID对象 6 var soundID: SystemSoundID = 0 7 8 //获取声音文件地址 9 var path = NSBundle.mainBundle().pathForResource("SaoMa", ofType: "wav") 10 11 /

ios开发——实用技术篇Swift篇&amp;录音

录音 1 // MARK: - 录音 2 /*----- 录音 ------*/ 3 4 var recorder:AVAudioRecorder? //录音器 5 var player:AVAudioPlayer? //播放器 6 var recorderSettingsDic:[NSObject : AnyObject]? //录音器设置参数数组 7 var volumeTimer:NSTimer!//定时器线程, 刷新音量 8 var aacPath:String? //录音存储路径 9