Push Notifications in QT
-
Yes I understand. When my application is closed, the messages are only displayed in the message bar. And when I press the message, my application starts, but it does not receive the message itself. What can I do to see the message in my application as well?
If I receive a message while the application is in the background and I click on it, then "void MessageListener :: OnMessage (const messaging :: Message & message)" will be started, but "message.notification" will be false. Only "message.notification_opened" is true, whereupon the string "launchnotification" is passed, but that is useless.
void MessageListener::OnMessage(const messaging::Message &message) { // When messages are received by the server, they are placed into an // internal queue, waiting to be consumed. When ProcessMessages is called, // this OnMessage function is called once for each queued message. QVariantMap data; if (message.notification) { if (!message.notification->title.empty()) { const QString key = QStringLiteral("nTitle"); const QString value = QString::fromStdString(message.notification->title.c_str()); data.insert(key, value); } if (!message.notification->body.empty()) { const QString key = QStringLiteral("nBody"); const QString value = QString::fromStdString(message.notification->body.c_str()); data.insert(key, value); } if (!message.notification->icon.empty()) { const QString key = QStringLiteral("nIcon"); const QString value = QString::fromStdString(message.notification->icon.c_str()); data.insert(key, value); } if (!message.notification->tag.empty()) { const QString key = QStringLiteral("nTag"); const QString value = QString::fromStdString(message.notification->tag.c_str()); data.insert(key, value); } if (!message.notification->color.empty()) { const QString key = QStringLiteral("nColor"); const QString value = QString::fromStdString(message.notification->color.c_str()); data.insert(key, value); } if (!message.notification->sound.empty()) { const QString key = QStringLiteral("nSound"); const QString value = QString::fromStdString(message.notification->sound.c_str()); data.insert(key, value); } if (!message.notification->click_action.empty()) { const QString key = QStringLiteral("nClickAction"); const QString value = QString::fromStdString(message.notification->click_action.c_str()); data.insert(key, value); } } if (message.notification_opened) { const QString key = QStringLiteral("launchnotification"); data.insert(key, true); } for (const auto& field : message.data) { const QString key = QString::fromStdString(field.first); const QString value = QString::fromStdString(field.second); data.insert(key, value); } setData(data); }
Although it says, "As a workaround, we override onNewIntent so that the intent is passed to the C ++ Library Service, which forwards the data to the native C ++ messaging library."
...?/** * Workaround for when a message is sent containing both a Data and Notification payload. * * When the app is in the foreground all data payloads are sent to the method * `::firebase::messaging::Listener::OnMessage`. However, when the app is in the background, if a * message with both a data and notification payload is receieved the data payload is stored on * the notification Intent. NativeActivity does not provide native callbacks for onNewIntent, so * it cannot route the data payload that is stored in the Intent to the C++ function OnMessage. As * a workaround, we override onNewIntent so that it forwards the intent to the C++ library's * service which in turn forwards the data to the native C++ messaging library. */ @Override protected void onNewIntent(Intent intent) { // If we do not have a 'from' field this intent was not a message and should not be handled. It // probably means this intent was fired by tapping on the app icon. // TODO Bundle extras = intent.getExtras(); String from = extras.getString(EXTRA_FROM); String messageId = extras.getString(EXTRA_MESSAGE_ID_KEY); if (messageId == null) { messageId = extras.getString(EXTRA_MESSAGE_ID_KEY_SERVER); } if (from != null && messageId != null) { Intent message = new Intent(this, MessageForwardingService.class); message.setAction(MessageForwardingService.ACTION_REMOTE_INTENT); message.putExtras(intent); startService(message); } setIntent(intent); }
-
@Robin-Hood said in Push Notifications in QT:
but it does not receive the message itself. What can I do to see the message in my application as well?
Hmm. For me when the OnMessage is called (when I click on the message in messages bar) the ::firebase::messaging::Message contains all required fields like (title, body and so on).
Do you have an 'google-services.json' and appropriate content in 'build.gradle' files?
-
Yes. So I downloaded google-services.json from Firebase and 'build.gradle' from GitHub from QtFirebase.
mmh send your content of 'build.gradle' here. Maybe that brings something ...
-
@Robin-Hood said in Push Notifications in QT:
mmh send your content of 'build.gradle' here.
buildscript { repositories { jcenter() google() maven { url 'https://maven.google.com' } } dependencies { classpath 'com.android.tools.build:gradle:3.1.3' classpath 'com.google.gms:google-services:4.0.2' } } allprojects { repositories { jcenter() google() maven { url 'https://maven.google.com' } flatDir { dirs "$System.env.GOOGLE_FIREBASE_SDK" + "/libs/android" } } } apply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services' dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.google.android.gms:play-services-base:15.0.1' implementation 'com.google.firebase:firebase-core:16.0.1' implementation 'com.google.firebase:firebase-messaging:17.1.0' implementation 'com.google.firebase.messaging.cpp:firebase_messaging_cpp@aar' } android { /******************************************************* * The following variables: * - androidBuildToolsVersion, * - androidCompileSdkVersion * - qt5AndroidDir - holds the path to qt android files * needed to build any Qt application * on Android. * * are defined in gradle.properties file. This file is * updated by QtCreator and androiddeployqt tools. * Changing them manually might break the compilation! *******************************************************/ compileSdkVersion androidCompileSdkVersion.toInteger() buildToolsVersion androidBuildToolsVersion sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java'] aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl'] res.srcDirs = [qt5AndroidDir + '/res', 'res'] resources.srcDirs = ['src'] renderscript.srcDirs = ['src'] assets.srcDirs = ['assets'] jniLibs.srcDirs = ['libs'] } } lintOptions { abortOnError false } applicationVariants.all { variant -> variant.outputs.all { outputFileName = "../" + outputFileName } } }
-
Unfortunately that did not work. I am now trying to continue my project using qtcloudmessaging
In the instructions it says under point 5:
"First install QtCloudMessaging from the command line:
qmake "CONFIG + = Embedded-Kaltiot Firebase" make make install "I do not know how do I install it from the command line. ... I use windows 10
-
So I think I found where it is to install QtCloudMessaging. You can see it in the first picture. I hope that was right.
But the compiler is still nagging :/I have copy the compiler report:
C:\Users\Robin\QtProjects\build-qtcloudmessaging-Android_f_r_armeabi_v7a_GCC_4_9_Qt_5_11_1_for_Android_armv7-Debug\lib\libQt5CloudMessaging.so konnte nicht gefunden werden move libQt5CloudMessaging.so ..\..\lib\ process_begin: CreateProcess(NULL, move libQt5CloudMessaging.so "..\..\lib ", ...) failed. make (e=2): Das System kann die angegebene Datei nicht finden. make[2]: [..\..\lib\libQt5CloudMessaging.so] Error 2 (ignored) … C:\Users\Robin\QtProjects\qtcloudmessaging\src\cloudmessagingembeddedkaltiot\qcloudmessagingembeddedkaltiotclient.cpp In file included from C:\Users\Robin\QtProjects\qtcloudmessaging\src\cloudmessagingembeddedkaltiot\qcloudmessagingembeddedkaltiotclient.cpp:29:0: C:\Users\Robin\QtProjects\qtcloudmessaging\src\cloudmessagingembeddedkaltiot\qcloudmessagingembeddedkaltiotclient.h:32:45: fatal error: QtCloudMessaging/QtCloudMessaging: No such file or directory #include <QtCloudMessaging/QtCloudMessaging> ^ compilation terminated. make[2]: *** [.obj\qcloudmessagingembeddedkaltiotclient.obj] Error 1 make[1]: *** [sub-cloudmessagingembeddedkaltiot-make_first] Error 2 make[2]: Leaving directory `C:/Users/Robin/QtProjects/build-qtcloudmessaging-Android_f_r_armeabi_v7a_GCC_4_9_Qt_5_11_1_for_Android_armv7-Debug/src/cloudmessagingembeddedkaltiot' make[1]: Leaving directory `C:/Users/Robin/QtProjects/build-qtcloudmessaging-Android_f_r_armeabi_v7a_GCC_4_9_Qt_5_11_1_for_Android_armv7-Debug/src' make: *** [sub-src-make_first] Error 2 16:12:54: Der Prozess "C:\Users\Robin\android-ndk-r17b\prebuilt\windows-x86_64\bin\make.exe" wurde mit dem Rückgabewert 2 beendet. Fehler beim Erstellen/Deployment des Projekts qtcloudmessaging (Kit: Android für armeabi-v7a (GCC 4.9, Qt 5.11.1 for Android armv7)) Bei der Ausführung von Schritt "Make"
If you want to help me, I think it would be easiest if you look at the manual -> qtcloudmessaging
:)Here are three more pictures. Maybe they will help you with troubleshooting:
-
@Robin-Hood Did you add include/lib locations for qtcloudmessaging in your pro file?
-
@Robin-Hood Take a look at "Linking your application against the shared library" chapter in https://wiki.qt.io/How_to_create_a_library_with_Qt_and_use_it_in_an_application
-
@jsulm
I do not see any libs I could add. I have done it as it says in the instructions under point 6.
Here is the link to the instructions: QtCloudMessaging
So I wrote the code to several pro files:
QT + = cloud messaging
QT + = cloudmessagingfirebaseBefore that, I added the code in my qmake scribt:
"CONFIG + = firebase",
as I the instructions under point 1 stands.
If you scroll something up, you can see it in the first picture. -
@Robin-Hood said in Push Notifications in QT:
QT + = cloud messaging
it should be
QT + = cloudmessaging
Shouldn't you do the include like this
#include <QtCloudMessaging>
?
-
Hello,
I would like to integrate the existing Qt project QtFirebase Example in another Qt project. I thought about a solution via libs (libaries). When it exists a simple method, for example with libs or other, I'm grateful for comments. Otherwise I know that you can subdivide via subdir, but I would need a step by step statement.
To clarify again, my point is to include push notifications in an existing Qt project. I've done the QtFirebase Example and I can get push notifications. Now I would like to integrate this functionality into another project. As mentioned earlier, it would be best if I clicked "Add to Library" within another project and the push notification feature is added.
Surely there must be a possibility, I am convinced of that. Request for feedback.