正しい解決策は、iCloud Key-Valueストアを使用することです。このストアでは、認証や電子メールアドレスなどのユーザー情報を必要とせずに、一意のユーザーIDを保存できます。
最終結果はランダムなUUID(実際にユーザーを識別するものではありません)です。これはユーザーごとに異なりますが、同じiCloudアカウントに登録されている複数のデバイス間で存続します。
iCloudKVストアでフィールドを定義します。これをuserIDと呼びましょう。アプリを起動すると、まずuserIDを確認します。そこにある場合は、すべてユーザーの一意のIDで設定されています。そうでない場合は、このユーザーに対して実行するのはこれが初めてです。ランダムなUUIDを生成し、userIDでKVストアに保存します。これですべてです。
私たちの経験によると、このUUIDはiTunesアカウントごとに一意です。エンドユーザーが家族共有を使用している場合、それらのアカウントには異なるUUIDが割り当てられます(これは望ましい場合と望ましくない場合がありますが、それについてできることは何もありません)。同じiTunesアカウントで起動する任意の数のデバイスに同じUUIDが表示されます。
このアプローチは完全に合法であり、問題なくAppleによって承認される必要があります。
明らかに、Xcodeの[機能]でiCloudKey-Valueストアを有効にする必要があります。iCloudスイッチをオンにするだけです。
これは、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];
楽しみ。