福利:
- 封装了一个操作设备唯一标识的类在GitHub, 可直接使用:https://github.com/Hext123/HDeviceIdentifier
思路:
- 保存到
Keychain
(钥匙串) 中的数据不会随应用卸载而删除, 除非恢复出厂设置. 所以可以生成一串字符保存到钥匙串中, 作为设备唯一标识.
实现:
生成一串唯一的字符作为设备唯一标识. 要在一个大程度上唯一的只有 UUID 了. iOS中提供了相关方法可以获取
UUID
:[[NSUUID UUID] UUIDString]
:[NSUUID UUID]
方法每次调用都会生成一个不同的UUID
.[[[UIDevice currentDevice] identifierForVendor] UUIDString]
:identifierForVendor
可以获取这个应用在这台手机上的唯一标识, 但是卸载重装应用之后会变化.
把
UUID
保存到Keychain
中: 直接操作Keychain
的代码是非常繁琐容易出错的, 所以使用一个已经封装好的操作类 SFHFKeychainUtils 来操作Keychain
.
代码:
//
// HDeviceIdentifier.m
// HDeviceIdentifier
//
// Created by hext on 16/4/5.
// Copyright © 2016年 hext. All rights reserved.
//
#import "HDeviceIdentifier.h"
#import "SFHFKeychainUtils.h"
//获取包名 如:com.hext.uuidDemo
#define bundleIdentifier [[NSBundle mainBundle]bundleIdentifier]
@implementation HDeviceIdentifier
/**
* 同步唯一设备标识 (生成并保存唯一设备标识,如已存在则不进行任何处理)
*
* @return 是否成功
*/
+(BOOL)syncDeviceIdentifier{
/**
* 获取应用的UUID标识
* (
* identifierForVendor返回本应用的UUID, 卸载重装后会变.所以要存入钥匙串
* 此处可用 [[NSUUID UUID]UUIDString] 代替, [NSUUID UUID]方法每次调用都会生成一个不同的UUID
* 但是identifierForVendor可以用来验证是不是第一次安装
* )
*/
NSString *myUUIDStr = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
/**
* 保存UUID到钥匙串Keychain, 如果已存在则不保存
* storeUsername:键
* Password:值
* ServiceName:组名
* updateExisting:更新已存在的
*/
BOOL f = [SFHFKeychainUtils storeUsername:@"deviceIdentifier" andPassword:myUUIDStr forServiceName:bundleIdentifier updateExisting:NO error:nil];
return f;
}
/**
* 返回唯一设备标识
*
* @return 设备标识
*/
+(NSString*)deviceIdentifier{
//先同步一下, 防止设备标识还未存在的情况
[self syncDeviceIdentifier];
//从钥匙串中获取唯一设备标识
NSString * deviceIdentifier = [SFHFKeychainUtils getPasswordForUsername:@"deviceIdentifier" andServiceName:bundleIdentifier error:nil];
return deviceIdentifier;
}
/**
* 本应用是第一次安装
*
* @return 是否是第一次安装
*/
+(BOOL)isFirstInstall{
NSString * deviceIdentifier = [HDeviceIdentifier deviceIdentifier];
NSString * identifierForVendor = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
/**
* 如果钥匙串中存的deviceIdentifier(设备标识)不存在 或者 等于deviceIdentifier(本应用的UUID) , 则为第一次安装
*/
if ( !deviceIdentifier || [deviceIdentifier isEqualToString:identifierForVendor]) {
return YES;
}else{
return NO;
}
}
@end
评论已关闭