正确的解决方案是使用
iCloud键值存储,您可以在不需要任何身份验证或用户信息(如电子邮件地址)的情况下存储唯一的用户ID。
最终结果是一个随机UUID(并未真正标识用户),对于每个用户都是不同的,但将持久存在于注册到相同iCloud帐户的多个设备上。
我们在iCloud KV存储中定义一个字段,称为userID。当应用程序启动时,我们首先检查userID。如果有了,那么我们就有了用户的唯一ID。如果没有,那么这是我们为此用户运行的第一次。我们生成一个随机UUID并将其存储在userID下的KV Store中。就是这样。
我们的经验表明,此UUID对于每个iTunes帐户都是唯一的。如果您的最终用户正在使用家庭共享,则这些帐户将被分配不同的UUID(可能是期望的,也可能不是),但您无法做任何事情。任何数量的设备在相同的iTunes帐户下启动将看到相同的UUID。
这种方法是完全合法的,应该没有任何问题得到Apple的批准。
显然,您必须在Xcode的功能下启用iCloud键值存储,只需打开iCloud开关即可。
这是一个简单的Objective-C类,实现了这个概念:
@implementation EEUserID
+ (NSUUID *) getUUID
{
NSUUID *uuid = nil;
NSString *uuidString = [[NSUbiquitousKeyValueStore defaultStore] stringForKey: @"EEUserID"];
if (uuidString == nil)
{
uuid = [NSUUID UUID];
[[NSUbiquitousKeyValueStore defaultStore] setString: uuid.UUIDString forKey: @"EEUserID"];
[[NSUbiquitousKeyValueStore defaultStore] synchronize];
}
else
{
uuid = [[NSUUID alloc] initWithUUIDString: uuidString];
}
return uuid;
}
+ (NSString *) getUUIDString
{
NSUUID *uuid = [self getUUID];
if (uuid != nil)
return uuid.UUIDString;
else
return nil;
}
+ (void) load
{
[[NSUbiquitousKeyValueStore defaultStore] synchronize];
}
@end
而对于头文件:
#import <Foundation/Foundation.h>
@interface EEUserID : NSObject
+ (NSUUID *) getUUID;
+ (NSString *) getUUIDString;
@end
要使用,您所要做的就是调用:
NSString *uniqueIDForiTunesAccount = [EEUserID getUUIDString]
享受。