使用Java+Pushy库发送Live Activity推送通知失败求助
针对你用Pushy库发送Live Activity推送未成功的情况,从代码和配置层面给出以下排查点和修复方案:
修正Topic格式
Live Activity的推送Topic必须遵循{bundleID}.push-type.liveactivity格式,而非普通的bundleID。比如你的应用bundleID是com.yourcompany.yourapp,则Topic应设为com.yourcompany.yourapp.push-type.liveactivity。修复Payload时间参数
你的payload中stale-date(1650998941)是过去的时间戳,Live Activity会直接忽略过期的更新请求。需确保stale-date设置为当前时间之后的合理时间,同时timestamp也应使用当前有效的时间戳(建议用System.currentTimeMillis()/1000获取秒级时间戳)。优化p8密钥加载方式
原代码用getResource(fileName).getFile()加载密钥文件可能存在路径编码问题(如含特殊字符、空格的路径),建议改用流加载方式避免此类问题:try (InputStream keyStream = this.getClass().getResourceAsStream(fileName)) { if (keyStream == null) { throw new NotFoundException(NotFound.APNSNOTFOUND, Boolean.TRUE); } ApnsSigningKey signingKey = ApnsSigningKey.loadFromPkcs8InputStream(keyStream, teamID, keyID); final ApnsClient apnsClient = new ApnsClientBuilder() .setApnsServer(ApnsClientBuilder.DEVELOPMENT_APNS_HOST) .setSigningKey(signingKey) .build(); }匹配APNS环境
确认目标设备的环境:如果是测试设备(模拟器/开发机),使用DEVELOPMENT_APNS_HOST;如果是已上架的生产设备,需切换为ApnsClientBuilder.PRODUCTION_APNS_HOST,环境不匹配会导致推送被拒绝。检查Live Activity状态
确保设备上对应的Live Activity处于活跃状态,如果Activity已结束、过期或被用户关闭,推送将无法显示。完善错误日志排查
原代码未处理cause不为空的情况(如网络异常、签名错误等),建议补充异常栈打印,定位底层问题:sendNotificationFuture.whenComplete((response, cause) -> { if (cause != null) { cause.printStackTrace(); apnsClient.close(); return; } if (response.isAccepted()) { System.out.println("Push notification accepted by APNs gateway."); } else { System.out.println("Notification rejected by the APNs gateway: " + response.getRejectionReason()); response.getTokenInvalidationTimestamp().ifPresent(timestamp -> { System.out.println("\t…and the token is invalid as of " + timestamp); }); } apnsClient.close(); });
内容的提问来源于stack exchange,提问作者Aakash

