จะรับรหัสอุปกรณ์เฉพาะใน Swift ได้อย่างไร


181

ฉันจะรับรหัสเฉพาะของอุปกรณ์ใน Swift ได้อย่างไร

ฉันต้องการ ID เพื่อใช้ในฐานข้อมูลและเป็นคีย์ API สำหรับบริการเว็บของฉันในแอปโซเชียลของฉัน สิ่งที่ต้องติดตามของอุปกรณ์นี้ใช้ทุกวันและ จำกัด การสืบค้นไปยังฐานข้อมูล

ขอบคุณ!

คำตอบ:


386

คุณสามารถใช้สิ่งนี้ (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

อาจเพิ่ม. UIDIDring เพื่อให้สามารถส่งไปยังเซิร์ฟเวอร์ได้จริงหรือ
Daniel Galasko

2
ได้. ฉันคิดว่าเป็นสิ่งที่ชัดเจนที่จะทำ แต่ฉันรวมไว้ในคำตอบ
Atomix

19
หลังจากแอปถอนการติดตั้งหมายเลขนี้จะไม่เหมือนเดิมอีกต่อไป มีวิธีการติดตามอุปกรณ์แม้หลังจากถอนการติดตั้งแอป
jmcastel

5
คำถามที่ดีกว่าคือถ้าลบออกหลังจากถอนการติดตั้งคุณจะลบบัญชีของพวกเขาบนเซิร์ฟเวอร์ของคุณได้อย่างไรเมื่อไม่มีการใช้ ID
Jason G

2
@UmairAfzal หลายสิ่งไม่ทำงานในโปรแกรมจำลอง คุณลองบนอุปกรณ์จริงหรือไม่?
Atomix

10

คุณสามารถใช้คุณสมบัติตัวระบุสาธารณะของ identifierForVendor ที่มีอยู่ในคลาส UIDevice

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

แก้ไข Swift 3:

UIDevice.current.identifierForVendor!.uuidString

สิ้นสุดการแก้ไข

สกรีนช็อตสำหรับลำดับชั้นคุณสมบัติ


3
นี่เป็นเพียงสำเนาของ @Atomix คำตอบ
Ashley Mills

10

สำหรับSwift 3.Xรหัสการทำงานล่าสุดใช้งานง่าย;

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

3
การเปลี่ยนแปลงนี้เมื่อใดก็ตามที่ใช้ถอนการติดตั้งและติดตั้งแอปอีกครั้ง
iPeter

7
นี่เป็นเพียงสำเนาของคำตอบของ @Atomix & JayprakasDubey
Ashley Mills

10

คุณสามารถใช้อุปกรณ์ตรวจสอบอุปกรณ์ (ใน 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

@ user1118764 "ตั้งค่าสองบิต - แอปพลิเคชันเซิร์ฟเวอร์จะรับผิดชอบการแบ่งปันโทเค็นนี้และตั้งค่าบิต" อ่านเพิ่มเติมได้ที่นี่medium.com/@santoshbotre01/ …และที่นี่จากผู้พัฒนาเอกสารอย่างเป็นทางการ.
apple.com/documentation/devicecheck/

1

สวิฟท์ 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 methid
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.