Как я могу разбудить устройство, когда на Android поступили уведомления с response-native-firebase? - PullRequest
0 голосов
/ 05 июня 2018

Я разрабатываю функцию уведомления, используя react-native-firebase на React native в Android.

Большинство функций (таких как удаленное уведомление на переднем и заднем плане, отображение локального уведомления) хорошо реализованы, но есть одна проблема, которую я не решил.

Как я уже говорил выше, получение уведомлений на переднем и заднем плане работает хорошо.Когда экран устройства выключен (режим блокировки или режим ожидания), уведомление хорошо воспринимается с вибрацией и звуком, но экран не включен.Я тестировал на эмуляторе (Nexus 5X с Google Play), LG G Flex2, Samsung galaxy S8.

Ожидание

Пробуждение устройства (включение экрана) при получении уведомлений на Android

Текущая ситуация

Когда поступили уведомления, звук и вибрация работают, но экран выключен.

Я не тестировал на iOS.Вот мои конфигурации.

gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip

build.gradle (проект)

dependencies {
    classpath 'com.android.tools.build:gradle:3.1.2'
    classpath 'com.google.gms:google-services:3.2.1'
}

build.gradle (приложение)

compileSdkVersion 26
minSdkVersion 16
targetSdkVersion 26

React Native Version

"react": "^16.3.0-alpha.1",
"react-native": "0.54.3",

response-native-firebase версия

"react-native-firebase": "^4.2.0",

коды получения уведомлений на стороне клиента

async configureNotifications() {
    const enabled = await firebase.messaging().hasPermission();
    if (enabled) {
        this.listenNotification();
    } else {
        try {
            await firebase.messaging().requestPermission();
            this.listenNotification();
        } catch (e) {
            Alert.alert('', '알림 거부하시면 화재 감지 알림을 받으 실 수 없습니다.');
        }
    }
}

listenNotification() {
    if (Platform.OS === 'android') {
        const channel = new firebase.notifications.Android.Channel(
            'alert',
            'alert',
            firebase.notifications.Android.Importance.Max,
        ).setDescription('My apps alert');
        firebase.notifications().android.createChannel(channel);
    }
    const subProm = [];
    const { account } = this.props;
    const { deviceInfo } = account;

    for (let i = 0; i < deviceInfo.length; i++) {
        subProm.push(firebase.messaging().subscribeToTopic(deviceInfo[i].deviceID));
    }

    Promise.all(subProm).then(() => {
        this.messageListner = firebase.messaging().onMessage((message) => {
            let newNotification;

            if (Platform.OS === 'android') {
                newNotification = new firebase.notifications.Notification()
                    .setNotificationId(message.messageId)
                    .setTitle(message.data.title)
                    .setBody(message.data.body)
                    .setSound('default')
                    .android.setPriority(firebase.notifications.Android.Priority.High)
                    .android.setChannelId('alert');
            }

            return firebase.notifications().displayNotification(newNotification);
        });
    });
}

на стороне клиентафоновый обработчик задач без головы

export default async (message) => {
    console.log('on Background Message');
    console.log(message);
    let newNotification;

    if (Platform.OS === 'android') {
        newNotification = new firebase.notifications.Notification()
            .setNotificationId(message.messageId)
            .setTitle(message.data.title)
            .setBody(message.data.body)
            .setSound('default')
            .android.setPriority(firebase.notifications.Android.Priority.High)
            .android.setChannelId('alert');
    }

    return firebase.notifications().displayNotification(newNotification);
};

index.js

AppRegistry.registerHeadlessTask('RNFirebaseBackgroundMessage', () => bgMessaging);

отправка кодов уведомлений на стороне сервера (тестовая версия)

nodejs с firebase-admin

var msg = {
    android: {
        ttl: 36000,
        data: {
            title: 'title',
            body: 'body' + topic,
        },
        priority: 'high',
    },
    topic,
};

admin
    .messaging()
    .send(msg)
    .then((res) => {
        console.log('Successfully sent message', res);
        process.exit();
    }, console.error);
...