[PYTHON] Envoyez des notifications push depuis les applications iOS via Firebase Cloud Messaging

introduction

Je me demande s'il est possible de créer un mécanisme de type chat (histoire du serveur) avec une application que je développe personnellement et de fournir des notifications push aux utilisateurs et sujets spécifiques lorsque des données sont ajoutées à la base de données Firebase. Je l'ai essayé.

L'histoire originale est Envoyer des notifications push du client iOS dans Firebase.

Je l'ai fait en Python car Node.js ne peut pas (déployer l'implémentation).

environnement

--Python 3.5.2 (j'ai oublié de mettre 3.6)

Préparation côté iOS

Préparez-vous à la notification push

AppDelegate.swift


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    let settings = UIUserNotificationSettings(types: [.alert, .badge, .sound],
                                                  categories: nil)
    application.registerUserNotificationSettings(settings)
    application.registerForRemoteNotifications()
}

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    //Enregistrement APNS
    #if DEBUG
    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: .sandbox)
    #else
    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: .prod)
    #endif
}

func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) {
    //Inscrivez-vous à un sujet
    FIRMessaging.messaging().subscribe(toTopic: "/topics/news")
}

Faites une hoge pour les notifications push ultérieures!

Ajouter des données à la base de données Firebase

Hoge.swift


class Hoge: NSObject {
    class func create() {
        let ref = FIRDatabase.database().reference()

        let data: [String : String] = ["title": "Titre", "body": "Texte"]
        ref("message").childByAutoId().setValue(data, withCompletionBlock: { (error, reference) in
            if error != nil {
                print("Success")
            } else {
                print("Failure")
            }
        }
    }
}

LE divers, mais c'est comme ça

Code pour surveiller la base de données Firebase

requirements.txt


docutils==0.13.1
gcloud==0.17.0
googleapis-common-protos==1.5.0
httplib2==0.9.2
jws==0.1.3
lockfile==0.12.2
oauth2client==3.0.0
protobuf==3.2.0rc1
pyasn1==0.1.9
pyasn1-modules==0.0.8
pycryptodome==3.4.3
Pyrebase==3.0.27
python-daemon==2.1.2
python-jwt==2.0.1
requests==2.11.1
requests-toolbelt==0.7.0
rsa==3.4.2
six==1.10.0

app.py


import daemon
import json
import pyrebase
import requests

config = {
    # GoogleService-info.API plist_KEY
    "apiKey": "API_KEY",
    "authDomain": "PROJECT_NAME",
    "databaseURL": "https://PROJECT_NAME.firebaseio.com/",
    #Peut ne pas être nécessaire
    "storageBucket": "gs://PROJECT_NAME.appspot.com"
}

fcm_header = {
    'Content-type': 'application/json; charset=UTF-8',
    #Voir l'image ci-dessous ce code!
    'Authorization': 'key=API_KEY'
}

firebase = pyrebase.initialize_app(config)

def stream_handler(message):
    if message['data'] == None:
        return
    if message['path'] == '/':
        return

    if 'title' in message['data']:
        title = message['data']['title']
    else:
        title = 'Livraison'

    if 'body' in message['data']:
        body = message['data']['body']
    else:
        body = ''

    payload = {'to': '/topics/news', 
               'priority': 'high', 
               'notification': {
                   'title': title,
                   'body': body,
                   'badge': 1,
                   'sound': 'default'
               }
              }

    r = requests.post('https://fcm.googleapis.com/fcm/send', headers = fcm_header, data = json.dumps(payload))
    print(r.json())

if __name__ == '__main__':
    db = firebase.database()
    dc = daemon.DaemonContext()
    with dc:
        stream = db.child("message").stream(stream_handler)

Emplacement API_KEY

スクリーンショット_2017-01-18_0_46_34.png

(Veuillez protéger votre vie privée !!)

Description du code de surveillance

J'ai utilisé «Pyrebase» et «python-daemon» pour le paquet Python.

$ pip install pyrebase python-daemon

Je vais regarder le répertoire / message de la base de données Firebase.

if message['data'] == None:
    return
if message['path'] == '/':
    return

Il s'agit d'une gestion d'exception car une erreur s'est produite (?) Lorsqu'il n'y avait aucune donnée dans / message. Même si une notification push est envoyée lorsque le code de surveillance est lancé, la notification arrive du côté iOS, mais l'alerte n'est pas affichée! Je l'ai mis parce qu'il y avait quelque chose comme ça.

Tout ce que vous avez à faire est d'exécuter le script côté serveur. Au fait, utiliser python-daemon fera du script un démon! Merci beaucoup!

$ python app.py

Échantillon d'exécution

Exemple de base de données Firebase

Firebase Databaseサンプル

Résultat de la notification

47ad6b91-a6cd-ff84-c153-f0abd580a820.png

Recommended Posts

Envoyez des notifications push depuis les applications iOS via Firebase Cloud Messaging
Implémentation des notifications push iOS dans Firebase
Envoyer des notifications push aux applications iOS avec Python
Envoyer un message du serveur à l'extension Chrome à l'aide de Google Cloud Messaging pour Chrome
Envoyer des notifications push aux applications iOS avec Python2 (avec un exemple de code)