Swiftで一意のデバイスIDを取得するにはどうすればよいですか?


181

Swiftでデバイスの一意のIDを取得するにはどうすればよいですか?

データベースで使用するIDと、ソーシャルアプリのWebサービスのAPIキーとして使用するIDが必要です。このデバイスを毎日追跡し、データベースへのクエリを制限するもの。

ありがとう!

回答:


386

あなたはこれを使うことができます(Swift 3):

UIDevice.current.identifierForVendor!.uuidString

古いバージョンの場合:

UIDevice.currentDevice().identifierForVendor

または文字列が必要な場合:

UIDevice.currentDevice().identifierForVendor!.UUIDString


ユーザーがアプリをアンインストールした後にデバイスを一意に識別する方法はなくなりました。ドキュメントは言う:

アプリ(または同じベンダーの別のアプリ)がiOSデバイスにインストールされている間、このプロパティの値は変わりません。ユーザーがデバイスからそのベンダーのアプリをすべて削除し、その後それらの1つ以上を再インストールすると、値が変わります。


また、詳細についてはMattt Thompsonによるこの記事を読むこともできます。http
//nshipster.com/uuid-udid-unique-identifier/

Swift 4.1の更新。以下を使用する必要があります。

UIDevice.current.identifierForVendor?.uuidString

おそらく.UUIDStringを追加して、実際にサーバーに送信できるようにしますか?
Daniel Galasko

2
うん。それは明白なことだと思いましたが、答えに含めました。
Atomix '19

19
アプリのアンインストール後、この番号は同じではなくなります。アプリをアンインストールした後でもデバイスを追跡する方法はありますか?
jmcastel 2014

5
より良い質問は、アンインストール後にアカウントが削除された場合、IDが使用されなくなったときにサーバー上のアカウントをどのように削除するかです。
Jason G

2
@UmairAfzal多くのものがシミュレータでは機能しません。実際のデバイスで試してみましたか?
Atomix 2016年

10

UIDeviceクラスにあるidentifierForVendorパブリックプロパティを使用できます。

let UUIDValue = UIDevice.currentDevice().identifierForVendor!.UUIDString
        print("UUID: \(UUIDValue)")

Swift 3を編集

UIDevice.current.identifierForVendor!.uuidString

編集を終了

プロパティ階層のスクリーンショット


3
これは@Atomixの回答のコピーです
Ashley Mills

10

スウィフト3.X最新のワーキングコード、簡単に使い方;

   let deviceID = UIDevice.current.identifierForVendor!.uuidString
   print(deviceID)

3
これは、アンインストールを使用してアプリを再度インストールするたびに変わります。
iPeter 2018年

7
これは、@ AtomixとJayprakasDubeyの回答のコピーです
Ashley Mills

10

devicecheck(Swift 4)の Appleドキュメントを使用できます。

func sendEphemeralToken() {
        //check if DCDevice is available (iOS 11)

        //get the **ephemeral** token
        DCDevice.current.generateToken {
        (data, error) in
        guard let data = data else {
            return
        }

        //send **ephemeral** token to server to 
        let token = data.base64EncodedString()
        //Alamofire.request("https://myServer/deviceToken" ...
    }
}

典型的な使用法:

通常、DeviceCheck APIを使用して、新しいユーザーが同じデバイス上の別のユーザー名でオファーをまだ引き換えていないことを確認します。

サーバーアクションに必要なもの:

WWDC 2017-セッション702を参照してください

Santosh Botreの記事の詳細-iOSデバイスの一意の識別子

関連するサーバーは、このトークンをAppleから受け取った認証キーと組み合わせ、その結果を使用してデバイスごとのビットへのアクセスを要求します。


1
私がそれを正しく理解している場合、トークンの生成はDCDevice.generateToken()を使用して実行され、呼び出しごとに一意のランダムなdevice_tokenが生成されます。したがって、device_tokenは永続的ではなく、一時的です。私が理解していないのは、サーバーが一時トークンをデバイスに関連付ける方法です。
user1118764 2017

@ user1118764 "2ビットを設定—アプリケーションサーバーは、このトークンの共有とビット値の設定を担当します。" 詳細については、medium.com / @ santoshbotre01 / をご覧ください。また、公式ドキュメントdeveloper.apple.com/documentation/devicecheck/…および702セッションdeveloper.apple.com/videos/play/wwdc2017/702
iluvatar_GR

1

Swift 2.2

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    let userDefaults = NSUserDefaults.standardUserDefaults()

    if userDefaults.objectForKey("ApplicationIdentifier") == nil {
        let UUID = NSUUID().UUIDString
        userDefaults.setObject(UUID, forKey: "ApplicationIdentifier")
        userDefaults.synchronize()
    }
    return true
}

//Retrieve
print(NSUserDefaults.standardUserDefaults().valueForKey("ApplicationIdentifier")!)

2
userdefaultsもアプリケーションのアンインストールで削除されるため、ユーザーがアプリケーションを削除しても役に立たない。
Rehan Ali

0
if (UIDevice.current.identifierForVendor?.uuidString) != nil
        {
            self.lblDeviceIdValue.text = UIDevice.current.identifierForVendor?.uuidString
        }

1
コードおよび/またはオファーの詳細と、これが投稿された質問をどのように解決するかについての説明をコメントしてください。
RyanNerd

-1
class func uuid(completionHandler: @escaping (String) -> ()) {
    if let uuid = UIDevice.current.identifierForVendor?.uuidString {
        completionHandler(uuid)
    }
    else {
        // If the value is nil, wait and get the value again later. This happens, for example, after the device has been restarted but before the user has unlocked the device.
        // https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor?language=objc
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            uuid(completionHandler: completionHandler)
        }
    }
}

-1

ユーザーがデバイスからそのベンダーのアプリをすべて削除すると、identifierForVendorの値が変わります。その後の新規インストールでも一意のIDを保持したい場合は、次の関数を使用してみてください

func vendorIdentifierForDevice()->String {
    //Get common part of Applicatoin Bundle ID, Note : getCommonPartOfApplicationBundleID is to be defined.
    let commonAppBundleID = getCommonPartOfApplicationBundleID()
    //Read from KeyChain using bunndle ID, Note : readFromKeyChain is to be defined.
    if let vendorID = readFromKeyChain(commonAppBundleID) {
        return vendorID
    } else {
        var vendorID = NSUUID().uuidString
        //Save to KeyChain using bunndle ID, Note : saveToKeyChain is to be defined.
        saveToKeyChain(commonAppBundleID, vendorID)
        return vendorID
    }
}

誰がこの回答に反対票を投じたのですか、なぜこの反対票を投じたのか説明していただけますか?getCommonPartOfApplicationBundleID()、readFromKeyChain、saveToKeyChainは、実装する必要のあるカスタムメソッドです。回答のサイズを大きくしないと考えている定義は含めていません。
Shihab

キーチェーンに保存されている値は、アプリをアンインストールしても保持されますか?
Anees

1
@Anees、正解です。私の答えはiOS 10.3 Beta 2からは無効です。共有アプリがない場合、アプリのアンインストール後にキーチェーンアイテムが自動的に削除されます。つまり、最終的にはidentifierForVendorメソッドと同じ動作になります。
Shihab

-18

私は試しました

let UUID = UIDevice.currentDevice().identifierForVendor?.UUIDString

代わりに

let UUID = NSUUID().UUIDString

そしてそれは動作します。


30
NSUUID()。UUIDStringは毎回新しい文字列を提供します
Eric
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.