うわー... 今週、iPhone の UDID の使用に関するすべての「パニック ストーリー」をオンラインで見てください。
[[UIDevice currentDevice] uniqueIdentifier]
代わりに何を使用する必要がありますか?
電話が別のユーザーに販売され、アプリが電話の UDID に基づいてリモート サーバーにデータを保存した場合はどうなるでしょうか。
(もちろん、アプリストアの「暗号化制限」の問題は避けたいです。)
うわー... 今週、iPhone の UDID の使用に関するすべての「パニック ストーリー」をオンラインで見てください。
[[UIDevice currentDevice] uniqueIdentifier]
代わりに何を使用する必要がありますか?
電話が別のユーザーに販売され、アプリが電話の UDID に基づいてリモート サーバーにデータを保存した場合はどうなるでしょうか。
(もちろん、アプリストアの「暗号化制限」の問題は避けたいです。)
Mac アドレスを使用して、場合によってはそれをハッシュしてみませんか。
ここに優れた UIDevice-Extension カテゴリがあります
- (NSString *) macaddress
{
int mib[6];
size_t len;
char *buf;
unsigned char *ptr;
struct if_msghdr *ifm;
struct sockaddr_dl *sdl;
mib[0] = CTL_NET;
mib[1] = AF_ROUTE;
mib[2] = 0;
mib[3] = AF_LINK;
mib[4] = NET_RT_IFLIST;
if ((mib[5] = if_nametoindex("en0")) == 0) {
printf("Error: if_nametoindex error\n");
return NULL;
}
if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
printf("Error: sysctl, take 1\n");
return NULL;
}
if ((buf = malloc(len)) == NULL) {
printf("Could not allocate memory. error!\n");
return NULL;
}
if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
printf("Error: sysctl, take 2");
return NULL;
}
ifm = (struct if_msghdr *)buf;
sdl = (struct sockaddr_dl *)(ifm + 1);
ptr = (unsigned char *)LLADDR(sdl);
NSString *outstring = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X",
*ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
// NSString *outstring = [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X",
// *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
free(buf);
return outstring;
}
これをモデルでハッシュ化できますか?
私が今朝この投稿で尋ねたように、いくつかの選択肢があります:
1-まず、Appleが推奨するように、デバイスごとに識別するのではなく、インストールごとに識別します。したがって、CFUUIDRefを使用できます。例 :
NSString *uuid = nil;
CFUUIDRef theUUID = CFUUIDCreate(kCFAllocatorDefault);
if (theUUID) {
uuid = NSMakeCollectable(CFUUIDCreateString(kCFAllocatorDefault, theUUID));
[uuid autorelease];
CFRelease(theUUID);
}
2-世界的に一意の識別子が必要な場合は、この識別子をiCloudに保存できます。
3-最後に、アプリの再インストール後に残る識別子が本当に必要な場合(それほど頻繁には発生しません)、キーチェーン(Appleのキーチェーンドキュメント)を使用できます。しかし、アップルチームはそれを好きになるでしょうか?
UUID は減価償却されたばかりなので、しばらくの間は存続するでしょう。Apple はこの減価償却についてまだあまり言及していません。これについてもっと言うことがあるまで待ちます。
Apple のドキュメントには次のように書かれています。
"uniqueIdentifier プロパティを使用しないでください。アプリに固有の一意の識別子を作成するには、CFUUIDCreate 関数を呼び出して UUID を作成し、NSUserDefaults クラスを使用して既定のデータベースに書き込むことができます。"
ここに簡単なスニペットがあります:
CFUUIDRef udid = CFUUIDCreate(NULL);
NSString *udidString = (NSString *) CFUUIDCreateString(NULL, udid);
1 つの解決策は、アプリケーションに無料のアプリ内購入を発行させることです。
この購入は次のようになります。
アプリにとってのみ意味のある一意の番号 (購入) 番号で追跡可能。
人がデバイスを切り替えると移動可能
アプリが削除された場合(または電話がワイプされてリロードされた場合)、取得可能 - アプリ内購入を復元できます。
推奨される方法は、UUID 生成を使用し、それをユーザー自身がアプリに提供する意思のあるものと関連付けることです。
次に、このデータを外部に保存して、再び取得できるようにします。これを簡単に行う方法は他にもあると思いますが、これが推奨される方法です。