2017-02-09 15 views
2

Firebaseリスナを使用してローカル通知をトリガしようとしています。私はpostを見つけましたが、多くのことで説明しようとしていることを正確に述べていますが、私はその投稿にコメントする評判はなく、どこにいても欲しいものを達成する方法は示されていません。アプリがバックグラウンドのときにFirebaseリスナをメモリに残す

元のポスターはこれを言います。

私はそれを理解しました。私は別のアプローチを使用しなければなりませんでしたが、私は Firebaseデータベースオブザーバを取得して、 背景の通知をトリガすることができました。

データベースオブザーバを含むオブジェクトが がメモリから割り当て解除されない限り、引き続き監視されトリガされます。私は自分のプロジェクトのために何をすべきかのように混乱していますどこ

class GlobalDatabaseDelegate { 
static let dataBase = DataBase() 
} 

これは、次のとおりです。だから私は はこのような静的なデータベースオブジェクト プロパティを含むグローバルなクラスを作成しました。私のデータベース参照を含むDataBase()に似たクラスを作成しなければならないことは私の理解である。問題は、データベースリスナーを含むクラスオブジェクトを作成する方法を理解できないことです。

let userRef = FIRDatabase.database.reference().child("users") 

そして、私はすべてのユーザーがデータベースに追加観察し、その後、ローカル通知をトリガーにしたい:

は、例えば、私の参照があると言います。私はそうするためのコードを書くことができます。それを自分のオブジェクトクラスにどのように組み込んで静的にするのかは分かりません。

少し遅くなったことを私に許してください。どんな助けも非常に高く評価されるでしょう。

ポストの残りの部分は次のとおりです。

extension DataBase: UNUserNotificationCenterDelegate { 

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void) { 
     print("Tapped in notification") 
    } 

    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 
     print("Notification being triggered") 
     completionHandler([.alert,.sound,.badge]) 
    } 

    func observeNotificationsChildAddedBackground() { 
     self.notificationsBackgroundHandler = FIREBASE_REF!.child("notifications/\(Defaults.userUID!)") 
     self.notificationsBackgroundHandler!.queryOrdered(byChild: "date").queryLimited(toLast: 99).observe(.childAdded, with: { snapshot in 
      let newNotificationJSON = snapshot.value as? [String : Any] 
      if let newNotificationJSON = newNotificationJSON { 
       let status = newNotificationJSON["status"] 
       if let status = status as? Int { 
        if status == 1 { 
         self.sendPushNotification() 
        } 
       } 
      } 
     }) 
    } 

    func sendPushNotification() { 
     let content = UNMutableNotificationContent() 
     content.title = "Here is a new notification" 
     content.subtitle = "new notification push" 
     content.body = "Someone did something which triggered a notification" 
     content.sound = UNNotificationSound.default() 

     let request = UNNotificationRequest(identifier: "\(self.notificationBackgroundProcessName)", content: content, trigger: nil) 
     NotificationCenter.default.post(name: notificationBackgroundProcessName, object: nil) 
     UNUserNotificationCenter.current().delegate = self 
     UNUserNotificationCenter.current().add(request){ error in 
      if error != nil { 
       print("error sending a push notification :\(error?.localizedDescription)") 
      } 
     } 
    } 
} 

を本質的に:私もそれはこのよう をプッシュnotiticationsを送ることができるように UNUserNotificationCenterDelegateをするデータベースクラスを拡張し

私は、アプリがバックグラウンドにあるときにfirebaseリスナーをメモリに保持しようとしています。

答えて

2

私がリンクしている元の投稿には答えがありますが、それを理解することです。私は少し異なるアプローチでコードを実装しました。

私は、カスタムデータサービスクラスを実行するために必要なテクニックを詳述した別の記事を見つけました。 Custom Firebase Data Service Class : Swift 3

firebase listenerをメモリ内に保持するように設定するには、いくつかの手順があります。

1.火災基地データサービスクラスを作成します。そのクラスで私は同じクラスの静的変数を持っています

class FirebaseAPI { 
    var isOpen = false 

static let sharedInstance = FirebaseAPI() 

// I added functions for firebase reference in this class 

func observeNotifications(){ 

//firebase call here 
} 

} 

2.アプリケーション代理人の通知設定を設定してください。これは私の設定が元の投稿と異なるところです。

let notificationSettings = UIUserNotificationSettings(types: [.badge, .alert, .sound], categories: nil) 
    UIApplication.shared.registerUserNotificationSettings(notificationSettings) 

3.あなたが選んだビューコントローラーのfirebaseクラスへの参照を作成します。これはアプリケーションデリゲートでは機能しますが、お勧めできません。セットアップ観察者に

let sharedInstance = FirebaseAPI.sharedInstance 

4.Call機能が

self.sharedInstance.observeNotifications() 

あなたは、関数を終了ハンドラを使用して、ローカル通知火災を誘発するか、firebase関数内の通知をオフに解雇することができます。

アップデート:アップルでは、​​この方法の動作を停止させたバックグラウンドモードに関するアップデートを実装しています。現在のところ、唯一の方法はAPNSを使用することです

+0

これはリスナーをメモリに保持しません – Sente

+0

アップル社がこの作業を中止したアップデートがありましたので、私は数日前に同じ問題に遭遇しました。私は今それがもはや働いていることを反映するために投稿を更新しました。 – shektek

+0

それは価値があった。 Firebaseのプッシュ通知を使用する方法を学ばなければならないでしょう。 – Sente

関連する問題