当应用程序被杀死/关闭时,世博会通知不会触发方法

Posted

技术标签:

【中文标题】当应用程序被杀死/关闭时,世博会通知不会触发方法【英文标题】:Expo notification doesnt fire method when app is killed/closed 【发布时间】:2021-03-09 13:54:36 【问题描述】:

当应用程序正在运行或在后台但应用程序关闭时,我使用 react native expo 和推送通知工作正常。它不调用处理通知的方法。我需要重定向到详细信息页面。我尝试使用函数组件和类组件,尝试迁移到旧通知和新通知。

import React, useState, useEffect, useRef from 'react';
import 
    Image, ScrollView,
    StyleSheet, Text, TouchableOpacity, Platform,
    View, Linking,

 from 'react-native';
import * as Notifications from "expo-notifications";


const HomeScreen = (props) => 
  useEffect(() => 
        notificationListener.current = Notifications.addNotificationReceivedListener(notification => 
        
            const request, date = notification ||
            const content = request ||
            const data = content ||
            const annKey,type = data ||
           
            if(annKey) 
              //  navigation.navigate('Detail', annKey,  updateFeed: true, onSelect,)
            
         

        );


        responseListener.current = Notifications.addNotificationResponseReceivedListener(response => 
           

            const notification = response ||
            console.log(notification);
            const request, date = notification ||
            const content = request ||
            const data = content ||
            const annKey, type = data ||


            if(annKey)
               navigation.navigate('Detail', annKey,  updateFeed: true, onSelect,)
            

          
        );

        return () => 
            Notifications.removeNotificationSubscription(notificationListener);
            Notifications.removeNotificationSubscription(responseListener);
        ;
    , []);



export default HomeScreen;

【问题讨论】:

【参考方案1】:

问题是在应用程序完成初始化后调用useEffect() 太晚了。因此,在系统放弃通知之前不会添加侦听器,并且不会调用处理程序。

幸运的是,由于您使用的是新的 expo-notifications 库,它引入了 useLastNotificationResponse() React 钩子。它可以替换addNotificationResponseReceivedListener() 监听器并返回用户交互的最后一个通知(即点击)。它可以安全地用于useEffect() 钩子中。

您可以在此处找到文档:https://docs.expo.io/versions/latest/sdk/notifications/#uselastnotificationresponse-undefined--notificationresponse--null

这里是如何使用它(最好在你的根组件上实现它):

import * as Notifications from 'expo-notifications';

export default function App() 
  const lastNotificationResponse = Notifications.useLastNotificationResponse();
  
  React.useEffect(() => 
    if (
      lastNotificationResponse &&
      lastNotificationResponse.notification.request.content.data['someDataToCheck'] &&
      lastNotificationResponse.actionIdentifier === Notifications.DEFAULT_ACTION_IDENTIFIER
    ) 
      // navigate to your desired screen
    
  , [lastNotificationResponse]);

  return (
    /*
     * your app
     */
  );

【讨论】:

您能给我一个建议吗?我在 useEffect() 中使用 setWebViewUri() 钩子在我的 组件中打开新 URL。不幸的是,在点击通知后(当应用程序处于终止状态时),这会导致无限循环。我的包含 Webview 的主要应用程序组件尝试重新渲染很多次,并且用户得到一个白屏。如果应用程序处于前台/后台,一切正常。【参考方案2】:

您必须将其添加到您的 app.json 文件中:

    "android": 
      "useNextNotificationsApi": true,
    ,

【讨论】:

以上是关于当应用程序被杀死/关闭时,世博会通知不会触发方法的主要内容,如果未能解决你的问题,请参考以下文章

推送通知后台被用户杀死

当应用程序被杀死时,FCM 不工作

当应用程序被杀死时,颤振本地通知不会重定向到相关屏幕

当应用程序不在前台时,特定活动不会从通知单击打开(应用程序是最近的,没有被杀死!)

当应用程序被杀死Android时无法接收解析推送通知

使用firebase发送静默推送通知,以便在应用程序被杀死时唤醒它