(少なくとも理論的には)繰り返されないint値を生成する必要があります。私はarc4random()fncがあることを知っていますが、現在の日付またはsmthでそれを使用する方法がわかりません:(
これは、MySQLで生成されたUUIDによく似た一意のキーを返します。
+ (NSString *)uuid
{
CFUUIDRef uuidRef = CFUUIDCreate(NULL);
CFStringRef uuidStringRef = CFUUIDCreateString(NULL, uuidRef);
CFRelease(uuidRef);
return [(NSString *)uuidStringRef autorelease];
}
ARCバージョン:
+ (NSString *)uuid
{
CFUUIDRef uuidRef = CFUUIDCreate(NULL);
CFStringRef uuidStringRef = CFUUIDCreateString(NULL, uuidRef);
CFRelease(uuidRef);
return (__bridge_transfer NSString *)uuidStringRef;
}
UUIDを生成するシンプルなバージョン(iOS 6以降)。
Objective-C:
NSString *UUID = [[NSUUID UUID] UUIDString];
Swift 3以降:
let uuid = UUID().uuidString
これは68753A44-4D6F-1226-9C60-0050E4C00067のようなものを生成します。これは、この関数を呼び出すたびに、複数のデバイスや場所にわたっても一意です。
Core Dataを使用してプレイしたゲームを保存している場合、NSManagedObject
objectID
は余分な労力なしで目的を果たすはずです。
UIApplication、UIDeviceのカテゴリを作成するか、このように好きなように作成できます(ARCの例)
@interface UIApplication (utilities)
- (NSString*)getUUID;
@end
@implementation UIApplication (utilities)
- (NSString*)getUUID {
NSUserDefaults *standardUserDefault = [NSUserDefaults standardUserDefaults];
static NSString *uuid = nil;
// try to get the NSUserDefault identifier if exist
if (uuid == nil) {
uuid = [standardUserDefault objectForKey:@"UniversalUniqueIdentifier"];
}
// if there is not NSUserDefault identifier generate one and store it
if (uuid == nil) {
uuid = UUID ();
[standardUserDefault setObject:uuid forKey:@"UniversalUniqueIdentifier"];
[standardUserDefault synchronize];
}
return uuid;
}
@end
UUID()はこの関数です
NSString* UUID () {
CFUUIDRef uuidRef = CFUUIDCreate(NULL);
CFStringRef uuidStringRef = CFUUIDCreateString(NULL, uuidRef);
CFRelease(uuidRef);
return (__bridge NSString *)uuidStringRef;
}
これにより、NSUserDefaultに保存された一意の識別子が生成され、アプリケーションが必要とするときにいつでも再利用できます。この識別子は、アプリケーションのインストールに関係なく一意であり、たとえば、APNサービスをサブスクライブしているデバイスの数を追跡するために使用できます。 ...
その後、次のように使用できます。
NSString *uuid = [[UIApplication sharedApplication] getUUID];
単純なタイムスタンプ(ミリ秒* 10)でうまくいくはずです。
self.uid = [NSNumber numberWithInteger:[NSDate timeIntervalSinceReferenceDate] * 10000];
ミリ秒単位の時間またはより高度な方法 [〜#〜] guid [〜#〜] を使用できます。
あなたはそれがランダムである必要があるとは言いませんでした。では、いくつかの数値から始めて、最後に生成した数値に1を加えるだけにしてください。
この方法では、最初に少なくとも40億の一意の数が得られます。
-(NSInteger)nextIdentifies;
{
static NSString* lastID = @"lastID";
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
NSInteger identifier = [defaults integerForKey:lastID] + 1;
[defaults setInteger:identifier forKey:lastID];
[defaults synchronize];
return identifier;
}
NSDictionaryがある場合は、最後のアイテムからプログレッシブIDを生成できます。
NSInteger maxKey = -1;
for(NSString *key in [YOUR_DICTIONARY allKeys])
{
NSInteger intKey = [key integerValue];
if(intKey > maxKey)
{
maxKey = intKey;
}
}
NSString *newKey = [NSString stringWithFormat:@"%d", maxKey + 1];
特に1ずつ増加するルーチンを使用する場合、アプリが削除されてiDeviceに再ロードされると、保存されているデフォルトの番号がなくなることに注意する必要があります。最初からやり直します。ユーザーのスコアを保存している場合は、ユーザーの最大数も保存することをお勧めします。特定の日付の後の秒(またはミリ秒)の時間ルーチンをチェックすることをお勧めします。上記のGUIDは、そのような一意性が必要な場合にも適しています。