Cordova-plugin-firebase: onNotificationOpen не запускается, если приложение закрыто — процесс приложения завершается в фоновом режиме.

Созданный на 24 нояб. 2016  ·  46Комментарии  ·  Источник: arnesson/cordova-plugin-firebase

Привет,

Я не знаю, если это поведение по умолчанию или нет. Но когда приложение закрыто (процесс приложения убит), приходит push-уведомление и нажмите на него, onNotificationOpen не запускается. Это так, как ожидалось, или что-то нужно работать над этим?

messaging

Самый полезный комментарий

FirebasePlugin.java

<strong i="6">@Override</strong>
protected void pluginInitialize() {
    final Context context = this.cordova.getActivity().getApplicationContext();
    final Bundle extras = this.cordova.getActivity().getIntent().getExtras();
    this.cordova.getThreadPool().execute(new Runnable() {
        public void run() {
            Log.d(TAG, "Starting Firebase plugin");
            mFirebaseAnalytics = FirebaseAnalytics.getInstance(context);
            if(extras != null && extras.size()>1) {
                // FirebasePlugin.sendNotification(extras);
                if (FirebasePlugin.notificationStack == null) {
                    FirebasePlugin.notificationStack = new ArrayList<Bundle>();
                }
                notificationStack.add(extras);

            }
        }
    });
}

Все 46 Комментарий

