[ios] 푸시 알림을위한 장치 토큰 가져 오기
푸시 알림 작업 중입니다. 장치 토큰을 가져 오기 위해 다음 코드를 작성했습니다.
- (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를 가져올 수 없습니다.
인증 및 프로비저닝 프로파일에 문제가 없습니다.
답변
참고 : 아래 솔루션은 더 이상 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)")
}
답변
토큰 장치를 얻으려면 몇 가지 단계를 수행 할 수 있습니다. .
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);
}
답변
description
이 답변을 많이 사용 하는 것은 잘못된 접근 방식입니다. 작동하도록해도 iOS 13 이상에서는 중단됩니다.
대신 단순히 설명이 아닌 실제 바이너리 데이터를 사용해야합니다. Andrey Gagan은 Objective C 솔루션을 매우 잘 다루었지만 다행스럽게도 신속하게 훨씬 간단합니다.
Swift 4.2 는 iOS 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()
답변
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);
}
답변
다음 코드는 장치 토큰 검색에 사용됩니다.
// 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);
답변
그리고 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()
답변
여전히 디바이스 토큰을받지 못하는 경우 다음 코드를 입력하여 푸시 알림에 디바이스를 등록하십시오.
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