iT邦幫忙

0

ios 使用 Core Data 記錄推播資訊

我使用了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的使用方法,謝謝各位高手解答

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
Samと可樂快跑
iT邦高手 9 級 ‧ 2019-05-28 02:05:39
最佳解答

你可以考慮試試SharkORM,一個簡易使用SQLite的套件。
網址:請點這個
或是使用Realm這套資料庫系統。
網址:請點這個

基本上現在都非常不建議使用CoreData來操作資料庫系統。
原因很單純就兩個字:難用。

另外,不管你用那一套。我的建議上你的model會有兩個。
一個是entity,也就是資料結構設計,包括可能性的資料庫遷移行為。
另一個是repository service,也就是操控資料行為的服務封裝。
你的存取都是透過repository這一隻來控制所有資料的行為。
而不是把控制行為寫在AppDelegate.swift裡頭(即使換成了Objective C也是一樣的概念)

看更多先前的回應...收起先前的回應...
ioesgoddd iT邦新手 5 級 ‧ 2019-05-28 12:54:24 檢舉

謝謝你的耐心敘述,我應該會參照可樂大你2017三月多發表的Realm.io資料庫介紹的文章來參考製作資料庫。
但我還想問一個比較淺層的問題,我是第一次處理推播系統的訊息,不像是一般在ViewController裡面就可以抓value出來用,猶如你所說的repository service,不知道推播訊息我該到哪邊抓到資料庫裡面呢?

首先,你有順利的取得了FCM的內容了嗎?
如果有的話,在你取得FCM的地方來存入資料庫是可以的。
但我說的是不要在取得FCM的地方就直接寫存入資料庫的語法。
而是把這方法寫成Repository service的物件來引用操作資料庫。
理由很簡單:你要取出資料的話就從Repository Service直接取出來顯示就好了。不管在任何你可能都會取回資料的地方都會變得比較方便使用。

ioesgoddd iT邦新手 5 級 ‧ 2019-05-28 20:36:37 檢舉

我有取得FCM內容,但是我的方法只有在AppDelegate.swift裡面print出來,所以我不確定我取出FCM的地方是不是正確的(AppDelegate.swift)。

另外還想請問可樂大,我用POD安裝Realm時出現了錯誤
這是我install後終端機的錯誤訊息
https://ithelp.ithome.com.tw/upload/images/20190528/201178652N3Hi3hErE.png

我已經照著終端機提示的內容把兩個xcomfig內容修改了,修改好了重新install問題己經消失了,但是專案中無法import RealmSwift
xcode錯誤訊息為

Could not build Objective-C module 'RealmSwift'

專案夾中這邊也都是紅字,但沒有錯誤訊息
https://ithelp.ithome.com.tw/upload/images/20190528/20117865xwyu5YapHP.png

你用cocoapods之後,你開專案是開xcodeproj還是xcworkspace?

ioesgoddd iT邦新手 5 級 ‧ 2019-05-28 23:24:45 檢舉

xcworkspace,查閱了很多資料,網路上也滿多相同的問題,但各種嘗試依然都無法正常使用/images/emoticon/emoticon02.gif

是說你pod中還有一個Realm是???是安裝RealmSwift時一起出現的還是?
還有,通常使用上不會急著安裝最新的版本(你的是3.15.0,也就是3.15的初版,何不先降回3.14的版本試試?)

ioesgoddd iT邦新手 5 級 ‧ 2019-05-29 13:58:12 檢舉

以上的問題經過一番努力已經修復完成了,目前大概會使用realm的,但是問題還是我不知道該怎麼把推播資訊存到realm中。

ioesgoddd iT邦新手 5 級 ‧ 2019-05-29 22:00:00 檢舉

這是我接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的操作方法。
不過是說,你有操作過其他資料庫的經驗嗎?

ioesgoddd iT邦新手 5 級 ‧ 2019-05-29 23:29:28 檢舉

我是第一次寫APP,所以之前也沒有操作過APP的資料庫系統。
我已經練習過了,大概知道怎麼存/讀資料,只是我把fcm推播訊息print出來看,並不是一般string、int...等等的結構,所以有點不知道怎麼下手

取回來的東西是JSON轉換成的NSDictionary + NSArray的複合格式吧。
這時又要推薦你一個套件了:SwiftyJSON
好用的操作雲端JSON格式的套件。
稍微理解一下應該不難。
順便推一下假如會用到取得網路資源的話,可以使用Alamofire這個套件。
通常我開Swift專案的話SwiftyJSON和Alamofire跟Realm我都是必裝的。

ioesgoddd iT邦新手 5 級 ‧ 2019-05-30 12:55:03 檢舉

原來如此,所以我無法直接單純把取回來的東西,把裡面的title、body做存取囉?
一定要透過別個套件轉換格式才能操作囉

沒有不可以啊!如果你清楚知道回傳的格式內容和結構的話當然可以直接使用。

ioesgoddd iT邦新手 5 級 ‧ 2019-06-03 13:18:03 檢舉

謝謝你提供的資訊,研究了一個週末的資料格式,已經可以正確讀取出推播的json資料並且存於realm中,感謝你/images/emoticon/emoticon07.gif

但是還有一件小事請問你,不知道可樂大是否能幫助我,目前推播資訊在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背景中,不點擊橫幅推播也可以作動的,否則我無法儲存推播資訊。

1
海綿寶寶
iT邦大神 1 級 ‧ 2019-05-29 09:14:08

參考這篇2019 的 CoreData/Swift 教學
1.先完全照範例操作一遍
成功之後
2.再把裡面的 People class 改成你要儲存的內容(兩個 String)
最後
3.在 userNotificationCenter 裡寫儲存的程式(參考範例中 SaveCoreDate)

https://ithelp.ithome.com.tw/upload/images/20190529/20072133nxYOpoH1Vd.png

事實上願意使用CoreData的在統計中6個人只有1個人願意用。
而且這還不保證這1個願意用的人是否是因為不熟其他的資源所以不得不用。
在我們許多iOS開發者的立場。
你要嘛就是用FMDB(但我覺得還是有點囉唆)
要嘛就是找其他的ORM或是其他的資料庫。
(上圖的調查是在一個有441位成員的line群組中的調查結果,我們可以看到光是Realm就佔了將進一半,如果加上FMDB就高達2/3了,當時我還不知道有SharkORM這好用的東西,不然加上去的話應該又有一票死忠者出現)

結論:完全不建議任何開發者使用CoreData,因為你寫得好大家勉強跟你上天堂,你要是寫不好大家就絕對跟你一起下地獄。

我要發表回答

立即登入回答