я тоже столкнулся с такой же проблемой :(

используйте событие возобновления кордовы, чтобы снова подключить обратный вызов. см. документы Cordova о жизненном цикле Android: http://cordova.apache.org/docs/en/6.x/guide/platforms/android/index.html#lifecycle -guide

@robertarnesson Не могли бы вы объяснить свой ответ немного подробнее? У меня такая же проблема на iOS. Я могу получать уведомления, пока приложение работает на переднем плане и в фоновом режиме, но как только я закрываю/выхожу из своего приложения, я больше не могу получать уведомления.

Я получаю уведомления как в фоновом режиме, так и на переднем плане (Android 6.0.1)... Но открытое уведомление не запускает приложение, уведомление в трее очищается после нажатия, а данные уведомления теряются. (это происходит, даже когда приложение находится в паузе). Может ли это быть из-за пешеходного перехода? Есть ли какое-то исправление?

@Robertarnesson @Taracque

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

Это базовая интерпретация того, что у меня есть в моем index.html, и это работает для iOS и Android с доставкой полезной нагрузки в приложение для манипулирования.

Я обнаружил, что с iOS мне нужно было использовать только функцию «deviceready» в cordova.js, поскольку она, казалось, срабатывала всякий раз, когда было получено уведомление, когда приложения были на переднем плане И после возобновления работы приложения, которое было в фоновом режиме, будь то нажатием кнопки уведомление или просто открытие приложения.

Для Android мне нужно было использовать «возобновление», так как «готовность к устройству», казалось, срабатывала только один раз, когда приложение впервые загружалось (я полагаю, имеет смысл).

function onLoad(){

    //fire this with load of the HTML page
    document.addEventListener("deviceready", onDeviceReady, false);

    }

    function onDeviceReady(){

    // this will fire when the app first runs (iOS and Android)
    // iOS will run this after tapping a notification as well but not Android

    // Create the resume as soon as the device is ready.
    document.addEventListener("resume", onResume, false); 

    // add initial cordova-plugin-firebase function calls here
    // e.g TokenRefresh, onNotificationOpen etc

    window.FirebasePlugin.onTokenRefresh(function(token){

    //Do something with the token server-side if it exists

    });

    // get any initial or resume notification (used for iOS)
    var payload = getNotification();

    }

    function getNotification(){

    // get any notification variables for use in your app
    window.FirebasePlugin.onNotificationOpen(function(notification){

    //Check if notification exists then do something with the payload vars
    var str = JSON.stringify(notification);
    console.log(str);

    });

    return str;

    }

    function onResume(){
    //Add plugin functions here after app has resumed from background
    // or after notification is tapped (needed for Android)

    //get resume notification and payload (needed for Android)

    var payload = getNotification();

    }

Привет, ребята, я думаю, что мы упустили момент здесь. само приложение даже не на заднем или переднем плане. вы пытаетесь убить приложение, и функция не запускается, мы не можем использовать ее при возобновлении работы, потому что приложение не приостановлено, приложение не перемещается на передний план, а запускается. даже после того, как устройство готово, onNotification open не срабатывает.

Не уверен, что понимаю, но правильно ли это.

1: ваше приложение полностью неактивно
2: вы получаете собственное уведомление для приложения
3 вы нажимаете уведомление
4 приложение загружается
5 onNotificationOpen не срабатывает

Это правильно?

Это для какой ОС?

Можете ли вы предоставить часть своего кода?

Вы включили Cordova.js в свой скрипт?

Вы на 100% уверены, что у вас нет ошибок js на странице загрузки?

@device68 Я хотел бы знать, срабатывает ли onNotificationOpen, когда приложение изначально не запускается, как сказал @nikrhes .
Я тестировал как на Android, так и на iOS с вызовом onNotificationOpen при возобновлении и готовности устройства. И только ситуация, о которой я упоминал выше, не сработала. Есть также некоторое неожиданное поведение и в других ситуациях.
Вы можете проверить выпуск № 137, который я открыл.

@chanphillip , утром посмотрю. Я не могу подтвердить iOS 10, так как использую более старую версию XCODE, но я посмотрю, что именно происходит на Android.

Мое приложение в значительной степени использует как холодный запуск с полезными данными из уведомлений, так и возобновление, но не заметил никаких проблем.

@device68 все работает нормально, только когда приложение неактивно, функция вообще не запускается. Меня тестируют почти на каждой ОС IOS и Android, которую я могу взять в руки. До сих пор не работает.

Из того, что я помню во время своих тестов сегодня в Android, это то, что происходит.

1 неактивное приложение

Если я получу уведомление и нажму на него, это загрузит приложение, как и ожидалось, и любой код плагина в onDeviceReady захватит эту полезную нагрузку.

Любой код в резюме не будет захватывать полезную нагрузку.

Любые дальнейшие уведомления, пока приложение все еще активно и еще не свернуто, получаются функциями внутри onDeviceReady.

2 сворачивая приложение в первый раз.

В первый раз, когда я сворачиваю приложение, оно останавливается onDeviceReady, потому что решение уже готово и теперь ожидает состояния возобновления.

Если я получу уведомление и коснусь его, откроется приложение, и код плагина внутри Resume теперь захватит полезную нагрузку.

Все последующие уведомления будут получены Resume.

3 свернутое приложение (вообще говоря)

Если мое приложение свернуто в любое время, и я нажимаю уведомление, Resume фиксирует это, НО, если я не нажимаю на него и вместо этого открываю приложение вручную, Resume ничего не делает, и нигде в моем коде не запускается onNotificationOpen.

Обратите внимание, что это действие полностью отличается в iOS 9.3.

4 приложения переднего плана

Если после возобновления я получаю уведомление, находясь в приложении, Resume фиксирует полезную нагрузку.

5 убийственное приложение

Если я убью приложение, мы начнем с №1

6 полезных нагрузок

Два различия, которые я видел с данными, отправляемыми GCM на Android, зависят от того, было ли уведомление нажато вне приложения или получено, когда оно находится на переднем плане.

Google добавляет тайм-код, от, идентификатор сообщения и т. д., если уведомление нажато.

Google удаляет вышеуказанное, но добавляет просто tap = false во всех остальных случаях.

Любые данные, которые вы отправляете, присутствуют во всех случаях.

Я использую API Curl на стороне сервера для отправки сообщений между Интернетом, Android и iOS.

В конечном счете, на Android все кажется логичным, на самом деле это реализация iOS, которая неверна и нелогична.

Все в iOS работает с onDeviceReady, а onNotificationOpen вызывается каждый раз при получении уведомления, даже когда вы открываете приложение вручную после получения уведомления, нажатия на сообщение или получения уведомления, когда приложение находится на переднем плане.

Надеюсь это поможет.

Но вы должны использовать как onDeviceReady, так и Resume и размещать версии onNotificationOpen под каждым из них, если хотите получать полезную нагрузку во всех ситуациях.

@device68 Спасибо за подробное объяснение.
На самом деле, я сказал это неправильно, я также помещал onNotificationOpen как в возобновление работы устройства, так и в готовность, но вариант использования 1 (нажатие уведомления, когда приложение даже не запущено) не работал с моей стороны, в то время как другие варианты использования работают как то, что вы описали.

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

Не могли бы вы дважды подтвердить, что onNotificationOpen срабатывает, даже если приложение не запущено (приложение было убито) на вашей стороне? Кроме того, вы можете проверить это и на iOS? Спасибо.

@chanphillip нет проблем, рад, что могу помочь.

Правильно, я просто использую необработанный плагин phonegap, установленный через CLI, а затем этот плагин, установленный внутри него.

Хм, на самом деле я провел еще несколько тестов и создал видео моего устройства с предупреждениями в 4 местах.

https://www.youtube.com/watch?v=xrWQH2wE8Fo

Кажется, это подтверждает то, что вы видите. onNotificationOpen вообще НЕ запускается при нажатии на уведомление, которое вызывает холодную загрузку приложения. Только после этого уведомления собираются из функции onNotificationOpen.

Слушатели срабатывают, как и ожидалось, но не onNotificationOpen.

Для меня это не особенно проблема для моего приложения, что, вероятно, объясняет, почему я не видел его до сих пор.

Я тестировал на устройствах под управлением Android 4+, 6+ и 7+, результат тот же.

К сожалению, я не думаю, что смогу сильно помочь с iOS, я использую Virtualbox с Yosemite и XCODE 7.1 (вынужден включить iOS 9.3 SDK). Я обнаружил, что уведомления работают исключительно с onDeviceRedy, и мне даже не нужно использовать Resume. Это было для устройств с iOS 9+, но ниже 10+.

Однако конечные пользователи обновили свои телефоны до версии 10.2, и уведомления перестали работать. Я полагаю, что из-за моей сборки XCODE с SDK 9.3 мне теперь нужно купить Mac :-(

Дайте мне знать, если видео поможет.

Я сталкиваюсь с той же проблемой. Приложение открывается, но не запускает функцию. Я попытался воспроизвести поведение на вашем видео и, конечно же, жду состояния ondeviceready. Но метод никогда не срабатывает.

Обратите внимание: при оценке функции через разъем Lighttable она работает. Это работает ТОЛЬКО, когда я оцениваю его в среде IDE. Но функция никогда не срабатывает, например, версия метода плагина «не вызывается». Почему оценка функции работает?

Всем привет,
Я столкнулся с той же проблемой, поэтому я пытаюсь понять, что происходит в коде.
Для варианта использования с холодным запуском документ говорит использовать onNewIntent.
Код плагина выглядит хорошо.

    <strong i="9">@Override</strong>
    public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        FirebasePlugin.sendNotification(intent.getExtras());
    }

Но для вызова этого обратного вызова необходимо, чтобы в уведомлении было указано намерение начать использовать click_action в полезной нагрузке.

{
  "to": "/topics/news",
  "notification": {
    "title": "Click Action Message",
    "text": "Sample message",
    "click_action": "android.intent.action.MAIN"
  }
}

Я пытаюсь сделать это, но безуспешно, не уверен, что нужно установить действие щелчка.
Какое бы значение я ни установил, приложение не запускается

        <activity android:name="MainActivity" >
            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

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

<strong i="21">@Override</strong>
    protected void pluginInitialize() {
        final Context context = this.cordova.getActivity().getApplicationContext();
        final Bundle extras = this.cordova.getActivity().getIntent().getExtras();
        this.cordova.getThreadPool().execute(new Runnable() {
            public void run() {
                Log.d(TAG, "Starting Firebase plugin");
                mFirebaseAnalytics = FirebaseAnalytics.getInstance(context);
                if(extras != null && extras.size()>1) {
                    FirebasePlugin.sendNotification(extras);

                }
            }
        });
    }

В любом случае это похоже на грязный взлом.

Хорошо, мне удается использовать click_action, добавляя категорию по умолчанию в manifest.xml, но onNewIntent не вызывается.

            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

FirebasePlugin.java

<strong i="6">@Override</strong>
protected void pluginInitialize() {
    final Context context = this.cordova.getActivity().getApplicationContext();
    final Bundle extras = this.cordova.getActivity().getIntent().getExtras();
    this.cordova.getThreadPool().execute(new Runnable() {
        public void run() {
            Log.d(TAG, "Starting Firebase plugin");
            mFirebaseAnalytics = FirebaseAnalytics.getInstance(context);
            if(extras != null && extras.size()>1) {
                // FirebasePlugin.sendNotification(extras);
                if (FirebasePlugin.notificationStack == null) {
                    FirebasePlugin.notificationStack = new ArrayList<Bundle>();
                }
                notificationStack.add(extras);

            }
        }
    });
}

У меня была та же проблема, что описана выше, в основном полезная нагрузка уведомления не доставлялась, когда приложение запускалось с помощью нажатия на уведомление. Предложение @ huny0522 , кажется, решает проблему. 👍

Интересно, мне это конкретно не нужно, но я тоже попробую и посмотрю, сработает ли это для меня. Было бы идеально, если бы разработчики этого плагина могли каким-то образом внедрить это изменение, так как это кажется большой проблемой для большинства людей, которым нужна полезная нагрузка уведомлений после холодной загрузки приложения.

Эта проблема исправлена ​​или будет исправлена ​​в следующем релизе!?

Патч от @huny0522 не решил проблему для меня. Обратный вызов onNotificationReceived игнорируется при холодном запуске Android. Все остальные сценарии ведут себя так, как ожидалось.

Переустановка плагина с github решила проблему для меня, попробовав все предложенные решения.

плагин Cordova добавить https://github.com/arnesson/cordova-plugin-firebase.git --save

Кто-то решил

шаг 3, который написал @device68 ??

свернутое приложение (вообще говоря)

Если мое приложение свернуто в любое время, и я нажимаю уведомление, Resume фиксирует это, НО, если я не нажимаю на него и вместо этого открываю приложение вручную, Resume ничего не делает, и нигде в моем коде не запускается onNotificationOpen.

Это моя единственная проблема сейчас.

Аналогичная проблема здесь.

Мне пришлось удалить эту строку из отправленного объекта: "click_action":"YOUR_DATA_HERE".

Теперь приложение правильно запускается, когда я касаюсь уведомления, полученного в фоновом режиме.

Надеюсь, поможет.

У меня также есть те же проблемы с приложением ionic/cordova, но только на устройстве с Android 6.0. На этом устройстве уведомление всегда запускается в строке состояния, независимо от того, находится ли приложение в фоновом или переднем плане (!), И обратный вызов никогда не запускается, когда я открываю уведомление, поэтому я не получаю полезную нагрузку.
Все другие устройства, которые я тестировал, были в порядке (Android 5, iOS 9 и 10): на переднем плане он запускает данные обратного вызова, и я реагирую на них, а в фоновом режиме обычно получает уведомление в строке состояния, как описано в документах.

@abhishek-kollipara обсуждаемая проблема заключается не в том, как получить полезную нагрузку в активном/фоновом состоянии, а в том, когда приложение загружается в холодном состоянии путем нажатия на уведомление и получения из него полезной нагрузки уведомления. это не проблема того, как формируется полезная нагрузка, особенно когда она описана в документации другого плагина, а не этого.

У меня был первый успех в захвате полезной нагрузки при холодной загрузке за последние два дня, когда я начал ее охотиться. получить собственный плагин ionic «веб-намерение». установите его, как описано в документации, и используйте его встроенную функцию getIntent() при загрузке. если приложение загружается с помощью уведомления, данные уведомления будут находиться где-то внутри возвращаемого объекта.

@heidji Это работает на IOS?

В моем случае:

Андроид:
-Холодный старт: запуск OnNotificationOpen
-Свернутое приложение: запуск OnNotificationOpen
-Приложение переднего плана: запуск OnNotificationOpen

iOS:
-Холодный старт: НЕ запускать OnNotificationOpen
-Свернутое приложение: запуск OnNotificationOpen
-Приложение переднего плана: запуск OnNotificationOpen

Спасибо за помощь

@Hanzofm Честно говоря , я не знаю, работает ли это на iOS. просто попробуйте использовать плагин Web Intent и зарегистрируйте его вывод в консоли при загрузке.

У меня такое же поведение в iOS, как описано @Hanzofm

У меня такое же поведение в iOS. onNotificationOpen не вызывается при холодном запуске приложения iOS при нажатии на уведомление. Используя версию плагина 0.1.25.

Обновлять:
Я также использовал «cordova-plugin-local-notifications» с плагином firebase, и это вызвало проблему. Когда я удалил плагин «cordova-plugin-local-notifications», он заработал нормально.

У меня также возникают проблемы с запуском noNotificationOpen при холодном запуске (iOS). Есть ли решение?

Спасибо

В моем случае было решено удаление плагина локальных уведомлений. Есть несовместимость с этим плагином и плагинами push-уведомлений.

У меня нет этого плагина, к сожалению :)

