ฉันจะรับรหัสเฉพาะของอุปกรณ์ใน Swift ได้อย่างไร
ฉันต้องการ ID เพื่อใช้ในฐานข้อมูลและเป็นคีย์ API สำหรับบริการเว็บของฉันในแอปโซเชียลของฉัน สิ่งที่ต้องติดตามของอุปกรณ์นี้ใช้ทุกวันและ จำกัด การสืบค้นไปยังฐานข้อมูล
ขอบคุณ!
ฉันจะรับรหัสเฉพาะของอุปกรณ์ใน Swift ได้อย่างไร
ฉันต้องการ ID เพื่อใช้ในฐานข้อมูลและเป็นคีย์ API สำหรับบริการเว็บของฉันในแอปโซเชียลของฉัน สิ่งที่ต้องติดตามของอุปกรณ์นี้ใช้ทุกวันและ จำกัด การสืบค้นไปยังฐานข้อมูล
ขอบคุณ!
คำตอบ:
คุณสามารถใช้สิ่งนี้ (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
คุณสามารถใช้คุณสมบัติตัวระบุสาธารณะของ identifierForVendor ที่มีอยู่ในคลาส UIDevice
let UUIDValue = UIDevice.currentDevice().identifierForVendor!.UUIDString
print("UUID: \(UUIDValue)")
แก้ไข Swift 3:
UIDevice.current.identifierForVendor!.uuidString
สิ้นสุดการแก้ไข
สำหรับSwift 3.Xรหัสการทำงานล่าสุดใช้งานง่าย;
let deviceID = UIDevice.current.identifierForVendor!.uuidString
print(deviceID)
คุณสามารถใช้อุปกรณ์ตรวจสอบอุปกรณ์ (ใน 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 เพื่อให้แน่ใจว่าผู้ใช้ใหม่ยังไม่ได้แลกข้อเสนอพิเศษภายใต้ชื่อผู้ใช้อื่นบนอุปกรณ์เดียวกัน
การกระทำที่เซิร์ฟเวอร์ต้องการ:
เพิ่มเติมจากบทความของ Santosh Botre - ตัวระบุที่ไม่ซ้ำกันสำหรับอุปกรณ์ iOS
เซิร์ฟเวอร์ที่เกี่ยวข้องของคุณรวมโทเค็นนี้กับคีย์การตรวจสอบสิทธิ์ที่คุณได้รับจาก Apple และใช้ผลลัพธ์เพื่อขอการเข้าถึงบิตต่ออุปกรณ์
สวิฟท์ 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")!)
if (UIDevice.current.identifierForVendor?.uuidString) != nil
{
self.lblDeviceIdValue.text = UIDevice.current.identifierForVendor?.uuidString
}
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)
}
}
}
มูลค่าของ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
}
}
ฉันได้ลองด้วย
let UUID = UIDevice.currentDevice().identifierForVendor?.UUIDString
แทน
let UUID = NSUUID().UUIDString
และมันใช้งานได้