• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

java - APNS 接受推送消息,但它们永远不会成为目标

[复制链接]
菜鸟教程小白 发表于 2022-12-12 14:00:06 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在尝试为我的后端服务器服务添加苹果推送通知,但我遇到了一个我无法理解的问题。
我正在使用 Pushy 库 (com.relayriders.pushy) .
我的代码就像他们的 github 页面推荐的一样。
代码是有效的,没有异常(exception),push 看起来像是正确形成的。推送发送到 APNS,但永远不会到达设备。
设备 token 和证书是正确的,我的 friend 通过他的测试程序向目标设备发送了推送。
我也测试了com.notnoop.apns具有相同结果的库 - 没有异常(exception),仍然没有推送设备
这是我的发件人类:

package ua.asprelis.communicator.push;

import com.relayrides.pushy.apns.ApnsEnvironment;
import com.relayrides.pushy.apns.FailedConnectionListener;
import com.relayrides.pushy.apns.PushManager;
import com.relayrides.pushy.apns.PushManagerConfiguration;
import com.relayrides.pushy.apns.RejectedNotificationListener;
import com.relayrides.pushy.apns.RejectedNotificationReason;
import com.relayrides.pushy.apns.util.ApnsPayloadBuilder;
import com.relayrides.pushy.apns.util.MalformedTokenStringException;
import com.relayrides.pushy.apns.util.SSLContextUtil;
import com.relayrides.pushy.apns.util.SimpleApnsPushNotification;
import com.relayrides.pushy.apns.util.TokenUtil;
import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.net.ssl.SSLHandshakeException;


public class ApplePushNotifier
{
    private final PushManager<SimpleApnsPushNotification> pushManager;

    private final ApnsPayloadBuilder payloadBuilder = new ApnsPayloadBuilder();

    public ApplePushNotifier() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException, KeyManagementException, IOException {
        URL url = getClass().getResource("/certpath/cert.p12");
        this.pushManager = new PushManager<>(
            ApnsEnvironment.getSandboxEnvironment(),
            SSLContextUtil.createDefaultSSLContext(URLDecoder.decode(url.getPath(), "UTF-8"), "password"),
            null, // Optional: custom event loop group
            null, // Optional: custom ExecutorService for calling listeners
            null, // Optional: custom BlockingQueue implementation
            new PushManagerConfiguration(),
            "ExamplePushManager");
        pushManager.start();
        pushManager.registerRejectedNotificationListener(new MyRejectedNotificationListener());
        pushManager.registerFailedConnectionListener(new MyFailedConnectionListener());
    }

    public void sendpush(String message, byte[] token) throws InterruptedException {
        String payload = payloadBuilder.setAlertBody(message).setSoundFileName("ring-ring.aiff").buildWithDefaultMaximumLength();
        pushManager.getQueue().put(new SimpleApnsPushNotification(token, payload));
    }

    public void sendpush(String message, String stoken) throws InterruptedException, MalformedTokenStringException {
        byte[]token = TokenUtil.tokenStringToByteArray(stoken);
        String payload = payloadBuilder.setAlertBody(message).setSoundFileName("ring-ring.aiff").buildWithDefaultMaximumLength();
        SimpleApnsPushNotification notification = new SimpleApnsPushNotification(token, payload);
        pushManager.getQueue().put(notification);
        System.out.println("Queued: "+notification);
    }

    public void closeSender() {
        if(pushManager!=null) {
            try {
                pushManager.shutdown();
            } catch (InterruptedException ex) {
                Logger.getLogger(ApplePushNotifier.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    private class MyRejectedNotificationListener implements RejectedNotificationListener<SimpleApnsPushNotification> {
        @Override
        public void handleRejectedNotification(
            final PushManager<? extends SimpleApnsPushNotification> pushManager,
            final SimpleApnsPushNotification notification,
            final RejectedNotificationReason reason) {
            System.out.format("%s was rejected with rejection reason %s\n", notification, reason);
        }
    }

    private class MyFailedConnectionListener implements FailedConnectionListener<SimpleApnsPushNotification> {
        @Override
        public void handleFailedConnection(
            final PushManager<? extends SimpleApnsPushNotification> pushManager,
            final Throwable cause) {
            if (cause instanceof SSLHandshakeException)
                // This is probably a permanent failure, and we should shut down the PushManager.
            else
                System.out.println(cause);
        }
    }
}

以及运行推送的测试类:

@Test
public void testPushMessage() {
    Random random = new Random();
    String testMessage = "Hello Test! "+random.nextInt(1000);
    String testToken = "e6878d3993abfaec48220b9d4d3ea0b576c22351c7fbbb5faeb5449bf7f24452";
                      //e6878d39 93abfaec 48220b9d 4d3ea0b5 76c22351 c7fbbb5f aeb5449b f7f24452

    ApplePushNotifier notifier=null;
    try {
        notifier = new ApplePushNotifier();
        notifier.sendpush(testMessage, testToken);
    } catch(Exception ex) {
        Logger.getLogger(applePushNotifierTest.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        if (notifier!=null)
            notifier.closeSender();
    }
}

我的输出:

[main] INFO com.relayrides.pushy.apns.PushManager - ExamplePushManager starting.
    Queued: SimpleApnsPushNotification [token=[-26, -121, -115, 57, -109, -85, -6, -20, 72, 34, 11, -99, 77, 62, -96, -75, 118, -62, 35, 81, -57, -5, -69, 95, -82, -75, 68, -101, -9, -14, 68, 82], payload={"aps":{"alert":"Hello Test! 955","sound":"ring-ring.aiff"}}, invalidationTime=null, priority=IMMEDIATE]
    [main] INFO com.relayrides.pushy.apns.PushManager - ExamplePushManager shutting down.

我觉得问题出在一些小块上,我看不到。如果两个测试库都不起作用,那就奇怪了



Best Answer-推荐答案


正如我所说 - 我犯了一个愚蠢的错误。我真是个笨蛋。我用过

ApnsEnvironment.getSandboxEnvironment()

而不是

ApnsEnvironment.getProductionEnvironment()

在两个库中。

那是我第一次使用 APNS。

关于java - APNS 接受推送消息,但它们永远不会成为目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28220275/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap