我使用了FCM製作了iOS的推播功能,我想把推播的資訊儲存下來,並且顯示在tableview cells中,想使用CoreData,但不知道要如何把Push Notification的資訊給存到CoreData內,製作推播的code全都在AppDelegtes.swfit中(僅簡單的接收資訊格式的code)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
// 印出後台送出的推播訊息(JSON 格式)
let userInfo = notification.request.content.userInfo //推播訊息
print("userInfo: \(userInfo)")
completionHandler([.badge, .sound, .alert])
}
印出後的推播資訊
userInfo: [AnyHashable("aps"): {
alert = {
body = "推播資訊測試";
title = "2019/5/18 \U4e0b\U5348 01:00:01";
};
小弟尚在學習,不熟悉CoreData的使用方法,謝謝各位高手解答
謝謝你的耐心敘述,我應該會參照可樂大你2017三月多發表的Realm.io資料庫介紹的文章來參考製作資料庫。
但我還想問一個比較淺層的問題,我是第一次處理推播系統的訊息,不像是一般在ViewController裡面就可以抓value出來用,猶如你所說的repository service,不知道推播訊息我該到哪邊抓到資料庫裡面呢?
首先,你有順利的取得了FCM的內容了嗎?
如果有的話,在你取得FCM的地方來存入資料庫是可以的。
但我說的是不要在取得FCM的地方就直接寫存入資料庫的語法。
而是把這方法寫成Repository service的物件來引用操作資料庫。
理由很簡單:你要取出資料的話就從Repository Service直接取出來顯示就好了。不管在任何你可能都會取回資料的地方都會變得比較方便使用。
我有取得FCM內容,但是我的方法只有在AppDelegate.swift裡面print出來,所以我不確定我取出FCM的地方是不是正確的(AppDelegate.swift)。
另外還想請問可樂大,我用POD安裝Realm時出現了錯誤
這是我install後終端機的錯誤訊息
我已經照著終端機提示的內容把兩個xcomfig內容修改了,修改好了重新install問題己經消失了,但是專案中無法import RealmSwift
xcode錯誤訊息為
Could not build Objective-C module 'RealmSwift'
專案夾中這邊也都是紅字,但沒有錯誤訊息
你用cocoapods之後,你開專案是開xcodeproj還是xcworkspace?
xcworkspace,查閱了很多資料,網路上也滿多相同的問題,但各種嘗試依然都無法正常使用
是說你pod中還有一個Realm是???是安裝RealmSwift時一起出現的還是?
還有,通常使用上不會急著安裝最新的版本(你的是3.15.0,也就是3.15的初版,何不先降回3.14的版本試試?)
以上的問題經過一番努力已經修復完成了,目前大概會使用realm的,但是問題還是我不知道該怎麼把推播資訊存到realm中。
這是我接fcm的地方
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
// 印出後台送出的推播訊息(JOSN 格式)
let userInfo = notification.request.content.userInfo //推播訊息
print("userInfo: \(userInfo)")
completionHandler([.badge, .sound, .alert])
}
這是我印出來的推播訊息格式,手機只會收到body跟title,對資料型態不熟,不知道怎麼把它存到realm中
userInfo: [AnyHashable("gcm.message_id"): 0:1559138241391045%2782506e2782506e, AnyHashable("google.c.a.e"): 1, AnyHashable("aps"): {
alert = {
body = "\U54e61";
title = "2019/5/18 \U4e0b\U5348 01:00:01";
};
}]
你要先了解一下Realm的CRUD方式吧。
如果不清楚,我倒是很建議你另開一個專案先練習一下Realm的操作方法。
不過是說,你有操作過其他資料庫的經驗嗎?
我是第一次寫APP,所以之前也沒有操作過APP的資料庫系統。
我已經練習過了,大概知道怎麼存/讀資料,只是我把fcm推播訊息print出來看,並不是一般string、int...等等的結構,所以有點不知道怎麼下手
取回來的東西是JSON轉換成的NSDictionary + NSArray的複合格式吧。
這時又要推薦你一個套件了:SwiftyJSON
好用的操作雲端JSON格式的套件。
稍微理解一下應該不難。
順便推一下假如會用到取得網路資源的話,可以使用Alamofire這個套件。
通常我開Swift專案的話SwiftyJSON和Alamofire跟Realm我都是必裝的。
原來如此,所以我無法直接單純把取回來的東西,把裡面的title、body做存取囉?
一定要透過別個套件轉換格式才能操作囉
沒有不可以啊!如果你清楚知道回傳的格式內容和結構的話當然可以直接使用。
謝謝你提供的資訊,研究了一個週末的資料格式,已經可以正確讀取出推播的json資料並且存於realm中,感謝你
但是還有一件小事請問你,不知道可樂大是否能幫助我,目前推播資訊在AppDelegate底下作動,這是在APP開啟狀況下的推播處理func
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
code.......
...
...
}
這是在APP關閉,點擊橫幅推播作動的func
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
code...
...
...
}
這是網路參考來的,但我還需要一個func,就是在APP關閉OR背景中,不點擊橫幅推播也可以作動的,否則我無法儲存推播資訊。
參考這篇2019 的 CoreData/Swift 教學
1.先完全照範例操作一遍
成功之後
2.再把裡面的 People class 改成你要儲存的內容(兩個 String)
最後
3.在 userNotificationCenter 裡寫儲存的程式(參考範例中 SaveCoreDate)