{"id":21903880,"url":"https://github.com/hansemannn/titanium-firebase-cloud-messaging","last_synced_at":"2025-04-07T13:08:07.354Z","repository":{"id":28594937,"uuid":"107106772","full_name":"hansemannn/titanium-firebase-cloud-messaging","owner":"hansemannn","description":"Use the Firebase Cloud Messaging SDK in Axway Titanium 🚀 Edit","archived":false,"fork":false,"pushed_at":"2025-03-06T09:32:27.000Z","size":28949,"stargazers_count":43,"open_issues_count":7,"forks_count":34,"subscribers_count":12,"default_branch":"main","last_synced_at":"2025-03-31T11:08:10.467Z","etag":null,"topics":["appcelerator","axway","firebase","firebase-cloud-messaging","javascript","native","titanium"],"latest_commit_sha":null,"homepage":null,"language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hansemannn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["hansemannn","m1ga"]}},"created_at":"2017-10-16T09:30:02.000Z","updated_at":"2025-03-06T09:30:46.000Z","dependencies_parsed_at":"2024-04-17T12:48:51.393Z","dependency_job_id":"ea0e7783-2bb6-40b6-a8fc-67f2d509cc03","html_url":"https://github.com/hansemannn/titanium-firebase-cloud-messaging","commit_stats":null,"previous_names":[],"tags_count":42,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hansemannn%2Ftitanium-firebase-cloud-messaging","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hansemannn%2Ftitanium-firebase-cloud-messaging/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hansemannn%2Ftitanium-firebase-cloud-messaging/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hansemannn%2Ftitanium-firebase-cloud-messaging/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hansemannn","download_url":"https://codeload.github.com/hansemannn/titanium-firebase-cloud-messaging/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247657281,"owners_count":20974345,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["appcelerator","axway","firebase","firebase-cloud-messaging","javascript","native","titanium"],"created_at":"2024-11-28T15:29:56.692Z","updated_at":"2025-04-07T13:08:07.336Z","avatar_url":"https://github.com/hansemannn.png","language":"Objective-C","funding_links":["https://github.com/sponsors/hansemannn","https://github.com/sponsors/m1ga"],"categories":[],"sub_categories":[],"readme":"# Firebase Cloud Messaging - Titanium Module\n\nUse the native Firebase SDK (iOS/Android) in Axway Titanium. This repository is part of the [Titanium Firebase](https://github.com/hansemannn/titanium-firebase) project.\n\n## Supporting this effort\n\nThe whole Firebase support in Titanium is developed and maintained by the community (`@hansemannn` and `@m1ga`). To keep\nthis project maintained and be able to use the latest Firebase SDK's, please see the \"Sponsor\" button of this repository,\nthank you!\n\n## Topics\n* [Requirements](#requirements)\n* [Download](#download)\n* [iOS notes](#ios-notes)\n* [Android Notes](#android-notes)\n* [API: Methods, Properties, Events](#api)\n* [Example](#example)\n* [Sending push messages](#sending-push-messages)\n* [Build from source](#build)\n\n## Requirements\n- [x] iOS: [Firebase-Core](https://github.com/hansemannn/titanium-firebase-core)\n- [x] iOS: Titanium SDK 10.0.0\n- [x] Android: Titanium SDK 9.0.0+, [Ti.PlayServices](https://github.com/appcelerator-modules/ti.playservices) module\n- [x] Read the [Titanium-Firebase](https://github.com/hansemannn/titanium-firebase#installation) install part if you set up a new project.\n\n\n## Download\n- [x] [Stable release](https://github.com/hansemannn/titanium-firebase-cloud-messaging/releases)\n- [x] [![gitTio](http://hans-knoechel.de/shields/shield-gittio.svg)](http://gitt.io/component/firebase.cloudmessaging)\n\n## iOS notes:\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd style=\"vertical-align:top;\"\u003e\n\u003cimg src=\"example/ios_push1.jpg\"/\u003e\n\u003c/td\u003e\n\u003ctd style=\"vertical-align:top;\"\u003e\n\u003cimg src=\"example/ios_push2.jpg\"/\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\nTo register for push notifications on iOS, you only need to call the Titanium related methods as the following:\n```js\n// Listen to the notification settings event\nTi.App.iOS.addEventListener('usernotificationsettings', function eventUserNotificationSettings() {\n  // Remove the event again to prevent duplicate calls through the Firebase API\n  Ti.App.iOS.removeEventListener('usernotificationsettings', eventUserNotificationSettings);\n\n  // Register for push notifications\n  Ti.Network.registerForPushNotifications({\n    success: function () { ... },\n    error: function () { ... },\n    callback: function () { ... } // Fired for all kind of notifications (foreground, background \u0026 closed)\n  });\n});\n\n// Register for the notification settings event\nTi.App.iOS.registerUserNotificationSettings({\n  types: [\n    Ti.App.iOS.USER_NOTIFICATION_TYPE_ALERT,\n    Ti.App.iOS.USER_NOTIFICATION_TYPE_SOUND,\n    Ti.App.iOS.USER_NOTIFICATION_TYPE_BADGE\n  ]\n});\n```\n\n## Android Notes:\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd style=\"vertical-align:top;\"\u003e\n\u003cimg src=\"example/android_big_image.png\" valign=\"top\"/\u003e\n\u003c/td\u003e\n\u003ctd style=\"vertical-align:top;\"\u003e\n\u003cimg src=\"example/android_big_text.png\"/\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\nBig image notification with colored icon/appname\n\u003c/td\u003e\n\u003ctd\u003e\nBig text notification with colored icon/appname\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n### Register for push\n\nIf you use Titanium 12.0.0+ you can use\n```js\nTi.Network.registerForPushNotifications({\n  success: function () { ... },\n  error: function () { ... }\n});\n```\n\nto request Android 13 runtime permissions. All other version \u003c Android 13 will call the `success` function right away.\n\nIf you have runtime permissions (the `success` event mentioned above or `Ti.Network.remoteNotificationsEnabled` is true) you can call `fcm.registerForPushNotifications()` to request a token. Check the full example below for all steps.\n\n### Android 13 permission\nIf you use **Titanium \u003e=12.0.0** (target SDK 33) you can use `Ti.Network.registerForPushNotifications()` to ask for the permission.\nYou can also request the permission with older SDKs yourself by using the general `requestPermissions()` method:\n```js\nvar permissions = ['android.permission.POST_NOTIFICATIONS'];\nTi.Android.requestPermissions(permissions, function(e) {\n  if (e.success) {\n    Ti.API.info('SUCCESS');\n  } else {\n    Ti.API.info('ERROR: ' + e.error);\n});\n```\n\n### Setting the Notification Icon\n\nFor a `data notification` you have to place a notification icon \"notificationicon.png\" into the following folder:\n `[application_name]/[app*]/platform/android/res/drawable/`\n or\n `[application_name]/[app*]/platform/android/res/drawable-*` (if you use custom dpi folders)\n\n\u003csmall\u003e**\\*** = Alloy\u003c/small\u003e\n\nTo use the custom icon for a `notification message` you need to add this attribute within the `\u003capplication/\u003e` section of your `tiapp.xml`:\n\n```xml\n\u003cmeta-data android:name=\"com.google.firebase.messaging.default_notification_icon\" android:resource=\"@drawable/notificationicon\"/\u003e\n```\n\nOtherwise the default icon will be used.\n\nIt should be flat (no gradients), white and face-on perspective and have a transparent background. The icon will only show the outline/shape of your icon so make sure all you e.g. white is transparent otherwise it will just be a square.\n\n\u003e **Note**: You should generate the icon for all resolutions.\n\n```\n22 × 22 area in 24 × 24 (mdpi)\n33 × 33 area in 36 × 36 (hdpi)\n44 × 44 area in 48 × 48 (xhdpi)\n66 × 66 area in 72 × 72 (xxhdpi)\n88 × 88 area in 96 × 96 (xxxhdpi)\n```\n\nYou can use this script to generate it **once you put** the icon in `drawable-xxxhdpi/notificationicon.png` and have\nImage Magick installed. On macOS, you can install it using `brew install imagemagick`, on Windows you can download it [here](https://imagemagick.org/script/download.php).\n\n```sh\n#!/bin/sh\n\nICON_SOURCE=\"app/platform/android/res/drawable-xxxhdpi/notificationicon.png\"\nif [ -f \"$ICON_SOURCE\" ]; then\n    mkdir -p \"app/platform/android/res/drawable-xxhdpi\"\n    mkdir -p \"app/platform/android/res/drawable-xhdpi\"\n    mkdir -p \"app/platform/android/res/drawable-hdpi\"\n    mkdir -p \"app/platform/android/res/drawable-mdpi\"\n    convert \"$ICON_SOURCE\" -resize 72x72 \"app/platform/android/res/drawable-xxhdpi/notificationicon.png\"\n    convert \"$ICON_SOURCE\" -resize 48x48 \"app/platform/android/res/drawable-xhdpi/notificationicon.png\"\n    convert \"$ICON_SOURCE\" -resize 36x36 \"app/platform/android/res/drawable-hdpi/notificationicon.png\"\n    convert \"$ICON_SOURCE\" -resize 24x24 \"app/platform/android/res/drawable-mdpi/notificationicon.png\"\nelse\n    echo \"No 'notificationicon.png' file found in app/platform/android/res/drawable-xxxhdpi\"\nfi\n```\n\n### Data / Notification messages\n\nOn Android there are two different messages that the phone can process: `Notification messages` and `Data messages`. A `Notification message` is processed by the system, the `Data message` is handeled by `showNotification()` in `TiFirebaseMessagingService`. Using the `notification` block inside the POSTFIELDS will send a `Notification message`.\n\nSupported data fields:\n* \"title\" =\u003e \"string\"\n* \"message\" =\u003e \"string\"\n* \"big_text\" =\u003e \"string\"\n* \"big_text_summary\" =\u003e \"string\"\n* \"icon\" =\u003e \"Remote URL\"\n* \"image\" =\u003e \"Remote URL\"\n* \"rounded_large_icon\" =\u003e \"Boolean\" (to display the largeIcon as a rounded image when the icon field is present)\n* \"force_show_in_foreground\" =\u003e \"Boolean\" (show notification even app is in foreground)\n* \"id\" =\u003e \"int\"\n* \"color\" =\u003e will tint the app name and the small icon next to it\n* \"vibrate\" =\u003e \"boolean\"\n* \"sound\" =\u003e \"string\" (e.g. \"notification.mp3\" will play /platform/android/res/raw/notification.mp3)\n* \"badge\" =\u003e \"int\" (if supported by the phone it will show a badge with this number)\n\nSupported notification fields:\n* \"title\" =\u003e \"string\"\n* \"body\" =\u003e \"string\"\n* \"color\" =\u003e \"#00ff00\",\n* \"tag\" =\u003e \"custom_notification_tag\",   // push with the same tag will replace each other\n* \"sound\" =\u003e \"string\" (e.g. \"notification.mp3\" will play /platform/android/res/raw/notification.mp3)\n\n### Android: Note about custom sounds\nTo use a custom sound you have to create a second channel. The default channel will always use the default notification sound on the device!\nIf you send a normal or mixed notification you have to set the `android_channel_id` in the `notification` node. If you send a data notification the key is called `channelId`. Chech \u003ca href=\"#extended-php-android-example\"\u003eextended PHP Android example\u003c/a\u003e for a PHP example.\n\n#### Android: Note for switching between v\u003c=v2.0.2 and \u003e=v2.0.3 if you use notification channels with custom sounds\nWith versions prior to 2.0.3 of this module, FirebaseCloudMessaging.createNotificationChannel would create the notification sound uri using the resource id of the sound file in the `res/raw` directory. However, as described in this [android issue](https://issuetracker.google.com/issues/131303134), those resource ids can change to reference different files (or no file) between app versions, and  that happens the notification channel may play a different or no sound than originally intended.\nWith version 2.0.3 and later, we now create the uri's using the string filename so that it will not change if resource ids change. So if you are on version \u003c=2.0.2 and are switching to version \u003e=2.0.3, you will want to check if this is a problem for you by installing a test app using version \u003e= 2.0.3 as an upgrade to a previous test app using version \u003c= 2.0.2. Note that you should not uninstall the first app before installing the second app; nor should you reset user data.\nIf it is a problem you can workaround by first deleting the existing channel using deleteNotificationChannel, and then recreating the channel with the same settings as before, except with a different id. Don't forget that your push server will need to be version aware and send to this new channel for newer versions of your apps.\n\n### Errors with firebase.analytics\n\nIf you run into errors in combination with firebase.analytics e.g. `Error: Attempt to invoke virtual method 'getInstanceId()' on a null object reference` you can add:\n\n```xml\n\u003cservice android:name=\"com.google.firebase.components.ComponentDiscoveryService\" \u003e\n\t\u003cmeta-data android:name=\"com.google.firebase.components:com.google.firebase.iid.Registrar\"\n\t\tandroid:value=\"com.google.firebase.components.ComponentRegistrar\" /\u003e\n\u003c/service\u003e\n```\nto the tiapp.xml\n\n## API\n\n### `FirebaseCloudMessaging`\n\n#### Methods\n\n`registerForPushNotifications()`\n\n`appDidReceiveMessage(parameters)` (iOS only)\n  - `parameters` (Object)\n\nNote: Only call this method if method swizzling is disabled (enabled by default). Messages are received via the native delegates instead,\nso receive the `gcm.message_id` key from the notification payload instead.\n\n`sendMessage(parameters)`\n  - `parameters` (Object)\n    - `messageID` (String)\n    - `to` (String)\n    - `timeToLive` (Number)\n    - `data` (Object)\n\n`subscribeToTopic(topic)`\n  - `topic` (String)\n\n`unsubscribeFromTopic(topic)`\n  - `topic` (String)\n\n`setNotificationChannel(channel)` - Android-only\n  - `channel` (NotificationChannel Object) Use `Ti.Android.NotificationManager.createNotificationChannel()` to create the channel and pass it to the function. See [Titanium.Android.NotificationChannel](https://docs.appcelerator.com/platform/latest/#!/api/Titanium.Android.NotificationChannel)\n\n  _Prefered way_ to set a channel. As an alternative you can use `createNotificationChannel()`\n\n`createNotificationChannel(parameters)` - Android-only\n\n- `parameters` (Object)\n  - `sound` (String) optional, refers to a sound file (without extension) at `platform/android/res/raw`. If sound == \"default\" or not passed in, will use the default sound. If sound == \"silent\" the channel will have no sound\n  - `channelId` (String) optional, defaults to \"default\"\n  - `channelName` (String) optional, defaults to `channelId`\n  - `importance` (String) optional, either \"low\", \"high\", \"default\". Defaults to \"default\", unless sound == \"silent\", then defaults to \"low\".\n  - `lights` (Boolean) optional, defaults to `false`\n  - `showBadge` (Boolean) optional, defaults to `false`\n\n  Read more in the [official Android docs](https://developer.android.com/reference/android/app/NotificationChannel).\n\n`deleteNotificationChannel(channelId)` - Android-only\n  - `channelId` (String) - same as the id used to create in createNotificationChannel\n\n`setForceShowInForeground(showInForeground)` - Android-only\n  - `showInForeground` (Boolean) Force the notifications to be shown in foreground.\n\n`clearLastData()` - Android-only\n  - Will empty the stored lastData values.\n\n`getToken()` - Android-only\n  - Returns the current FCM token.\n\n`deleteToken()` - Android-only\n  - Removes the current FCM token.\n\n\n\n#### Properties\n\n`shouldEstablishDirectChannel` (Number, get/set)\n\n`fcmToken` (String, get)\n\n`apnsToken` (String, set) (iOS only)\n\n`lastData` (Object) (Android only)\nThe propery `lastData` will contain the data part when you send a notification push message (so both nodes are visible inside the push payload). Read before calling `registerForPushNotifications()`.\n\n#### Events\n\n`didReceiveMessage`\n  - `message` (Object)\n\n\tiOS Note: This method is only called on iOS 10+ and only for direct messages sent by Firebase. Normal Firebase push notifications\n\tare still delivered via the Titanium notification events, e.g.\n\t```js\n\tTi.App.iOS.addEventListener('notification', function(event) {\n\t  // Handle foreground notification\n\t});\n\n\tTi.App.iOS.addEventListener('remotenotificationaction', function(event) {\n\t  // Handle background notification action click\n\t});\n\t```\n\n`didRefreshRegistrationToken`\n  - `fcmToken` (String)\n\n`success` (Android only)\n  - will fire on Android 13 after you call `registerForPushNotifications` to allow Push notifications\n\n`error` (Android only)\n  - `error` (String): Error during token registration or user denied `registerForPushNotifications`\n\n`subscribe` (Android only)\n  - `success` (Boolean): Successfully subscribed\n\n`unsubscribe` (Android only)\n  - `success` (Boolean): Successfully unsubscribed\n\n`tokenRemoved` (Android only)\n  - `success` (Boolean): Successfully removed token\n\n## Example\n\n```js\nif (OS_IOS) {\n\tconst FirebaseCore = require('firebase.core');\n\tFirebaseCore.configure();\n}\n\n// Important: The cloud messaging module has to imported after (!) the configure()\n// method of the core module is called\nconst FirebaseCloudMessaging = require('firebase.cloudmessaging');\n\n// Called when the Firebase token is registered or refreshed.\nFirebaseCloudMessaging.addEventListener('didRefreshRegistrationToken', onToken);\n\n// Called when direct messages arrive. Note that these are different from push notifications.\nFirebaseCloudMessaging.addEventListener('didReceiveMessage', function(e) {\n\tTi.API.info('Message', e.message);\n});\n\n\nif (OS_ANDROID) {\n\t// Android\n\n\t// create a notification channel\n\tconst channel = Ti.Android.NotificationManager.createNotificationChannel({\n\t\tid: 'default', // if you use a custom id you have to set the same to the `channelId` in you php send script!\n\t\tname: 'Default channel',\n\t\timportance: Ti.Android.IMPORTANCE_DEFAULT,\n\t\tenableLights: true,\n\t\tenableVibration: true,\n\t\tshowBadge: true\n\t});\n\tFirebaseCloudMessaging.notificationChannel = channel;\n\n\t// display last push data if available\n\tTi.API.info(`Last data: ${FirebaseCloudMessaging.lastData}`);\n\n\t// request push permission\n\trequestPushPermissions();\n} else {\n\t// iOS\n\t// Listen to the notification settings event\n\tTi.App.iOS.addEventListener('usernotificationsettings', function eventUserNotificationSettings() {\n\t\t// Remove the event again to prevent duplicate calls through the Firebase API\n\t\tTi.App.iOS.removeEventListener('usernotificationsettings', eventUserNotificationSettings);\n\t\trequestPushPermissions();\n\t});\n\n\t// Register for the notification settings event\n\tTi.App.iOS.registerUserNotificationSettings({\n\t\ttypes: [\n\t\t\tTi.App.iOS.USER_NOTIFICATION_TYPE_ALERT,\n\t\t\tTi.App.iOS.USER_NOTIFICATION_TYPE_SOUND,\n\t\t\tTi.App.iOS.USER_NOTIFICATION_TYPE_BADGE\n\t\t]\n\t});\n}\n\nfunction requestPushPermissions() {\n\t// Register for push notifications\n\tTi.Network.registerForPushNotifications({\n\t\tsuccess: function(e) {\n\t\t\t// Register the device with the FCM service.\n\t\t\tif (OS_ANDROID) {\n\t\t\t\t// register for a token\n\t\t\t\tFirebaseCloudMessaging.registerForPushNotifications();\n\t\t\t} else {\n\t\t\t\t// iOS\n\t\t\t\tonToken(e);\n\t\t\t}\n\t\t},\n\t\terror: function(e) {\n\t\t\tTi.API.error(e);\n\t\t},\n\t\tcallback: function(e) {\n\t\t\t// Fired for all kind of notifications (foreground, background \u0026 closed)\n\t\t\tTi.API.info(e.data);\n\t\t}\n\t});\n}\n\nfunction onToken(e) {\n\t// new device is registered\n\n\tif (OS_ANDROID) {\n\t\tTi.API.info(\"New token\", e.fcmToken);\n\t} else {\n\t\tif (FirebaseCloudMessaging != null) {\n\t\t\tTi.API.info(\"New token\", FirebaseCloudMessaging.fcmToken);\n\t\t}\n\t}\n}\n\n// Check if token is already available.\nif (FirebaseCloudMessaging.fcmToken) {\n\tTi.API.info('FCM-Token', FirebaseCloudMessaging.fcmToken);\n} else {\n\tTi.API.info('Token is empty. Waiting for the token callback ...');\n}\n\n// Subscribe to a topic.\nFirebaseCloudMessaging.subscribeToTopic('testTopic');\n```\n### Android intent data\n\nExample to get the the resume data/notification click data on Android:\n\n```javascript\nconst handleNotificationData = (notifObj) =\u003e {\n\tif (notifObj) {\n\t\tnotifData = JSON.parse(notifObj);\n\t\t// ...process notification data...\n\t\tFirebaseCloudMessaging.clearLastData();\n\t}\n}\n\n// Check if app was launched on notification click\nconst launchIntent = Ti.Android.rootActivity.intent;\nhandleNotificationData(launchIntent.getStringExtra(\"fcm_data\"));\n\nTi.App.addEventListener('resumed', function() {\n\t// App was resumed from background on notification click\n\tconst currIntent = Titanium.Android.currentActivity.intent;\n\tconst notifData = currIntent.getStringExtra(\"fcm_data\");\n\thandleNotificationData(notifData);\n});\n```\n\n## Sending push messages\n\nCheck https://firebase.google.com/docs/cloud-messaging/server or frameworks like https://github.com/kreait/firebase-php/\n\n## Parse\n\nYou can use Parse with this module: https://github.com/timanrebel/Parse/pull/59 in combination with Firebase. You include and configure both modules and send your deviceToken to the Parse backend.\n\nIf you send a push over e.g. \u003ca href=\"https://sashido.io\"\u003eSashido\u003c/a\u003e you can either send a normal text or a json with:\n```json\n{\"alert\":\"test from sashido\", \"text\":\"test\"}\n```\nWith the JSON you can set a title/alert and the text of the notification.\n\n## Build\n\n### iOS\n\n```bash\ncd ios\nti build -p ios --build-only\n```\n\n### Android\n\n```bash\ncd android\nti build -p android --build-only\n```\n\n## Legal\n\n(c) 2017-Present by Hans Knöchel \u0026 Michael Gangolf\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhansemannn%2Ftitanium-firebase-cloud-messaging","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhansemannn%2Ftitanium-firebase-cloud-messaging","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhansemannn%2Ftitanium-firebase-cloud-messaging/lists"}