안녕하세요.
이번 글에서는 iOS13 환경에서 deviceToken을 가져올 때 달라진 점에 대해서 공유하려고 합니다.

달라진 점

iOS12 환경에서는 deviceToken을 가져오는 메소드에서 deviceToken 파라미터 데이터 형식은

<124686a5 556a72ca d808f572 00c323b9 3eff9285 92445590 3225757d b83997ba>

iOS13 환경에서는

{length=32,bytes=0x91e27cd9ddf20c69da8fa650e2a06f55...e60b100d99d60adf}

로 변경되었습니다.

대응

iOS12 환경에서 deviceToken 데이터를 String으로 아래의 방법으로 가공하였다면,

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    var deviceTokenString = String(format: "%@", deviceToken as CVarArg)

    deviceTokenString = deviceTokenString.replacingOccurrences(of: "<", with: "")
    deviceTokenString = deviceTokenString.replacingOccurrences(of: ">", with: "")
    deviceTokenString = deviceTokenString.replacingOccurrences(of: " ", with: "")
    ...
  }

iOS13 환경에서는 Base16-encoded / hexadecimal string 표현으로 변환해야 합니다.

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let deviceTokenString = deviceToken.map { String(format: "%02x", $0) }.joined()
    ...
}

map메소드를 이용하여 Data의 각 바이트를 16진수로 String으로 만들고, joined()을 이용하여 단일 문자열로 변환하는 방식입니다.

마무리

iOS12 환경에서는 푸시기능이 잘 작동하였는데, iOS13버전 대응하면서 디바이스 토큰 데이터 구조가 변경되었고, 갑작스럽게 대응하느라 미리 대응했으면 좋았을텐데에 대한 아쉬움이 남네요. iOS14버전 부터는 미리 미리 대응하는 습관을 길러야겠네요:)