如何在 React Native 中在没有用户交互的情况下收到通知时打开应用程序

Posted

技术标签:

【中文标题】如何在 React Native 中在没有用户交互的情况下收到通知时打开应用程序【英文标题】:How to open app when notification received without user interaction In React Native 【发布时间】:2021-03-26 23:58:55 【问题描述】:

在没有用户交互的情况下收到通知时如何打开应用程序

我正在使用 react 原生推送通知库进行推送通知。应用程序应该在没有用户交互的情况下从后台自动启动并退出状态,并且应该调用 getInitialNotification 方法。我想在特定的通知类型上调用应用程序。

===============================================

File: RNPushNotificationHelper

===============================================



public void invokeApp(Bundle bundle) 

    String packageName = context.getPackageName();
    Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(packageName);
    String className = launchIntent.getComponent().getClassName();

    try 
        Class<?> activityClass = Class.forName(className);
        Intent activityIntent = new Intent(context, activityClass);

        if(bundle != null) 
            activityIntent.putExtra("notification", bundle);
        

        activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        context.startActivity(activityIntent);
     catch(Exception e) 
        Log.e(LOG_TAG, "Class not found", e);
        return;
    


===============================================

File: RNReceivedMessageHandler

===============================================


 // If notification ID is not provided by the user for push notification, generate one at random
 if (bundle.getString("id") == null) 
    SecureRandom randomNumberGenerator = new SecureRandom();
    bundle.putString("id", String.valueOf(randomNumberGenerator.nextInt()));


Application applicationContext = (Application) context.getApplicationContext();

RNPushNotificationConfig config = new RNPushNotificationConfig(mFirebaseMessagingService.getApplication());  
RNPushNotificationHelper pushNotificationHelper = new RNPushNotificationHelper(applicationContext);

boolean isForeground = pushNotificationHelper.isApplicationInForeground();

RNPushNotificationJsDelivery jsDelivery = new RNPushNotificationJsDelivery(context);
bundle.putBoolean("foreground", isForeground);
bundle.putBoolean("userInteraction", false);
jsDelivery.notifyNotification(bundle);

// If contentAvailable is set to true, then send out a remote fetch event
if (bundle.getString("contentAvailable", "false").equalsIgnoreCase("true")) 
    jsDelivery.notifyRemoteFetch(bundle);


Log.v(LOG_TAG, "invokeApp: " + bundle);
pushNotificationHelper.invokeApp(bundle);

if (config.getNotificationForeground() || !isForeground) 
    Log.v(LOG_TAG, "sendNotification: " + bundle);
    pushNotificationHelper.sendToNotificationCentre(bundle);

但它似乎在后台或退出状态下不起作用。我检查了 logcat,它在前台显示日志。

【问题讨论】:

【参考方案1】:

通知操作

我假设这是不可能的,因为这将是一个重大的安全漏洞。

android 文档中,只有点击通知和通知操作被列为后台操作选项。 The section.

限制绕过

Android 10(API 级别 29)有一个所谓的“从后台启动 Activity 的限制”。

但是,这些有several exceptions。 我认为你最感兴趣的是这些:

应用收到来自系统的通知 PendingIntent。在里面 服务和广播接收器的未决意图的情况下,应用程序 可以在待定意图后的几秒钟内开始活动 已发送。

应用程序已被授予 SYSTEM_ALERT_WINDOW 权限 用户。

【讨论】:

以上是关于如何在 React Native 中在没有用户交互的情况下收到通知时打开应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在 React Native 中在哪里添加 .d.ts 文件

在 React-Native 中为视频通话构建交互式游戏

在 React Native 中在前台设置 PushNotificationIOS 时出现警告

如何在react-native / redux中处理外部数据库更新?

如何正确选型,React Native还是Native?

无法更新状态 - react-native