You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JavaPNS推送APNS通知时持续遇Invalid Token错误求助

排查JavaPNS推送APNS时的「Invalid token」错误

我来帮你梳理这个问题,APNS返回「Invalid token」通常是令牌本身、环境匹配或者配置出了问题,咱们一步步排查:

1. 最常见的问题:设备令牌格式/内容错误

你代码里的"Device Token "明显是占位符,必须替换成真实的、格式正确的设备令牌:

  • 正确的设备令牌是64位十六进制字符串,没有空格、尖括号或其他多余字符(比如不能是<abc123...>或者带空格的格式)。
  • iOS客户端获取令牌时,不要直接用deviceToken.description(这个方法返回的字符串会带<>和空格),正确的转换方式应该是:
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
        NSMutableString *tokenString = [NSMutableString string];
        const char *bytes = deviceToken.bytes;
        for (NSUInteger i = 0; i < deviceToken.length; i++) {
            [tokenString appendFormat:@"%02x", bytes[i]];
        }
        NSString *finalToken = [tokenString copy];
        // 把finalToken发给你的服务器
    }
    

2. 证书与推送环境不匹配

你代码里最后一个参数是true,代表使用生产环境(Production),但如果你的测试设备是开发环境(比如用Xcode调试的真机),必须改成false(沙箱Sandbox环境):

  • 开发环境的设备令牌只能用开发APNS证书+沙箱地址推送;
  • 生产环境的令牌只能用生产APNS证书+生产地址推送;
    两者不匹配会直接导致令牌无效。

3. 证书路径的转义问题(Windows环境)

你的证书路径是"C:\Users\Documents\PushNotification\APNS.p12",在Java字符串里反斜杠需要转义,应该写成:
"C:\\Users\\Documents\\PushNotification\\APNS.p12"
或者直接用正斜杠:"C:/Users/Documents/PushNotification/APNS.p12"
如果路径错误导致证书无法加载,也会间接触发令牌验证失败的错误。

4. Bundle ID不匹配

要确保生成设备令牌的iOS App的Bundle ID,和你APNS证书里绑定的Bundle ID完全一致(大小写、字符都不能错),APNS会严格校验这一点,不匹配的话会判定令牌无效。

修正后的代码示例

把上面的问题修复后,代码大概是这样:

import javapns.Push;
import javapns.notification.PushNotificationPayload;
import javapns.notification.PushedNotifications;
import javapns.notification.PushedNotification;
import java.util.List;

public class PushTest {
    public static void main(String[] args) {
        try {
            // 替换成你的真实设备令牌
            String deviceToken = "a1b2c3d4e5f67890abcdef1234567890abcdef1234567890abcdef1234567890";
            // 修正后的证书路径
            String certPath = "C:\\Users\\Documents\\PushNotification\\APNS.p12";
            // 根据你的测试环境选择true(生产)或false(沙箱)
            boolean isProduction = false;
            String certPassword = "123456";

            PushNotificationPayload payload = PushNotificationPayload.complex();
            payload.addAlert("Hello from JavaPNS!");

            // 推送通知
            PushedNotifications notifications = Push.alert(payload, certPath, certPassword, isProduction, deviceToken);

            // 统计成功/失败
            List<PushedNotification> successful = PushedNotification.findSuccessfulNotifications(notifications);
            List<PushedNotification> failed = PushedNotification.findFailedNotifications(notifications);

            NotificationTest.printPushedNotifications(notifications);
            System.out.println("Success count: " + successful.size());
            System.out.println("Failed count: " + failed.size());

            // 打印失败的具体原因,方便进一步排查
            for (PushedNotification failedNotify : failed) {
                if (failedNotify.getException() != null) {
                    System.out.println("Failed reason: " + failedNotify.getException().getMessage());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

额外注意事项

  • 设备必须开启通知权限:如果用户在iOS设备上关闭了App的通知权限,令牌也可能无效;
  • 令牌过期:用户卸载重装App后,设备会生成新的令牌,旧令牌会失效;
  • JavaPNS版本:JavaPNS已经很久没有更新了,建议考虑迁移到支持APNs HTTP/2协议的库(比如apns-java),兼容性和稳定性更好。

内容的提问来源于stack exchange,提问作者sanjay sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:15:33