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

android - 当应用程序在后台时,React Native 处理套接字连接的事件?


                                            <p><p>我正在使用 React native 和 <code>WebSocket</code> 开发聊天应用程序,在 Activity 模式下一切正常,但是当您按下主页按钮使应用程序处于后台模式时,<code>WebSocket</code> onMessage 事件函数没有被触发</p>

<p>好在 <code>WebSocket</code> 连接仍然连接,但没有触发事件功能。</p>

<p>我只想在后台接收消息时推送通知。</p>

<p>我做了一个研究,发现我需要一直运行无声背景音轨(有人说这是非法的方式)。</p>

<p>是否有合法的 API 可以在后台保持连接处于 Activity 状态?</p>

<p>后台模式下是否需要重新连接socket连接</p>

<p>我的代码</p>

<pre><code>events = (data) =&gt;{

    if(data.message){
          if(this.state.appState !== &#39;active&#39;){
             console.log(&#39;check here&#39;) // not working when the app in background mode
            PushNotification.localNotification({// not working when the app in background mode
                  message: data.message,
                  number: 1,
                  title: &#39;a new message from: &#39;+data.username,

                });
            }else{
                this.setState({messages: data})
            }
    }
}


socketConnect = () =&gt;{
      AsyncStorage.getItem(&#39;token&#39;).then((token) =&gt; {
      let connection = new wamp.Connection({ url: &#39;wss://*******/&#39;,
            realm: &#39;realm&#39;,
            authmethods: [&#39;jwt&#39;],
      });
      connection.onopen = (session, detalis) =&gt; {

            session.subscribe(&#39;messages&#39;, this.events);
      };
      connection.open();

      })
    };
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><blockquote>
<p>I did a research and I found that I need to run a silent background
audio track at all times(some said this illegal way).</p>
</blockquote>

<p>是的,这肯定会被 Apple/Google 应用审核团队拒绝。</p>

<blockquote>
<p>Is there a legal API to keep a connection alive in the background?</p>
</blockquote>

<p>实际上你不需要那个(见下面的解决方案)</p>

<h2>解决方案:</h2>

<p>我假设您有一个服务器,您可以在其中管理所有 websocket 连接并将消息路由到预期的客户端。您可以使用 <a href="https://firebase.google.com/docs/cloud-messaging" rel="noreferrer noopener nofollow">firebase cloud messaging</a>向用户发送 ios/android 推送通知,通知他/她有新消息。当然,您的服务器端和应用端都需要 FCM。对于应用程序部分,您可以使用例如 <a href="https://github.com/invertase/react-native-firebase" rel="noreferrer noopener nofollow">react-native-firebase</a> .服务器有几个<a href="https://firebase.google.com/docs/libraries" rel="noreferrer noopener nofollow">libraries</a>可用的。现在有两种情况:</p>

<p><strong>案例 1)</strong> </p>

<p>如果应用程序已经在前台,您可以通过 FCM(react-native-firebase) 显示 LocalNotification,或者您只需使用 websocket 连接来显示消息。 </p>

<p><strong>案例2)</strong> </p>

<p>您的应用在后台,您再次通过 FCM 从您的服务器发送推送通知。最大的优势是 FCM 与 Apple Push Notification Service 和 Google Cloud Messaging Service 通信(顺便说一句,谷歌很快就会使用 FCM)。这意味着您的用户会收到带有预览文本或完整消息的 native 推送通知(这取决于您)。然后用户单击通知,您的应用程序将再次打开。此时您可以重新连接到您的 websocket,然后您可以继续正常的应用程序行为。 </p>

<p>补充说明:</p>

<ol>
<li>这可能是唯一合法的方式</li>
<li>使用 APNS/GMS/FCM 比让应用始终在后台运行要节能得多</li>
</ol></p>
                                   
                                                <p style="font-size: 20px;">关于android - 当应用程序在后台时,React Native 处理套接字连接的事件?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/55900662/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/55900662/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: android - 当应用程序在后台时,React Native 处理套接字连接的事件?