web-dev-qa-db-ja.com

iPhoneアプリの一意の識別子

画像をサーバーに送信するiPhoneアプリの場合、特定の電話からのすべての画像をどうにか結び付ける必要があります。送信するたびに、一意の電話IDを送信します。をみました

 [[UIDevice mainDevice] uniqueIdentifier]
および [[NSUserDefaults standardDefaults] stringForKey:@ "SBFormattedPhoneNumber"]

しかし、シミュレータでエラーが発生します。

Appleこれを行う認可された方法はありますか?

31
Martin Redmond

どのようなエラーが発生していますか? [[UIDevice currentDevice] uniqueIdentifier]aPIを修正するために編集、Martinに感謝!)は、これを行うための公式に推奨される方法です。

41
Ben Gottlieb

CFUUIDを使用してUUIDを生成することもできます。ここにいくつかのコードがあります:

NSString *uuid = nil;
CFUUIDRef theUUID = CFUUIDCreate(kCFAllocatorDefault);
if (theUUID) {
  uuid = NSMakeCollectable(CFUUIDCreateString(kCFAllocatorDefault, theUUID));
  [uuid autorelease];
  CFRelease(theUUID);
}
18
Jason Harris

一意の識別子を取得する最も簡単で適切な方法は、Appleが明示的に提供するメカニズムを使用することです-[[UIDevice currentDevice] uniqueIdentifier]。電話番号がデバイスに固有であること、またはデバイスに電話番号が割り当てられることさえ保証できません。それを超えると、ユーザーのプライバシーが確実に侵害されるため、そうすることは恐ろしい考えです。何らかの方法で保存する場合は、uniqueidentifierもハッシュする必要があります。

13
wisequark

インストール間で作成した一意の識別子を保持するには、キーチェーンを使用できます SSKeychainで簡単に作成できます :次のようにUUIDを設定するだけです。

        [SSKeychain setPassword:@"Your UUID" forService:@"com.yourapp.yourcompany" account:@"user"];

必要なときはいつでももう一度呼び出します:

NSString *retrieveuuid = [SSKeychain passwordForService:@"com.yourapp.yourcompany" account:@"user"];

注:サービスとアカウントは完全に一致する必要があります

次に、アプリを削除して再インストールすると、UUIDは再インストールしても保持されます。

次に、このUUIDをデバイス間で共有する場合は、iCloudを使用するようにアプリを設定します。次に、UUIDをNSUserDefaultsに保存し、KeyValueStoreと同期してから、上記のコードを使用して、新しいデバイスのキーチェーンにUUIDを設定します。

上記すべてのコードを入力すると、この回答は非常に長くなりますが、すべてを理解するために、この辺りにたくさんのサンプルコードがあります。

8
Moomio

IOS 5のuniqueIdentifierは非推奨になるので、その代わりにCFUUIDを使用する必要があることを忘れないでください。

7
gN0Me

興味深いことに、Appleは(gN0Meが言及したように)iOS 5のuniqueIdentifierを非推奨にしています。)関連するTechCrunch記事は次のとおりです: http://techcrunch.com/2011/08/19/ Apple-ios-5-phasing-out-udid /

Appleでは、デバイスを一意に識別するのではなく、userを識別することを推奨しています。ほとんどの場合、これは優れたアドバイスですが、globally一意のデバイスIDを必要とする状況もあります。これらのシナリオは、広告ではかなり一般的です。したがって、既存の動作を正確に再現する非常にシンプルなドロップインライブラリを作成しました。

自己宣伝の恥知らずなプラグインで、誰かがそれが役に立つと思うことを願ってここにリンクします。また、私はすべてのフィードバック/批評を歓迎します: http://www.binpress.com/app/myid/591

それでも、特定の状況では、ライブラリが提供するglobally一意のID機能をスキップすることをお勧めします。代わりに、簡単なCFUUIDを生成してNSUserDefaultsに保存します。このIDはアプリケーションに固有ですが、その「アプリインストール」のすべての写真をデータベースにグループ化できます。

