正确的解决方案是使用iCloud Key-Value Store,您可以在其中存储唯一的用户 ID,而无需任何类型的身份验证或用户信息,例如电子邮件地址。
最终结果是一个随机的 UUID(实际上并没有识别用户),每个用户都不同,但会在注册到同一个 iCloud 帐户的多个设备上持续存在。
我们在 iCloud KV Store 中定义了一个字段,我们称之为 userID。当应用程序启动时,我们首先检查用户 ID。如果它在那里,那么我们都设置了我们用户的唯一 ID。如果不是,那么这是我们第一次为这个用户运行。我们生成一个随机的 UUID 并将其存储在 userID 下的 KV Store 中。这里的所有都是它的。
我们的经验表明,此 UUID 对于每个 iTunes 帐户都是唯一的。如果您的最终用户正在使用家庭共享,则这些帐户将被分配不同的 UUID(这可能是可取的,也可能不是可取的,但您无能为力)。在同一 iTunes 帐户下启动的任意数量的设备都将看到相同的 UUID。
这种方法是完全合法的,应该得到 Apple 的批准,没有任何问题。
显然你必须在 Xcode 的 Capabilities 下启用 iCloud Key-Value store,只需打开 iCloud Switch 即可。
这是一个在 Objective-C 中实现这个概念的简单类:
@implementation EEUserID
+ (NSUUID *) getUUID
{
NSUUID *uuid = nil;
NSString *uuidString = [[NSUbiquitousKeyValueStore defaultStore] stringForKey: @"EEUserID"];
if (uuidString == nil)
{
// This is our first launch for this iTunes account, so we generate random UUID and store it in iCloud:
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
{
// get changes that might have happened while this
// instance of your app wasn't running
[[NSUbiquitousKeyValueStore defaultStore] synchronize];
}
@end
对于头文件:
#import <Foundation/Foundation.h>
@interface EEUserID : NSObject
+ (NSUUID *) getUUID;
+ (NSString *) getUUIDString;
@end
要使用,您所要做的就是调用:
NSString *uniqueIDForiTunesAccount = [EEUserID getUUIDString];
享受。