菜鸟教程小白 发表于 2022-12-13 13:20:18

ios - 带有 Node JS 的 APNS(Apple 推送通知服务)


                                            <p><p>我正在寻找创建 APNS(Apple 推送通知服务),服务器将在其中向 iOS 设备发送通知。
我可以使用 SAME 设备 token 和 SAME 证书通过 PHP 进行推送通知,但是,我想通过 Node JS 而不是 PHP 发送通知。</p>

<p>我有以下有效文件/证书可以帮助我入门:</p>

<ul>
<li>cert.pem</li>
<li>key.pem</li>
<li>aps_development.cer</li>
<li>cert.p12</li>
<li>key.p12, </li>
<li>ck.pem</li>
</ul>

<p>我一直在浏览多个资源/链接,例如:</p>

<ul>
<li> <a href="https://github.com/argon/node-apn" rel="noreferrer noopener nofollow">https://github.com/argon/node-apn</a> </li>
<li> <a href="https://stackoverflow.com/questions/26590109/how-to-implement-apns-notifications-through-nodejs" rel="noreferrer noopener nofollow">How to implement APNS notifications through nodejs?</a> </li>
</ul>

<p>这样做之后,我能够想出以下示例代码,其中 PASSWORD 代表 key.pem 的密码,TOKEN 代表我设备的 token :</p>

<pre><code>    var apn = require(&#34;apn&#34;);
    var path = require(&#39;path&#39;);
    try {
      var options = {
            cert: path.join(__dirname, &#39;cert.pem&#39;),         // Certificate file path
            key:path.join(__dirname, &#39;key.pem&#39;),          // Key file path
            passphrase: &#39;&lt;PASSWORD&gt;&#39;,                           // A passphrase for the Key file
            ca: path.join(__dirname, &#39;aps_development.cer&#39;),// String or Buffer of CA data to use for the TLS connection
            production:false,
            gateway: &#39;gateway.sandbox.push.apple.com&#39;,      // gateway address
            port: 2195,                                     // gateway port
            enhanced: true                                  // enable enhanced format
      };
      var apnConnection = new apn.Connection(options);
      var myDevice = new apn.Device(&#34;&lt;TOKEN&gt;&#34;);
      var note = new apn.Notification();
      note.expiry = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now.
      note.badge = 3;
      note.sound = &#34;ping.aiff&#34;;
      note.alert = &#34;You have a new message&#34;;
      note.payload = {&#39;msgFrom&#39;: &#39;Alex&#39;};
      note.device = myDevice;
      apnConnection.pushNotification(note);



      process.stdout.write(&#34;******* EXECUTED WITHOUT ERRORS************ :&#34;);


    } catch (ex) {
      process.stdout.write(&#34;ERROR :&#34;+ex);
    }
</code></pre>

<p>执行此代码时我没有收到任何错误,但问题是我的 iOS 设备上没有收到任何通知。我也尝试过设置 ca:null & debug:true (在选项 var 中)。但同样的事情也会发生。</p>

<p>再次,当我使用我拥有的 ck.pem 和设备 token 并将其与 PHP 一起使用时,它可以工作,但我无法使其在 Node JS 中工作。请帮忙!!</p>

<p>非常感谢!</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您可能遇到了 NodeJS 本身的异步特性。我使用相同的 <code>node-apn</code> 模块取得了巨大的成功。但是您不只是像在 PHP 中习惯的那样直接调用它——这是一个不从 PHP->Node 映射的同步模型。您的进程在任何事情真正发生之前就退出了 - <code>apnConnection.pushNotification(note);</code> 是一个异步调用,在脚本返回/退出之前才刚刚开始。</p>

<p>如 <code>node-apn</code> 文档中所述,您可能希望“监听”<code>apnConnection</code> 上的其他事件。这是我用来注销连接创建后发生的各种事件的代码摘录:</p>

<pre><code>// We were unable to initialize the APN layer - most likely a cert issue.
connection.on(&#39;error&#39;, function(error) {
    console.error(&#39;APNS: Initialization error&#39;, error);
});

// A submission action has completed. This just means the message was submitted, not actually delivered.
connection.on(&#39;completed&#39;, function(a) {
    console.log(&#39;APNS: Completed sending&#39;, a);
});

// A message has been transmitted.
connection.on(&#39;transmitted&#39;, function(notification, device) {
    console.log(&#39;APNS: Successfully transmitted message&#39;);
});

// There was a problem sending a message.
connection.on(&#39;transmissionError&#39;, function(errorCode, notification, device) {
    var deviceToken = device.toString(&#39;hex&#39;).toUpperCase();

    if (errorCode === 8) {
      console.log(&#39;APNS: Transmission error -- invalid token&#39;, errorCode, deviceToken);
      // Do something with deviceToken here - delete it from the database?
    } else {
      console.error(&#39;APNS: Transmission error&#39;, errorCode, deviceToken);
    }
});

connection.on(&#39;connected&#39;, function() {
    console.log(&#39;APNS: Connected&#39;);
});

connection.on(&#39;timeout&#39;, function() {
    console.error(&#39;APNS: Connection timeout&#39;);
});

connection.on(&#39;disconnected&#39;, function() {
    console.error(&#39;APNS: Lost connection&#39;);
});

connection.on(&#39;socketError&#39;, console.log);
</code></pre>

<p>同样重要的是,您需要确保您的脚本在处理异步请求时保持运行。大多数时候,当您构建越来越大的服务时,您最终会得到某种事件循环来执行此操作,而 ActionHero、ExpressJS、Sails 等框架将为您执行此操作。</p>

<p>与此同时,您可以使用这个 super 粗略的循环来确认它,它只会强制进程保持运行,直到您点击 <kbd>CTRL</kbd>+<kbd>C</kbd>:</p >

<pre><code>setInterval(function() {
    console.log(&#39;Waiting for events...&#39;);
}, 5000);
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 带有 Node JS 的 APNS(Apple 推送通知服务),我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/36633188/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/36633188/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 带有 Node JS 的 APNS(Apple 推送通知服务)