言い換えると、uniqueIdentifierメソッドを廃止することで、Appleは、デバイスごとではなくアプリごとにinstallを識別することを示唆しています。特定の条件下で動作している場合、アプリごとにIDが製品に適している可能性があります。

5
Sam Stewart

これは私が解決しようとしている興味深い問題です。これが私が対処したいシナリオです。

スマートフォンを別の人に売った場合、どうなりますか?そのデバイスIDは誰かに属します。そのため、アプリがiPhoneから削除された場合でも、再度追加され、すべてのデータが再度関連付けられます。新しいユーザーに...これは悪いです。

デバイスID MD5の電話番号を使用すると、優れたソリューションになります。私たちが思いついた別の方法は、SQL Lite DBに、デバイスIDでハッシュされたトークンをいくつか持つことです。次に、アプリが削除されると、DBが強制終了され、すべてのデータの関連付けが解除されます。もろいかもしれません。

他のアイデアはありますか?

ロブ・エリス(PhoneGap/Nitobi)

2
Rob

最良のソリューションであるAppleのGenericKeyChainを使用してください。ここに作業サンプルがあります>> https://developer.Apple.com/library/prerelease/ios/samplecode/GenericKeychain/Introduction/Intro.html

KeyChainAccessについてアイデアを持っている>> https://developer.Apple.com/library/mac/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html#//Apple_ref/doc/uid/TP30000897-CH204- TP9

1
Karan Alangat

Iphoneの作業は行っていませんが、電話に固有の何かのハッシュを取得してみてはどうでしょう...おお、電話番号を言ってみませんか?

iphone番号を取得しています

0
Niniki

私はそのようなコードで成功しました:

- (NSString *)stringUniqueID {
    NSString *  result;
    CFUUIDRef   uuid;
    CFStringRef uuidStr;
    uuid = CFUUIDCreate(NULL);
    assert(uuid != NULL);
    uuidStr = CFUUIDCreateString(NULL, uuid);
    assert(uuidStr != NULL);
    result = [NSString stringWithFormat:@"%@", uuidStr];
    assert(result != nil);
    NSLog(@"UNIQUE ID %@", result);
    CFRelease(uuidStr);
    CFRelease(uuid);
    return result;
}    
0
Holtwick

抜粋:

NSString *phoneNumber = (NSString *) [[NSUserDefaults standardUserDefaults] objectForKey:@"SBFormattedPhoneNumber"]; // Will return null in simulator!
NSLog(@"Formatted phone number [%@]", phoneNumber);

[最近] OS 2.2.1 [およびOS 3.0]でこのコードをそのまま実行しました。

デバイスで実行すると期待どおりに機能し、完全な国際ダイヤルコード(私の場合は1)を含む電話番号を返します。

シミュレータで実行した場合、値[returned]はnull文字列であるため、実際のiPhoneデバイスでのみ機能します。

IPod Touchではテストしていません。

...

今週、別のデバイスでこのコードを実行し、数値の代わりにnull値を取得しました。

さらなる調査の結果、このコードスニペットによって返される数値は、デバイス用にiTunesで設定された数値であると思われます。

デバイスのアクティベーション時にiTunesにiPhoneの番号を入力しなかった場合、またはおそらく(私の場合のように)デフォルト値がiPhoneの番号ではなく、いずれにしても[OK]をクリックした場合、iTunesは電話番号を表示しません。 iPhoneが接続されている場合、このコードはnull文字列を返します。

[上記は、このトピックに関する別の記事に最近投稿したコメントの編集された連結です http://www.alexcurylo.com/blog/2008/11/15/snippet-phone-number/]

0
Crisp

MACアドレスを一意のIDとして使用できます。次のリンクが役立ちます

プログラムでiphoneのMACアドレスを取得するにはどうすればよいですか

0
James

ここ は、iTunesから取得する方法に関するいくつかの詳細情報であり、テストの目的で役立つ場合があります。

0
Andrew Burns