Ionic 电容器/离子:在后台处理推送通知或应用程序被杀死时

qhhrdooz  于 2023-04-10  发布在  Ionic
关注(0)|答案(4)|浏览(227)

大家早上好,我已经好几个小时没找到解决办法了。
我使用“PushNotifications”电容器插件(https://capacitor.ionicframework.com/docs/apis/push-notifications/)来监听来自Firebase的推送通知(包括通知和数据类型),通知的监听非常好,即使在应用程序被杀或在后台的情况下,一切都按预期进行。
问题如下:
我想在收到通知时打开应用程序,如果它在后台或如果它已被杀死。
1.在应用程序处于前台时收到通知的情况下,我可以使用addListener(eventName: "pushNotificationReceived", callback)运行自定义代码,并且在任何情况下都没有问题,因为应用程序是打开的。
1.如果应用程序在后台时收到通知,我可以强制应用程序保持backgroundMode活动(https://ionicframework.com/docs/native/background-mode),并在收到通知时将应用程序带到前台。(尽管我真的不喜欢它,因为它很耗电)
1.如果appkilled,我还没有找到解决问题的方法。
似乎没有办法挂钩自定义代码能够运行时,推送通知到达时,它是在后台接收或与应用程序杀死,你有没有遇到过这个问题?
谢谢大家!

zysjyyx4

zysjyyx41#

我的解决方案是添加:FCM_PLUGIN_ACTIVITY操作到AndroidManifest.xml

<activity
        ...
        android:name="com.appname.MainActivity"
        ...>

        ...
        ...
        ...

        <intent-filter>
            <action android:name="FCM_PLUGIN_ACTIVITY" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

此外,在服务器上,您应该在推送通知对象中包含该操作:

const pushNotification = {
  data: {
    ...
  },
  notification: {
    body: body,
    title: title,
    click_action: 'FCM_PLUGIN_ACTIVITY',
  },
};

在你的ionic项目中,你可以像下面这样处理pushNotificationActionPerformed,然后导航到所需的路由:

PushNotifications.addListener('pushNotificationActionPerformed',
  (notification: PushNotificationActionPerformed) => {
    console.log('Push action performed: ' + JSON.stringify(notification));
  }
);

要在应用打开时处理接收推送通知,您需要处理pushNotificationReceived,并在需要时自己显示一个吐司。

// the app is open, show your own notification if needed
PushNotifications.addListener('pushNotificationReceived',
  (notification: PushNotification) => {
    console.log('push notification received: ' + JSON.stringify(notification));
  }
);
91zkwejq

91zkwejq2#

我遇到了同样的问题,并在AndroidManifest.xml中使用以下行修复了它

<meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id" />
<service android:name="com.getcapacitor.CapacitorFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
zte4gxcn

zte4gxcn3#

对于我们来说,如果我们另外安装了FCM插件(https://github.com/capacitor-community/fcm),我们需要iOS的后台通知(即使在应用程序被杀死后)也可以工作。

h9a6wy2h

h9a6wy2h4#

我有同样的问题.这是如何发送消息的技术基础.这里是一个PHP函数,从服务器发送通知到设备.“数据”是消息发送到应用程序,“通知”被发送到Android操作系统.

function sendGCM($message, $id) {

    $url = 'https://fcm.googleapis.com/fcm/send';

    $fields = array (
            'registration_ids' => array (
                    $id // The device token
            ),
            'data' => array (
                    "message" => $message
            ),
            // After I put "notification", the device started to receive notifications in the background:
            'notification' => array (
                "title" => "App Title Notification",
                "body" => $message
            )
    );
    $fields = json_encode ( $fields );

    $headers = array (
            'Authorization: key=' . "MY_API_Cloud_Messaging_KEY", // App Key from console.firebase.google.com
            'Content-Type: application/json'
    );

    $ch = curl_init ();
    curl_setopt ( $ch, CURLOPT_URL, $url );
    curl_setopt ( $ch, CURLOPT_POST, true );
    curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );
    curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt ( $ch, CURLOPT_POSTFIELDS, $fields );

    $result = curl_exec ( $ch );
    echo $result;
    curl_close ( $ch );

}

相关问题