푸시 알림을위한 장치 토큰 가져 오기


84

푸시 알림 작업 중입니다. 장치 토큰을 가져 오기 위해 다음 코드를 작성했습니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    // Override point for customization after application launch.

    // Add the view controller's view to the window and display.
    [self.window addSubview:viewController.view];
    [self.window makeKeyAndVisible];

    NSLog(@"Registering for push notifications...");    
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];

    return YES;
}

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 
    NSString *str = [NSString stringWithFormat:@"Device Token=%@",deviceToken];
    NSLog(@"This is device token%@", deviceToken);
}

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { 
    NSString *str = [NSString stringWithFormat: @"Error: %@", err];
    NSLog(@"Error %@",err);    
}

장치에서 응용 프로그램을 성공적으로 실행할 수 있지만 콘솔에서 장치 ID를 가져올 수 없습니다.

인증 및 프로비저닝 프로파일에 문제가 없습니다.


모든 단계 를 따랐습니까 ? 코드뿐만 아니라 인증 및 제공에 문제가 없다면 작은 실수를 한 것입니다. Like..tell me, 당신은 당신의 시스템과 동일하게 연결된 실제 장치에서 앱을 실행하고 있습니까? 또한 콘솔 로그에서 장치 토큰을 받고 있는지 여부를 알고 있습니까? iPhone에서 푸시 알림을 활성화 했습니까 ?
Sarah

콘솔 로그에서 장치 토큰을 얻을 수 없습니다.
jagzzz

오류없이 실제 기기에서 앱을 실행하고 있습니다.
jagzzz

iPhone의 링크에 표시된대로 APNS를 활성화 했습니까?
사라

그래, 난 APNS..but에게 cosole에 반입 할 수없는 토큰 장치를 사용할 수
jagzzz

답변:


162

참고 : 아래 솔루션은 더 이상 iOS 13+ 기기에서 작동하지 않으며 가비지 데이터를 반환합니다. .

대신 다음 코드를 사용하십시오.

+ (NSString *)hexadecimalStringFromData:(NSData *)data
{
  NSUInteger dataLength = data.length;
  if (dataLength == 0) {
    return nil;
  }

  const unsigned char *dataBuffer = (const unsigned char *)data.bytes;
  NSMutableString *hexString  = [NSMutableString stringWithCapacity:(dataLength * 2)];
  for (int i = 0; i < dataLength; ++i) {
    [hexString appendFormat:@"%02x", dataBuffer[i]];
  }
  return [hexString copy];
}

iOS 13 이전에 작동했던 솔루션 :

목표 -C

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 
{
    NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSLog(@"this will return '32 bytes' in iOS 13+ rather than the token", token);
} 

스위프트 3.0

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
{
    let tokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
    print("this will return '32 bytes' in iOS 13+ rather than the token \(tokenString)")
}

4
그런 다음 프로비저닝 프로필을 확인하십시오. 푸시 알림을 위해 SSL 인증서를 생성 한 앱 ID 여야합니다.
Wasif Saood

1
당신은 AppDelegate에 파일 @jagzzz에 코드를 추가 할 필요가
codercat

2
: 스위프트의 코드 예제 writtent에 관심이있는 사람들을 위해 gist.github.com/sawapi/a7cee65e4ad95578044d
벤자민

3
조심해, 더 이상 "설명"속성을 사용하여 작동합니다 : stackoverflow.com/questions/39495391/...
hariseldon78

1
@codester Xcode 10.3을 사용하여 빌드를 업로드했으며 라이브입니다. 귀하의 진술에 따르면 Objective C 메서드는 XCode 11 이후로 중단되지만 데이터베이스에서 볼 수있는 것은 apns 토큰의 올바른 문자열 대신 데이터 길이를 표시합니다. 그래서 저는 알고 싶습니다. Xcode 버전 또는 iOS 버전 (예 : 13. *)에 따라 다릅니 까?
pradip의 sutariya