Это должно быть включено?

skjermbilde 2018-04-27 kl 09 22 50

Закрытие на уборку. Пожалуйста, проверьте последнюю версию и снова откройте, если проблема не устранена.

@heidji допустим, мы решили проблему с помощью вашего метода, есть ли у вас какие-либо сведения о том, как получить данные уведомления в следующей ситуации?

Приложение полностью закрыто. Пользователь получает push-уведомление. Пользователь не нажимает на уведомление, а вместо этого удаляет его с панели уведомлений. Пользователь открывает приложение позже, переходит на страницу уведомлений и ничего не видит. Потому что пользователь не получает уведомление на переднем плане и не нажимает на него, чтобы открыть приложение. Но нам все еще нужно знать, что это уведомление существует, чтобы показать пользователю. Как это сделать в ionic3?

@akildemir нет возможности сделать это в Ionic, вам придется регистрировать уведомления на своем собственном сервере и извлекать их, когда пользователь открывает приложение, как это обычно делает любой.

@heidji как я буду регистрировать уведомления на своем сервере, чтобы получить их, если я не знаю, что это уведомление существует?
Есть ли способ, которым firebase также отправляет уведомления на мой сервер с устройством, или вы имели в виду не использовать firebase, а использовать свой собственный сервер для уведомлений?

