31

当社の iOS アプリケーションは、特定のユーザー向けです。そのため、ユーザーの識別にはデバイス固有の識別子を使用しました。毎回同じ値を取得しているため、このアプローチは iOS 6 までは問題なく機能します。

NSString *strUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier];

iOS 7 では、上記のメソッドは異なる値を返し、ユーザーの識別に問題が発生しています。iOS 7 では、次の代替が提供されます。

NSUUID *oNSUUID = [[UIDevice currentDevice] identifierForVendor];
[strApplicationUUID setString:[oNSUUID UUIDString]];

に置き換えuniqueIdentifieridentifierForVendorアドホック ビルドを作成しました。次に、ビルドを iOS 7 と iOS 6 の両方のデバイスにインストールしました。これまでのところ、iOS 7 では毎回同じ値を取得していますが、iOS 6ではアプリを削除して再インストールするたびに異なる値が返されます。

4

7 に答える 7

31

この小さなヘルパー メソッドを使用して、アプリのインストール/削除セッション間でキーチェーンに識別子を保持します

-(NSString *)getUniqueDeviceIdentifierAsString
{
    NSString *appName=[[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];

    NSString *strApplicationUUID = [SSKeychain passwordForService:appName account:@"incoding"];
    if (strApplicationUUID == nil)
    {
        strApplicationUUID  = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
        [SSKeychain setPassword:strApplicationUUID forService:appName account:@"incoding"];
    }

    return strApplicationUUID;
}

SSKeychainライブラリをプロジェクトに追加します。たとえば、Cocoapods を使用してpod 'SSKeychain'

于 2014-04-08T12:45:13.227 に答える
8

UDIDは何に置き換えられますか?

今のところ、Apple は UDID を 2 つの異なる ID、つまりベンダー ID と広告 ID に置き換えることを計画しているようです。

ベンダー ID

同じ開発者のアプリ間で同一の ID。そのチーム ID の最後のアプリを削除すると消去されます。

広告 ID

デバイスに固有です。すべてのアプリケーションで利用可能。広告に使用 — iAd は iOS 6 以降の UDID から変換されました。「すべてのコンテンツと設定を消去」でリセットします。


ほとんどの場合、ベンダー ID により、複数のアプリを持つ開発者は、すべてのアプリで同じユーザーとしてあなたを識別できます。これにより、開発者はオーディエンスをよりよく理解し、より良いサービスを提供できます。

広告 ID は引き続きデバイスの一意の識別子を作成しますが、UDID とは異なり、デスクトップまたはラップトップのブラウザーで Cookie を制御できるように、これをオフまたはリセットできます。

今週初めの iOS7 の発表により、Apple は追加の措置を講じました。それは、アプリ開発者や広告会社が新しい広告 ID の代わりに使用できる「MAC アドレス」という別の一意の識別子を無効にすることでした。この抜け穴を塞ぐことで、Apple はこれらの企業に、ユーザーが制御できるクロスアプリ識別子のみを使用するよう強制するという良い一歩を踏み出しています。

注目すべきは、攻撃対象の企業が引き続き Apple の命令を回避する方法を模索するかどうかです。「デバイス フィンガープリンティング」などの他のテクノロジは、Apple のフレームワーク外でデバイスを一意に識別するために開発されました。Apple がこれらの方法を取り締まるかどうかはまだわかりません。

于 2015-06-05T07:29:46.910 に答える
2

UIDeviceクラスリファレンスからidentifierForVendor

ユーザーがデバイスからそのベンダーのアプリをすべて削除し、その後それらの 1 つ以上を再インストールすると、値が変わります。この値は、Xcode を使用してテスト ビルドをインストールする場合、またはアドホック ディストリビューションを使用してデバイスにアプリをインストールする場合にも使用できます。したがって、アプリがこのプロパティの値をどこかに保存する場合は、識別子が変更された状況を適切に処理する必要があります。

于 2013-10-26T12:44:42.750 に答える
2

iOS7 デバイスにインストールされている同じベンダーの追加アプリはありますか? ドキュメントによると:

アプリ (または同じベンダーの別のアプリ) が iOS デバイスにインストールされている間、このプロパティの値は変わりません。ユーザーがデバイスからそのベンダーのアプリをすべて削除し、その後それらの 1 つ以上を再インストールすると、値が変わります。この値は、Xcode を使用してテスト ビルドをインストールする場合、またはアドホック ディストリビューションを使用してデバイスにアプリをインストールする場合にも使用できます。したがって、アプリがこのプロパティの値をどこかに保存する場合は、識別子が変更された状況を適切に処理する必要があります。

AppStore 経由でアプリを提供していますか? そうでない場合:

アプリがアプリ ストアからインストールされていない場合 (アプリがまだ開発中の場合など)、ベンダーはアプリのバンドル ID に基づいて決定されます。バンドル ID はリバース DNS 形式であると想定され、最初の 2 つのコンポーネントを使用してベンダー ID が生成されます。たとえば、com.example.app1 と com.example.app2 は同じベンダー ID を持つように見えます。

于 2013-10-26T12:46:03.953 に答える
1

あなたが署名した他のアプリケーションがデバイスにインストールされていない場合は、ベンダーの識別子を変更しても問題ありません。また、異なる配布方法でアプリケーションをインストールすると、ベンダーの識別子が変わる場合があります。アプリケーションは、XCode を介してインストールされた場合と、TestFlight または HockeyApp を介して配布された場合とで、ベンダーの識別子が異なる場合があります。

于 2013-10-26T12:44:25.283 に答える
0

nerowolfe の回答に何かを追加するためにMCSMKeychainItem、1 行のコードで一意のデバイス ID を生成および取得できる、他のいくつかのものに加えて、 という名前の優れたキーチェーン ラッパーがあります。

[MCSMApplicationUUIDKeychainItem applicationUUID];

したがって、基本的な使用法は次のようになります

+ (NSString *)deviceId {
  // load unique device ID or generate new one
  return [MCSMApplicationUUIDKeychainItem applicationUUID];
}

これは、一度生成された一意の識別子を格納するキーチェーンに基づいて機能します (nerowolf が提案したように)。これはオープンソースであり、github からダウンロードできます。

注:私は拡張機能の作成者ではありませんし、彼/彼女のことをまったく知りません。

于 2015-09-19T12:08:38.333 に答える