Реагировать на события подключения собственного сокета дескриптора, когда приложение находится в фоновом режиме? - PullRequest
2 голосов
/ 29 апреля 2019

Я работаю над приложением чата, используя React native, и WebSocket все отлично работает в активном режиме, но когда вы нажимаете кнопку «Домой», чтобы перевести приложение в фоновый режим, функция событий WebSocket onMessage не срабатывает

Хорошо, что WebSocket соединение все еще установлено, но функция событий не сработала.

Я просто хочу нажать на уведомление при получении сообщения в фоновом режиме.

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

Существует ли законный API для поддержания соединения в фоновом режиме?

Нужно ли заново подключать сокетное соединение в фоновом режиме

Мой код

events = (data) =>{

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

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


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

            session.subscribe('messages', this.events);
        };
        connection.open();

        })
    };

1 Ответ

2 голосов
/ 03 мая 2019

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

Да, это определенно приведет котклонение группой Apple / Google по рассмотрению приложений.

Существует ли законный API для поддержания соединения в фоновом режиме?

На самом деле вам это не нужно(см. решение ниже)

Решение:

Я предполагаю, что у вас есть сервер, на котором вы управляете всеми соединениями websocket и маршрутизируете сообщение ожидаемому клиенту.Вы можете использовать облачные сообщения firebase , чтобы отправить пользователю push-уведомление ios / android, которое информирует его о появлении нового сообщения.Конечно, вам нужен FCM как на стороне сервера, так и на стороне приложения.Для части приложения вы можете использовать, например, act-native-firebase .Для сервера доступно несколько библиотек .Теперь есть два случая:

случай 1)

Если приложение уже находится на переднем плане, вы можете либо показать LocalNotification через FCM (response-native-firebase) или вы просто используете подключение к веб-сокету для отображения сообщения.

case 2)

Ваше приложение работает в фоновом режиме, снова вы отправляете push-уведомление через FCM с вашего сервера.Большим преимуществом является то, что FCM связывается со службой push-уведомлений Apple и службой облачных сообщений Google (кстати, Google скоро будет использовать только FCM).Это означает, что ваш пользователь получает собственное push-уведомление с текстом предварительного просмотра или полным сообщением (это ваше дело).Затем пользователь нажимает на уведомление, и ваше приложение открывается снова.На этом этапе вы можете повторно подключиться к веб-сокету, а затем продолжить нормальное поведение приложения.

Дополнительные замечания:

  1. Вероятно, это единственный законный способ
  2. Использование APNS / GMS / FCM гораздо более энергоэффективно, чем сохранение приложения всегда в фоновом режиме.
...