web-dev-qa-db-ja.com

Swiftで一意のデバイスIDを取得する方法

Swiftでデバイスの一意のIDを取得する方法を教えてください。

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

ありがとうございます。

147
User

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

UIDevice.current.identifierForVendor!.uuidString

古いバージョンの場合

UIDevice.currentDevice().identifierForVendor

文字列が必要な場合は、

UIDevice.currentDevice().identifierForVendor!.UUIDString


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

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


詳細については、Mattt Thompsonによるこの記事も参照してください。
http://nshipster.com/uuid-udid-unique-identifier/

Swift 4.1用のアップデートを使用する必要があります。

UIDevice.current.identifierForVendor?.uuidString
330
Atomix

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

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

EDITSwift 3:

UIDevice.current.identifierForVendor!.uuidString

編集終了

Screenshot for property hierarchy

9

Swift 3.X最新のワーキングコード、簡単に使えます。

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

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から受け取った認証キーと組み合わせて、その結果を使用してデバイス単位のビットへのアクセスを要求します。

7
iluvatar_GR

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
n.by.n
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)
        }
    }
}
0
Joey