一.UDID(Unique Device Identifier)
UDID
是
Unique Device Identifier
的缩写
,
中文意思是设备唯一标识
.
在很多需要限制一台设备一个账号的应用中经常会用到
,
在
Symbian
时代
,
我们是使用
IMEI
作为设备的唯一标识的
,
可惜的是
Apple
官方不允许开发者获得设备的
IMEI.
ios5 sdk
中的获取方法
:
[UIDevice currentDevice] uniqueIdentifier]
uniqueIdentifier
在
UIDevice.h
中的定义如下
:
@property(nonatomic,readonly,retain) NSString *uniqueIdentifier __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_5_0); // a string unique to each device based on various hardware info.
意思是
iOS2.0
以上及
iOS5.0
以下的系统可用
,
但不建议使用
.Apple
有可能在
ios5.0
之后删除该函数
.
经过测试
,
未越狱的
iPhone,
系统版本为
5.0.1
,
依然可以获取
UDID.
但是我们需要注意的一点是
,
对于已越狱了的设备
,UDID
并不是唯一的
.
使用
Cydia
插件
UDIDFaker,
可以为每一个应用分配不同的
UDID.
所以
UDID
作为标识唯一设备的用途已经不大了
.
二.UUID(Universally Unique Identifier)
UUID
是
Universally Unique Identifier
的缩写
,
中文意思是通用唯一识别码
.
由网上资料显示
,UUID
是一个软件建构的标准
,
也是被开源软件基金会
(Open Software Foundation,OSF)
的组织在分布式计算环境
(Distributed Computing Environment,DCE)
领域的一部份
.UUID
的目的
,
是让分布式系统中的所有元素
,
都能有唯一的辨识资讯
,
而不需要透过中央控制端来做辨识资讯的指定
.
根据以上定义可知
,
同一设备上的不同应用的
UUID
是互斥的
,
即能在改设备上标识应用
.
但是并没有明确指出能标识出装有同一应用的不同设备
,
但是根据我推测
,
这个
UUID
应该是根据设备标识和应用标识生成唯一标识
,
再经过加密而来的
(
纯推测
).
iOS
中获取
UUID
的代码如下
:
1 -(NSString*) uuid { 2 CFUUIDRef puuid = CFUUIDCreate( nil ); 3 CFStringRef uuidString = CFUUIDCreateString( nil, puuid ); 4 NSString * result = (NSString *)CFStringCreateCopy( NULL, uuidString); 5 CFRelease(puuid); 6 CFRelease(uuidString); 7 return [result autorelease]; 8 }
虽然
UUID
是官方提出的一种替代
UDID
的建议方案
,
但网上有资料说
UUID
不能保证在以后的系统升级后
(IOS6,7)
还能用
.
经过我测试目前
,UUID
在
IOS4
和
IOS5
下均可以使用
,
而且
UUID
每次生成的值都不一样
,
需要开发者自行保存
UUID.
如果使用
UUID
为标识保存用户的资料在网络上
,
当用户重装软件后
,UUID
的值就可能会发生改变
(
基本上可说是百分百会发生改变
),
用户则无法重新下载原来的网络资料
.
三.一个可行的解决方案
经过上述的探讨
,
我们不难发现
,
无论是使用
UDID
或是
UUID,
我们的目的通常都是为了让用户可以自动注册
,
而不需要账号密码
.
而使用
UDID
和
UUID
作为用户的
ID
也并不是毫无缺陷
.
现在网上有一现成的解决方案
,
使用设备的
Mac
地址
,
因为
Mac
地址也是唯一的
.unix
有系统调用可以获取
Mac
地址
.
但有些事情需要注意
:
1.iPhone
可能有多个
Mac
地址
,wifi
的地址
,
以及
SIM
卡的地址
.
一般来讲
,
我们取
en0
的地址
,
因为他是
iPhone
的
wifi
的地址
,
是肯定存在的
.(
例外情况依然有
:
市面上依然存在一部分联通的阉割版无
wifi
的
iPhone)
2.Mac
地址涉及到隐私
,
不应该胡乱将用户的
Mac
地址传播
!
所以我们需要将
Mac
地址进行
hash
之后
,
才能作为
DeviceId
上传
.
关于第一个注意点的问题
,
经过我测试
,
没有
Wifi
功能的
iPhone3GS
一样可以获得
Mac
地址
,
所以这应该是目前标识设备唯一最好的一个解决方案
.
解决方案
github
下载地址
github
。
com/gekitz/UIDevice-with-UniqueIdentifier-for-iOS-5
背景:
大多数应用都会用到苹果设备的
UDID
号,
UDID
通常有以下两种用途:
1
)用于一些统计与分析目的;【第三方统计工具如友盟,广告商如
ADMOB
等】
2
)将
UDID
作为用户
ID
来唯一识别用户,省去用户名,密码等注册过程。
不过,
2011
年时,苹果就宣布
ios5.0
以后的系统中将不再支持以下方法获取用户的
UDID
【苹果设备的唯一识别码】:
[UIDevice currentDevice] uniqueIdentifier];
【注:对于已越狱了的设备
,UDID
并不是唯一的
.
使用
Cydia
插件
UDIDFaker,
可以为每一个应用分配不同的
UDID
】
同时,苹果公司建议使用
UUID
【一种开放的软件构建标准】来替代:
-(NSString*) uuid {
CFUUIDRef puuid = CFUUIDCreate( nil );
CFStringRef uuidString = CFUUIDCreateString( nil, puuid );
NSString * result = (NSString *)CFStringCreateCopy( NULL, uuidString);
CFRelease(puuid);
CFRelease(uuidString); return [result autorelease];
}
该方法每次都会获取一个唯一的标识字符串,开发者可以在应用第一次启动时候调用一次,然后将该串存储起来,以便以后替代
UDID
来使用。
问题是如果用户删除该应用再次安装时,又会生成新的字符串,所以不能保证唯一识别该设备。
而最近(
2012
年
3
月),有消息称苹果应用商店开始拒绝使用
UDID
的应用上架。
替代方案:
现在网上有一现成的解决方案
,
使用设备的
Mac
地址
,
因为
Mac
地址也是唯一的
.unix
有系统调用可以获取
Mac
地址
.
但有些事情需要注意
:
1.iPhone
可能有多个
Mac
地址
,wifi
的地址
,
以及
SIM
卡的地址
.
一般来讲
,
我们取
en0
的地址
,
因为他是
iPhone
的
wifi
的地址
,
是肯定存在的
.
2.Mac
地址涉及到隐私
,
不应该胡乱将用户的
Mac
地址传播
!
所以我们需要将
Mac
地址进行
hash
之后
,
才能作为
DeviceId
上传
.
该解决方案源码地址:
https://github.com/gekitz/UIDevice-with-UniqueIdentifier-for-iOS-5
该方案提供了两个方法:
uniqueDeviceIdentifier (
返回
MAC
和
CFBundleIdentifier
的
MD5
值
)
uniqueGlobalDeviceIdentifier(
返回
MAC
的
MD5
值
)
使用方法:
#import "UIDevice+IdentifierAddition.h" NSLog(@"%@",[[UIDevice currentDevice] uniqueDeviceIdentifier]);
NSLog(@"%@",[[UIDevice currentDevice] uniqueGlobalDeviceIdentifier]);
测试结果:
WIFI
下:
UDID
:
XXXX21f1f19edff198e2a2356bf4XXXX
新生成的:
XXXX7dc3c577446a2bcbd77935bdXXXX
3G
下:
UDID
:
XXXX21f1f19edff198e2a2356bf4XXXX
新生成的:
XXXX7dc3c577446a2bcbd77935bdXXXX
GPRS
下
UDID
:
XXXX21f1f19edff198e2a2356bf4XXXX
新生成的:
XXXX7dc3c577446a2bcbd77935bdXXXX
飞行模式下:
UDID
:
XXXX21f1f19edff198e2a2356bf4XXXX
新生成的:
XXXX7dc3c577446a2bcbd77935bdXXXX
删除应用重装后:
UDID
:
XXXX21f1f19edff198e2a2356bf4XXXX
新生成的:
XXXX7dc3c577446a2bcbd77935bdXXXX
转自:http://it.100xuexi.com/view/otdetail/20130917/d8abef29-6751-4617-9571-2b7c1e61a637.html