본문 바로가기
프로그래밍/Xcode-iOS

iOS13 Device Token 문자열 얻는 방법.

by Mr-후 2019. 11. 15.
반응형

iOS13 Device Token 문자열 얻는 방법.



오늘 Adhoc버전을 만들고 푸시 테스트를 하다 보니 DB에 들어간 토큰 문자열이 이상했다. 

스위프트에서는 예전부터 변경된 방법으로 사용했다고 하는 친구도 있는데 인터넷 검색을 해보니 토큰 문자열 파싱하는 방법이 조금 달라졌는데 그 좋은 예가 있어 

적용해보니 잘 작동하는 것 같다. 


기존 같으면 아래와 같은 방식으로 해서 값을 추출했었다. 

    NSString *_pushToken = [[deviceToken description]

                            stringByTrimmingCharactersInSet:[NSCharacterSet

                                                             characterSetWithCharactersInString:@"<>"]];

    _pushToken = [_pushToken stringByReplacingOccurrencesOfString:@" " withString:@""];


iOS13버전에서 했을때 DB에 저장된 문자열이 다음과 같은 식이었다. 

{length=32,bytes=0xfbebc41bd36394076c22bf25e4b58b7a...bddc931ce847f646}


NSData로 받은 deviceToken을 다음과 같이 적용했더니 이전버전과 13.x버전에서 잘 작동하였다. 




Objective-c버전

- (NSString *)stringFromDeviceToken:(NSData *)deviceToken {

    NSUInteger length = deviceToken.length;

    if (length == 0) {

        return nil;

    }

    const unsigned char *buffer = deviceToken.bytes;

    NSMutableString *hexString  = [NSMutableString stringWithCapacity:(length * 2)];

    for (int i = 0; i < length; ++i) {

        [hexString appendFormat:@"%02x", buffer[i]];

    }

    return [hexString copy];

}


Swift버전 

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

    let deviceTokenString = deviceToken.map { String(format: "%02x", $0) }.joined()

    ...

}


당장 월요일 배포할거였는데 하마터면 큰일날뻔했다. 그래도 고쳐서 올린게 어디야 ㅋㅋ 


참고URL : https://velog.io/@gwangyonglee/iOS13-%EC%95%B1-%ED%91%B8%EC%8B%9C-%EC%9E%A5%EC%B9%98-%ED%86%A0%ED%81%B0deviceToken-%EA%B4%80%EB%A0%A8-%EC%9D%B4%EC%8A%88

https://onesignal.com/blog/ios-13-introduces-4-breaking-changes-to-notifications/



반응형