13

토큰 장치를 얻으려면 몇 가지 단계를 수행 할 수 있습니다. .

1) 개발자 인증 및 배포 인증 모두에 대해 APNS (Apple Push Notification Service)를 활성화 한 다음이 두 파일을 다시 다운로드합니다.

2) 개발자 프로비저닝 및 배포 프로비저닝 파일을 모두 다시 다운로드합니다.

3) Xcode 인터페이스에서 : 두 개의 파일 프로비저닝이있는 PROJECT 및 TARGETS에 대한 프로비저닝 설정이 다운로드됩니다.

4) 마지막으로 AppDelegate 파일에 아래 코드를 추가하여 토큰 장치를 가져와야합니다 (참고 : 실제 장치에서 앱 실행).

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
     [self.window addSubview:viewController.view];
     [self.window makeKeyAndVisible];

     NSLog(@"Registering for push notifications...");    
     [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
 (UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
     return YES;
}

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 
     NSString *str = [NSString stringWithFormat:@"Device Token=%@",deviceToken];
     NSLog(@"%@", str);
}

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { 
     NSString *str = [NSString stringWithFormat: @"Error: %@", err];
     NSLog(@"%@",str);
}

11

description이 답변을 많이 사용 하는 것은 잘못된 접근 방식입니다. 작동하도록해도 iOS 13 이상에서는 중단됩니다.

대신 단순히 설명이 아닌 실제 바이너리 데이터를 사용해야합니다. Andrey Gagan은 Objective C 솔루션을 매우 잘 다루었지만 다행스럽게도 신속하게 훨씬 간단합니다.

Swift 4.2iOS 13 이상 에서 작동합니다.

// credit to NSHipster (see link above)
// format specifier produces a zero-padded, 2-digit hexadecimal representation
let deviceTokenString = deviceToken.map { String(format: "%02x", $0) }.joined()

7

iOS 13+ 용 Objective C , Wasif Saood의 답변 제공

아래 코드를 복사하여 AppDelegate.m에 붙여 넣어 장치 APN 토큰을 인쇄하십시오.

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
  NSUInteger dataLength = deviceToken.length;
  if (dataLength == 0) {
    return;
  }
  const unsigned char *dataBuffer = (const unsigned char *)deviceToken.bytes;
  NSMutableString *hexString  = [NSMutableString stringWithCapacity:(dataLength * 2)];
  for (int i = 0; i < dataLength; ++i) {
    [hexString appendFormat:@"%02x", dataBuffer[i]];
  }
  NSLog(@"APN token:%@", hexString);
}

5

다음 코드는 장치 토큰 검색에 사용됩니다.

    // Prepare the Device Token for Registration (remove spaces and < >)
    NSString *devToken = [[[[deviceToken description] 
                            stringByReplacingOccurrencesOfString:@"<"withString:@""] 
                           stringByReplacingOccurrencesOfString:@">" withString:@""] 
                          stringByReplacingOccurrencesOfString: @" " withString: @""];


    NSString *str = [NSString 
                     stringWithFormat:@"Device Token=%@",devToken];
    UIAlertView *alertCtr = [[[UIAlertView alloc] initWithTitle:@"Token is " message:devToken delegate:self cancelButtonTitle:nil otherButtonTitles: nil] autorelease];
    [alertCtr show];
    NSLog(@"device token - %@",str);

2
이것은 올바른 해결책이 아닙니다. 온 절대베이스 아무것도 description.
rmaddy

5

그리고 Wasif의 대답의 Swift 버전 :

스위프트 2.x

var token = deviceToken.description.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "<>"))
token = token.stringByReplacingOccurrencesOfString(" ", withString: "")
print("Token is \(token)")

Swift 3 업데이트

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

description바이너리 데이터에 절대 사용하지 마십시오 (다른 답변 참조)
cdstamper

4