@akildemir Я имею в виду, когда вы СОЗДАЕТЕ push-уведомление, вы также регистрируете его существование где-то еще, например, на своем собственном сервере или на любом другом сервере, который вы используете для своего проекта. Я думаю, что firebase также предоставляет эти услуги.
Я не знаю, как вы создаете эти уведомления, но в моем проекте, когда что-то происходит на моем PHP-сервере, например, кто-то отправил вам сообщение, я связываюсь с firebase, чтобы отправить уведомление, и ТАКЖЕ сохраняю это событие с "is_read = 0" флаг, поэтому, если пользователь никогда не нажимает на уведомление, он может получить его на веб-сайте, или приложение использует вашу собственную службу для вызова этих уведомлений или чего-то еще, просто стандартные вещи разработчика.

@heidji У меня нет веб-сайта для моего приложения, но да, то, что вы сказали, довольно логично, я могу одновременно сохранить уведомление на своем сервере и получить его позже. Спасибо! и да, меня можно считать новичком в мобильной разработке. Также можно еще кое-что спросить? Как я могу зарегистрировать одно и то же уведомление на нескольких устройствах через firebase? вы можете думать об этом как о групповом чате. Когда кто-то что-то набирает в групповом чате, все в группе получают это. Я использую этот формат для регистрации уведомления:

