web-dev-qa-db-ja.com

iOS 7では常に一意のデバイスIDを取得します

IOSアプリケーションは特定のユーザー向けです。そのため、ユーザーの識別にdevice unique identifierを使用しました。 同じ値を毎回取得しているため、このアプローチはiOS 6まで正常に機能します。

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

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

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

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

31
jaydev

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

-(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'

31
nerowolfe

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

現時点では、Apple UDIDをベンダーIDと広告IDの2つの異なる識別子に置き換える計画です。

ベンダーID

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

広告ID

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


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

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

今週初めのiOS7の発表で、Appleは追加のステップを踏みました。これは、別の一意の識別子をオフにすることでした。アプリ開発者や広告会社が新しい広告ID。この抜け穴を塞ぐことにより、Appleは、これらの企業にユーザーが制御できるアプリ間識別子のみを使用するよう強制する良い手段を講じています。

今後の課題は、ターゲット企業が引き続きAppleの任務を回避する方法を模索するかどうかです。 Appleのフレームワーク外でデバイスを一意に識別するために、「デバイスフィンガープリンティング」などの他のテクノロジーが開発されました。 Appleがこれらのメソッドを取り締まるかどうかはまだわからない。

8
k.t

IDevice Class reference for identifierForVendorから:

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

2
neilco

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

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

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

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

2
tilo

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

1
Maggie

nerowolfe's answer に何かを追加するために、MCSMKeychainItemという名前の優れたキーチェーンラッパーがあります。コード:

[MCSMApplicationUUIDKeychainItem applicationUUID];

基本的な使い方は次のようになります

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

キーチェーンに基づいて動作し、一度生成された一意の識別子を保存します(nerowolfが示唆したとおり)。これはオープンソースであり、ダウンロードできます githubで

注:私は拡張機能の作成者ではありません。

0
FurloSK

マシン上のアプリのキャッシュをクリアしてから確認してください。キャッシュの問題である可能性があります

0
Hussain Shabbir