iOS 응용 프로그램에서 Firebase Cloud Messaging을 통해 푸시 알림 보내기

입문


현재 개인이 개발한 응용 프로그램에서 채팅 같은 구조(서버라면)를 만들었고, Firebase 데이터베이스에 데이터를 추가하면 지정한 사용자와 테마에 푸시 알림을 보낼 수 없다.
원단자Firebase에서 iOS 클라이언트로부터 푸시 알림 보내기.
노드입니다.js는 (배치가 이루어질 수 없기 때문에) Python입니다.

환경

  • Python3.5.2
  • Xcode8.2.1
  • iOS10.2
  • iOS 측 준비


    푸시 알림 준비


    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登録
        #if DEBUG
        FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: .sandbox)
        #else
        FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: .prod)
        #endif
    }
    
    func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) {
        // トピックに登録
        FIRMessaging.messaging().subscribe(toTopic: "/topics/news")
    }
    
    앞으로의 푸시 알림을 위해서 미리 호지!

    Firebase 데이터베이스에 데이터 추가


    Hoge.swift
    class Hoge: NSObject {
        class func create() {
            let ref = FIRDatabase.database().reference()
    
            let data: [String : String] = ["title": "タイトル", "body": "本文"]
            ref("message").childByAutoId().setValue(data, withCompletionBlock: { (error, reference) in
                if error != nil {
                    print("Success")
                } else {
                    print("Failure")
                }
            }
        }
    }
    
    더잡이지만 그렇겠지

    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.plistのAPI_KEY
        "apiKey": "API_KEY",
        "authDomain": "PROJECT_NAME",
        "databaseURL": "https://PROJECT_NAME.firebaseio.com/",
        # いらないかもしれない
        "storageBucket": "gs://PROJECT_NAME.appspot.com"
    }
    
    fcm_header = {
        'Content-type': 'application/json; charset=UTF-8',
        # このコードの下の画像を参照してください!
        '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 = '配信'
    
        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 장소.



    (프라이버시를 지켜주세요!)

    코드 설명 모니터링


    파이썬 패키지는 Pyrebasepython-daemon 을 사용합니다.
    $ pip install pyrebase python-daemon
    
  • Pyrebase
  • python-daemon
  • Firebase 데이터베이스의 /message 디렉터리를 보러 갑니다.
    if message['data'] == None:
        return
    if message['path'] == '/':
        return
    
    이 일대에서 /message 데이터가 없을 때 오류가 발생했습니다 (?)의 명세란 스타일에 정의된 설정입니다.모니터링 코드가 시작될 때 푸시 알림을 보내고 iOS 측에서 알림을 받았지만 경보가 표시되지 않았습니다!이런 일이 있어서 넣었어요.
    그리고 서버에서 스크립트만 실행하면 됩니다.
    참고로 python-daemon 를 사용하여 스크립트를 지켜라!정말 감사합니다.
    $ python app.py
    

    실행 예


    Firebase Database 예제



    알림 결과


    좋은 웹페이지 즐겨찾기