푸시 알림을 위한 장치 토큰 가져오기
저는 푸시 알림 작업을 하고 있습니다.장치 토큰을 가져오기 위해 다음 코드를 작성했습니다.
- (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 파일에 아래 코드를 추가해야 Token Device(참고: 실제 장치에서 app 실행)를 얻을 수 실행).
- (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()
목표 C for iOS 13+, 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);
}
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 이하에서 사용 가능합니다.
다음 코드는 장치 토큰 검색에 사용됩니다.
// 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.x
var token = deviceToken.description.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "<>"))
token = token.stringByReplacingOccurrencesOfString(" ", withString: "")
print("Token is \(token)")
스위프트 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
Swift 3에서 장치 토큰 가져오기
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
print("Device token: \(deviceTokenString)")
}
AppDelegate에서didRegisterForRemoteNotificationsWithDeviceToken
방법:
Swift용으로 업데이트됨:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
print("\(deviceToken.reduce("") { $0 + String(format: "%02.2hhx", arguments: [$1]) })")
}
Swift 4 이것은 저에게 효과적입니다.
1단계 TARGETS 추가 기능을 클릭하고 Push Notifications를 선택합니다.
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)")
}
목표-C의 경우
iOS 13 푸시 토큰에 약간의 변경 사항이 있습니다.
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSString *token = @"";
if (@available(iOS 13, *)) {
NSUInteger length = deviceToken.length;
if (length == 0) {
token = @"";
}
const unsigned char *buffer = deviceToken.bytes;
NSMutableString *actualToken = [NSMutableString stringWithCapacity:(length * 2)];
for (int i = 0; i < length; ++i) {
[actualToken appendFormat:@"%02x", buffer[i]];
}
token = [actualToken copy];
} else {
token = [[deviceToken description] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]];
token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
}
NSLog(@"My token is: %@", token);
}
장치 토큰을 가져오려면 다음 코드를 사용합니다.
func application(_ application:원격 알림 등록을 수행한 UIA 응용 프로그램장치 포함토큰 디바이스토큰: 데이터) {}
푸시 페이로드에 대한 넷메라 가이드와 푸시 알림에 대한 더 많은 정보를 얻을 수 있습니다.
빌드 설정에서 APN Enable 인증서가 있는 경우 Provision Profile에 서명하는 코드를 설정하면 토큰 ID를 확실히 얻을 수 있고 제거할 수 있습니다.
Provision Profile : 자동
로 설정합니다.
Provision Profile : Provision Profile 인증서입니다.
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)")
}
장치 토큰을 가져오려면 다음 코드를 사용하지만 실제 장치를 사용해야만 장치 토큰을 얻을 수 있습니다.만약 당신이 장치 토큰을 의무적으로 보내야 한다면 시뮬레이터를 사용하면서 아래 조건을 붙일 수 있습니다.
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"];
}
언급URL : https://stackoverflow.com/questions/8798725/get-device-token-for-push-notification
'programing' 카테고리의 다른 글
"compilerVersion" IIS 오류를 수정하려면 어떻게 해야 합니까? (0) | 2023.09.13 |
---|---|
Docker mysql ERROR 1396 (HY000):'root'@'%'에 대한 CREATE USER 작업 실패 (0) | 2023.09.13 |
XML 스키마를 버전화하는 가장 좋은 방법은 무엇입니까? (0) | 2023.09.13 |
Python csv writer 구분자 잘못? (0) | 2023.09.08 |
MySQL UPDATE가 언제 성공했는지와 실제로 업데이트된 데이터를 구분하려면 어떻게 해야 합니까? (0) | 2023.09.08 |