Swift에서 고유 한 장치 ID를 얻는 방법은 무엇입니까?


181

Swift에서 장치 고유 ID를 얻으려면 어떻게해야합니까?

데이터베이스 및 소셜 앱의 웹 서비스에 대한 API 키로 사용할 ID가 필요합니다. 이 장치를 매일 추적하고 쿼리를 데이터베이스로 제한하는 것.

감사!

답변:


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

.UUIDString을 추가하여 실제로 서버로 보낼 수 있습니까?
Daniel Galasko

2
예. 나는 그것이 명백한 일이라고 생각했지만 대답에 포함시켰다.
Atomix

19
앱 제거 후이 숫자는 더 이상 동일하지 않습니다. 앱을 제거한 후에도 장치를 추적하는 방법이 있습니까?
jmcastel

5
더 좋은 질문은 제거 후에 제거하면 ID를 더 이상 사용하지 않을 때 서버에서 계정을 어떻게 삭제합니까?
Jason G

2
@UmairAfzal 많은 것들이 시뮬레이터에서 작동하지 않습니다. 실제 기기에서 사용해 보셨습니까?
Atomix

10

UIDevice 클래스에 존재하는 identifierForVendor 공용 속성을 사용할 수 있습니다

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

스위프트 3 편집 :

UIDevice.current.identifierForVendor!.uuidString

편집 종료

속성 계층 스크린 샷


3
이것은 @Atomix 답변의 사본입니다
Ashley Mills

10

대한 스위프트 3.X 최신 작업 코드, 쉽게 사용;

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

3
앱을 제거하고 다시 설치할 때마다 변경됩니다.
iPeter

7
이 @Atomix & JayprakasDubey의 응답 단지 카피
애슐리 밀스

10

Apple 문서를 devicecheck (Swift 4에서) 사용할 수 있습니다

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 "2 비트 설정-Application Server가이 토큰을 공유하고 비트 값을 설정합니다." 자세한 내용은 medium.com/@santoshbotre01/… 및 공식 문서 developer.apple.com/documentation/devicecheck/… 및 702 세션 developer.apple.com/videos/play/wwdc2017/702
iluvatar_GR

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 베타 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.