여전히 디바이스 토큰을받지 못하는 경우 다음 코드를 입력하여 푸시 알림에 디바이스를 등록하십시오.

ios8 이상에서도 작동합니다.

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000

    if ([UIApplication respondsToSelector:@selector(registerUserNotificationSettings:)]) {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeAlert|UIUserNotificationTypeSound
                                                                                 categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    } else {
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
         UIRemoteNotificationTypeBadge |
         UIRemoteNotificationTypeAlert |
         UIRemoteNotificationTypeSound];

    }
#else
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     UIRemoteNotificationTypeBadge |
     UIRemoteNotificationTypeAlert |
     UIRemoteNotificationTypeSound];

#endif

3

iOS 13부터 Apple은 [deviceToken description]출력 을 변경했습니다 . 이제 이것은 {length=32,bytes=0x0b8823aec3460e1724e795cba45d22e8...af8c09f971d0dabc}장치 토큰에 대해 잘못된 것입니다.

이 코드 조각을 사용하여 문제를 해결하는 것이 좋습니다.

+ (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];
}

iOS13 이하에서 작동합니다.


1
참고로-사용한 적이있는 대답 description은 항상 잘못되었습니다. 그리고 이것은 토큰을 문자열로 변환하는 유일한 해결책입니다. 훨씬 더 간단한 해결책 은를 표준 base64 인코딩을 사용하여 변환하는 NSDataNSString입니다.
rmaddy

1

Swift 3에서 장치 토큰 가져 오기

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

    let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})

    print("Device token: \(deviceTokenString)")

}

1

AppDelegate의 didRegisterForRemoteNotificationsWithDeviceToken메서드에서 :

Swift 업데이트 :

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    print("\(deviceToken.reduce("") { $0 + String(format: "%02.2hhx", arguments: [$1]) })")
}

0

Swift 4 이것은 나를 위해 작동합니다.

1 단계대상이 추가 기능을 클릭하고 푸시 알림

AppDelegate.swift의 2 단계 는 다음 코드를 추가합니다.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
     
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound]) { (didAllow, error) in
            
        }
        UIApplication.shared.registerForRemoteNotifications()
        
        return true
    }
    
    //Get device token
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
    {
        let tokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
        
        print("The token: \(tokenString)")
    }

-1

APN Enable 인증서가있는 경우 빌드 설정 코드 서명 프로비저닝 프로파일에서 토큰 ID를 확실히 받게됩니다. 제거

프로비저닝 프로파일 : 자동

및 설정

프로비저닝 프로파일 : 프로비저닝 프로파일 인증서입니다.


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

    let tokenParts = deviceToken.map { data -> String in
        return String(format: "%02.2hhx", data)
        }
    let token = tokenParts.joined()

    print("Token\(token)")
}

-4

장치 토큰을 얻으려면 다음 코드를 사용하지만 실제 장치를 사용하여 장치 토큰을 얻을 수 있습니다. 장치 토큰을 보내야하는 경우 시뮬레이터를 사용하는 동안 아래 조건을 입력 할 수 있습니다.

  if(!(TARGET_IPHONE_SIMULATOR))
    {
        [infoDict setValue:[[NSUserDefaults standardUserDefaults] valueForKey:@"DeviceToken"] forKey:@"device_id"];
    }
    else
    {
        [infoDict setValue:@"e79c2b66222a956ce04625b22e3cad3a63e91f34b1a21213a458fadb2b459385" forKey:@"device_id"];
    }



- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
    NSLog(@"My token is: %@", deviceToken);
    NSString * deviceTokenString = [[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""] stringByReplacingOccurrencesOfString: @">" withString: @""]   stringByReplacingOccurrencesOfString: @" " withString: @""];
    NSLog(@"the generated device token string is : %@",deviceTokenString);
    [[NSUserDefaults standardUserDefaults] setObject:deviceTokenString forKey:@"DeviceToken"];
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.