пусть тело = {
"уведомление":{
"название":"название" , "body":"body" ,
},
"данные":{
"парам1": "значение1"
},
"кому": DeviceId ,
"приоритет": "высокий",
"restricted_package_name":""
}

  let options = new HttpHeaders().set('Content-Type','application/json');
  this.http.post("https://fcm.googleapis.com/fcm/send",body,{
    headers: options.set('Authorization', 'key=),
  })

здесь, если вы передаете deviceId в раздел «to», он отправляет на устройство. но могу ли я передать здесь несколько идентификаторов устройств?

@nikrhes Вы можете проверить это в метаданных:
window.FirebasePlugin.onNotificationOpen().subscribe((данные) => {
если (данные.нажмите) {
// пользователь нажимает на уведомление
} еще {
// приложение работает на переднем плане
}
});

Я не уверен, что это когда-либо было решено, но я месяцами искал ответ в различных темах об этом. Чтобы было ясно, проблема заключается в том, что onNotification не срабатывает конкретно в случае iOS, где приложение полностью закрыто/выключено/убито. Уведомление приходит, холодная загрузка приложения, но функция не срабатывает и полезная нагрузка не доставляется.

@heidji - ваше обходное решение для хранения push-событий на сервере и проверки того, были ли они прочитаны, имеет смысл. Однако в нашем приложении есть сценарии, для которых это не сработает (т. е. нам нужно определить, запущено ли уведомление, на основе того, действительно ли пользователь щелкнул его, а не прочитал ли он его).

Но главное, как заявляли многие другие, заключается в том, что это кажется критическим поведением, для которого должно быть решение?

@wwwguy мое решение не является обходным путем. это стандартная практика, которую используют все, большие или малые.
вы не можете полагаться на нажатия уведомлений, это не гарантированные события. я имею в виду, когда я нажимаю уведомление facebook на моем телефоне xiaomi, иногда приложение даже не открывается.

Да, я понимаю. Мы развернули десятки приложений для разных клиентов. Мы используем практику отслеживания «прочтений» уведомлений на сервере, а также в нескольких наших приложениях. Но есть и другие случаи, которые следует учитывать, например, уведомления, которые представляют собой нечто большее, чем просто уведомления, а скорее несут полезные данные, которые затем управляют определенными функциями в приложении, если на них щелкнуть. Фейсбук дерьмо. Все это знают. Но уведомления FB также являются простыми уведомлениями (которые просто отображаются в списке архивов внутри приложения). Они не функциональны по своей природе. т.е. нет определенных типов уведомлений FB, когда вы нажимаете на них, оно должно открывать приложение и направлять вас в определенное место.

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

Открытое приложение для Android = РАБОТАЕТ
Открытое приложение для iOS = РАБОТАЕТ
Фоновое приложение Android = РАБОТАЕТ
Фоновое приложение iOS = РАБОТАЕТ
Холодная загрузка Android из убитого приложения = РАБОТАЕТ
Холодная загрузка iOS из убитого приложения = НЕ РАБОТАЕТ

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

Исправление ошибки для плагина разработчиком в стороне ... кто-нибудь смог изолировать ручное исправление кода для этого?

честно говоря уведомление от холодной загрузки на iOS у меня работает на 100%. Я использовал плагин webintent только для Android, потому что onNotificationOpen у меня там не работал, а webintent не существует на iOS.
если вам нужны какие-либо подробности о моей настройке, дайте мне знать

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

stephan-nordnes-eriksen picture stephan-nordnes-eriksen  ·  5Комментарии

Zrnik picture Zrnik  ·  3Комментарии

dhavalsoni2001 picture dhavalsoni2001  ·  5Комментарии

jdla1990 picture jdla1990  ·  4Комментарии

michaelreiser picture michaelreiser  ·  5Комментарии