iOS13 APNS deviceToken 관련

  iOS13 APNS deviceToken 관련


안녕하세요. 이번에 iOS13 부터 deviceToken 가져올 때 이슈사항에 대해 공유드립니다.

  이슈사항

iOS12 환경 deviceToken 데이터 형식
<fa26d6a1 711c10f2 fe15aa98 8beb4a5e 385bc0a4 d6e8b839 07b4f501 648722eb>
cs

iOS13 환경 deviceToken 데이터 형식
{length = 32, bytes = 0xfa26d6a1 711c10f2 fe15aa98 8beb4a5e ... 07b4f501 648722eb }
cs


  대응

iOS 12 환경 대응을 위해 두가지 동시에 사용하였습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 디바이스 토큰 획득
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    // iOS 13에서 deviceToken 값이 변경되어 처리 로직 수정함.
    NSString *tokenStr = @"";
    if (@available(iOS 13.0*)) {
        NSUInteger length = deviceToken.length;
        if (length != 0) {
            const unsigned char *buffer = deviceToken.bytes;
            NSMutableString *hexString  = [NSMutableString stringWithCapacity:(length * 2)];
            for (int i = 0; i < length; ++i) {
                [hexString appendFormat:@"%02x", buffer[i]];
            }
            tokenStr = [hexString copy];
        }
        
    } else {
        // iOS 13 이하
        tokenStr =[deviceToken description];
    }
    
    tokenStr = [tokenStr stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" [ ] < > "]];
    tokenStr = [tokenStr stringByReplacingOccurrencesOfString:@" " withString:@""];
    
    NSLog(@"DeviceToken : %@", tokenStr );
    
    if (tokenStr) {
        // 내부 저장 
    }
}
cs


Swift iOS13 대응 코드
1
2
3
4
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let deviceTokenString = deviceToken.map { String(format: "%02x", $0) }.joined()
    // 나머지 로직.
}
cs


iOS13 에서 정상적으로 동작하는것 처럼 보이나 자꾸 이런식으로 내부가 바뀌는 것 같습니다. 앱 배포 전에 많은 확인이 필요할 것 같내요. 좋은하루 보내세요. 


참고링크 : 

댓글