9

うわー... 今週、iPhone の UDID の使用に関するすべての「パニック ストーリー」をオンラインで見てください。

 [[UIDevice currentDevice] uniqueIdentifier]

代わりに何を使用する必要がありますか?

電話が別のユーザーに販売され、アプリが電話の UDID に基づいてリモート サーバーにデータを保存した場合はどうなるでしょうか。

(もちろん、アプリストアの「暗号化制限」の問題は避けたいです。)

4

7 に答える 7

3

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;
}

これをモデルでハッシュ化できますか?

于 2011-08-20T11:12:31.230 に答える
2

私が今朝この投稿で尋ねたように、いくつかの選択肢があります:

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のキーチェーンドキュメント)を使用できます。しかし、アップルチームはそれを好きになるでしょうか?

于 2012-03-09T15:51:02.810 に答える
1

UUID は減価償却されたばかりなので、しばらくの間は存続するでしょう。Apple はこの減価償却についてまだあまり言及していません。これについてもっと言うことがあるまで待ちます。

于 2011-08-20T12:10:14.433 に答える
0

Apple のドキュメントには次のように書かれています。

"uniqueIdentifier プロパティを使用しないでください。アプリに固有の一意の識別子を作成するには、CFUUIDCreate 関数を呼び出して UUID を作成し、NSUserDefaults クラスを使用して既定のデータベースに書き込むことができます。"

ここに簡単なスニペットがあります:

CFUUIDRef udid = CFUUIDCreate(NULL);

NSString *udidString = (NSString *) CFUUIDCreateString(NULL, udid);
于 2011-12-19T20:04:52.547 に答える
0

1 つの解決策は、アプリケーションに無料のアプリ内購入を発行させることです。

この購入は次のようになります。

  1. アプリにとってのみ意味のある一意の番号 (購入) 番号で追跡可能。

  2. 人がデバイスを切り替えると移動可能

  3. アプリが削除された場合(または電話がワイプされてリロードされた場合)、取得可能 - アプリ内購入を復元できます。

于 2011-10-12T13:54:18.837 に答える
0

推奨される方法は、UUID 生成を使用し、それをユーザー自身がアプリに提供する意思のあるものと関連付けることです。

次に、このデータを外部に保存して、再び取得できるようにします。これを簡単に行う方法は他にもあると思いますが、これが推奨される方法です。

于 2011-08-20T10:59:57.667 に答える