当APNS以“DeviceTokenNotForTopic”为理由拒绝了通知时,这通常是因为设备令牌与您正在使用的主题不匹配。以下是解决此问题的代码示例:
import UIKit
import UserNotifications
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// 注册远程通知
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in
if granted {
DispatchQueue.main.async {
application.registerForRemoteNotifications()
}
}
}
return true
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
// 注册成功,将设备令牌发送给服务器
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
sendDeviceTokenToServer(token: token)
}
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
// 注册失败,打印错误信息
print("Failed to register for remote notifications: \(error.localizedDescription)")
}
func sendDeviceTokenToServer(token: String) {
// 将设备令牌发送给服务器的代码
// 确保发送的主题和设备令牌匹配
}
// 其他AppDelegate方法...
}
在上面的示例中,AppDelegate类实现了UIApplicationDelegate协议和UNUserNotificationCenterDelegate协议。在didFinishLaunchingWithOptions方法中,我们请求用户授权并注册远程通知。当注册成功时,我们将设备令牌发送给服务器。确保在sendDeviceTokenToServer方法中,将设备令牌与正确的主题进行匹配。
如果您正在使用Objective-C,以下是相应的代码示例:
#import "AppDelegate.h"
#import
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 注册远程通知
UNUserNotificationCenter.currentNotificationCenter.delegate = self;
[UNUserNotificationCenter.currentNotificationCenter requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
dispatch_async(dispatch_get_main_queue(), ^{
[application registerForRemoteNotifications];
});
}
}];
return YES;
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
// 注册成功,将设备令牌发送给服务器
NSString *token = [[[[deviceToken description] stringByReplacingOccurrencesOfString:@"<" withString:@""]
stringByReplacingOccurrencesOfString:@">" withString:@""]
stringByReplacingOccurrencesOfString:@" " withString:@""];
[self sendDeviceTokenToServerWithToken:token];
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
// 注册失败,打印错误信息
NSLog(@"Failed to register for remote notifications: %@", error.localizedDescription);
}
- (void)sendDeviceTokenToServerWithToken:(NSString *)token {
// 将设备令牌发送给服务器的代码
// 确保发送的主题和设备令牌匹配
}
// 其他AppDelegate方法...
@end
以上是使用Swift和Objective-C的示例代码,您可以根据自己的项目选择适合您的语言。确保在发送设备令牌给服务器时,主题与设备令牌匹配,以避免APNS拒绝通知。
上一篇:APNS无法向设备推送消息。
下一篇:APNS与FCM令牌映射