[Swift] React Native의 DeviceInfo.getUniqueId()를 iOS에서 사용하기

리액트 앱에서 디바이스 UUID를 가져오는데, 앱을 재설치해도 그대로 값을 가져온다. 원리가 궁금해서 찾아봤더니… 역시 세상엔 똑똑한 사람들 천지다.

Gets the device unique ID. On Android it is currently identical to getAndroidId() in this module. On iOS it uses the DeviceUID uid identifier.

https://github.com/react-native-community/react-native-device-info#getuniqueid

DeviceUID 가 뭔가 싶어서 찾아봤는데, 이런 류의 코드가 주로 검색된다.

UIDevice.current.identifierForVendor?.uuidString

당연히 앱을 재설치할 때마다 값이 달라진다. 근데 DeviceUID 라는게 생소해서 검색하다가 이 글을 찾았다. https://stackoverflow.com/a/54234109/1025379

KeychainWrapper.standard.set("myValue", forKey: "myKey")
KeychainWrapper.standard.string(forKey: "myKey")

KeychainWrapper 라는건 뭔가 싶어서 찾아봤더니, 키체인에 정보저장하는 거였다. Swift Package Manager를 지원하는 https://github.com/puretears/KeychainWrapper 를 이용해서 아래와 같은 코드를 만들었다.

var appUuid: String {
  guard let uuid = KeychainWrapper.default.string(forKey: "myKey") else {
    let newUuid = UUID().uuidString
    KeychainWrapper.default.set(newUuid, forKey: "myKey")
    return newUuid
  }
  return uuid
}

이러면 폰을 초기화하기 전까지는 고유한 값을 가져올 수 있다.