[PYTHON] Senden Sie Push-Benachrichtigungen von iOS-Apps über Firebase Cloud Messaging

Einführung

Ich frage mich, ob es möglich ist, mit einer App, die ich persönlich entwickle, einen Chat-ähnlichen Mechanismus (Server Story) zu erstellen und Push-Benachrichtigungen an bestimmte Benutzer und Themen zu senden, wenn Daten zur Firebase-Datenbank hinzugefügt werden. Ich versuchte es.

Die ursprüngliche Geschichte lautet Push-Benachrichtigungen vom iOS-Client in Firebase senden.

Ich habe es in Python gemacht, weil Node.js es nicht kann (Implementierung bereitstellen).

Umgebung

Vorbereitung auf der iOS-Seite

Push-Benachrichtigungsvorbereitung

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) {
    //APNS-Registrierung
    #if DEBUG
    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: .sandbox)
    #else
    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: .prod)
    #endif
}

func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) {
    //Melden Sie sich für ein Thema an
    FIRMessaging.messaging().subscribe(toTopic: "/topics/news")
}

Machen Sie einen Hoge für spätere Push-Benachrichtigungen!

Fügen Sie Daten zur Firebase-Datenbank hinzu

Hoge.swift


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

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

DAS Verschiedenes, aber es ist so

Code zur Überwachung der Firebase-Datenbank

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.plist API_KEY
    "apiKey": "API_KEY",
    "authDomain": "PROJECT_NAME",
    "databaseURL": "https://PROJECT_NAME.firebaseio.com/",
    #Wird möglicherweise nicht benötigt
    "storageBucket": "gs://PROJECT_NAME.appspot.com"
}

fcm_header = {
    'Content-type': 'application/json; charset=UTF-8',
    #Siehe das Bild unter diesem 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 = 'Lieferung'

    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)

API_KEY-Speicherort

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

(Bitte schützen Sie Ihre Privatsphäre !!)

Beschreibung des Überwachungscodes

Ich habe "Pyrebase" und "Python-Daemon" für das Python-Paket verwendet.

$ pip install pyrebase python-daemon

Ich werde mir das Verzeichnis / message der Firebase-Datenbank ansehen.

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

Dies ist eine Ausnahmebehandlung, da ein Fehler aufgetreten ist (?), Wenn in / message keine Daten vorhanden waren. Obwohl beim Starten des Überwachungscodes eine Push-Benachrichtigung gesendet wird, kommt die Benachrichtigung auf die iOS-Seite, aber die Warnung wird nicht angezeigt! Ich habe es reingelegt, weil es so etwas gab.

Sie müssen lediglich das Skript auf der Serverseite ausführen. Übrigens macht die Verwendung von "Python-Daemon" das Skript zu einem Daemon! Vielen Dank!

$ python app.py

Ausführungsbeispiel

Beispiel für eine Firebase-Datenbank

Firebase Databaseサンプル

Benachrichtigungsergebnis

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

Recommended Posts

Senden Sie Push-Benachrichtigungen von iOS-Apps über Firebase Cloud Messaging
Implementierte iOS-Push-Benachrichtigungen in Firebase
Senden Sie Push-Benachrichtigungen mit Python an iOS-Apps
Senden Sie mithilfe von Google Cloud Messaging für Chrome eine Nachricht vom Server an die Chrome-Erweiterung
Senden Sie Push-Benachrichtigungen mit Python2 an iOS-Apps (mit Beispielcode).