iOS 实现App 和 Extension扩展的数据交互

[TOC]

​ 昨天新增了一个任务,让App在接收到通知后上传记录以达到通知送达统计的功能,其实大部分推送都是可以从他们的控制台看到通知送达率这个信息点的。是不会用,还是碍于市场部没有权限查看,好吧,废话有点多,那我们考试考虑一下,该如何实现。(由于公司业务需求,推送选择的是Firebase的Cloud Messaging)

WX20200109-110730.png

​ 自iOS 10 之后Apple推行新特性 UNNotificationServiceExtension,这里就不过多说了,不熟悉的可以查看WWDC2016相关文章。

​ 然后我们思考一下常用数据存储的几种方式:

  • write直接写入文件的方法
  • NSUserDefault方法
  • 归档方法
  • Sqlite方法(FMDB)

NSUserDefault 无疑是大家用的最多的方式之一,我也是如此。那么问题就来了,也是此次写这篇文章的目的。

以下是我部分代码:

extension AppDelegate : MessagingDelegate {

    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {

        let token = Messaging.messaging().fcmToken

        NSLog("FCM token: (token ?? "")")

        UserManager.shared.firebase_device = token!
        
        UserPreference.setValueForKey(UserManager.shared.firebase_device, forKey: firebase_token)

    }

}
private func sendBackData(){
    if let token = UserDefaults.standard.value(forKey: "firebase_token") {
        print("\(token as? String)")
    }
}

使用的UserDefaults 去做存储Firebase生成的token,当我去serviceExtension去取值时候你会发现

控制台打印的是个nil,值得思考的是firebaseToken确实是存储了,为什么我在扩展里取不到

思考会不会是App Target 与 Extension Target相互独立存在的关系,所持有的路径并不是一致的。

Google一番知道了App Groups这么个东西,很显然我并没有接触过它,去吸收它!

常见使用场景1:APP之间数据共享(如账号登录)

常见使用场景2:容器APP与扩展应用之间资源共享(如:iMessage、keyboard等)

App Group

AppGroup allows data sharing between two different apps or even app and widgets by creating one common shared path (like document directory). Data saved over there can be accessed by any app which is associated with that particular AppGroup. It is an offline data sharing between apps.

这是Apple给我们的说明,正好使用场景2的情况

配置APP Groups

  1. 在App的所需要数据共享的Target下添加 App Groups

    add App Group 1.png
add App Group 2.png

并且从扩展目标中添加App Groups。

add App Group 3.png
add App Group 2.png

添加完成之后将在项目中生成一个xxx.entitlements文件


add App Group 4.png

App Group的使用

App Groups支持的常用数据共享包括NSUserDefaults、NSFileManager、NSFileCoordinator、NSFilePresenter、UIPasteboard、KeyChain、NSURLSession等。
下边以NSUserDefaults为例:

生成数据部分

extension AppDelegate : MessagingDelegate {
    // [START refresh_token]
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
        NSLog("Firebase registration token: \(fcmToken)")
        
        let token = Messaging.messaging().fcmToken
        NSLog("FCM token: \(token ?? "")")
        UserManager.shared.firebase_device = token!
        let defaults = UserDefaults(suiteName: "group.urwork.firebasetoken")
        defaults?.set(UserManager.shared.firebase_device, forKey: "token")
        defaults?.synchronize()
    }
}

获取共享数据部分

private func sendBackData(){
    let defaults = UserDefaults(suiteName: "group.urwork.firebasetoken")
    if (defaults?.object(forKey: "token") != nil) {
        let firebase_token = defaults?.value(forKey: "token") as! String
        param["deviceNo"] = firebase_token
    }
}

至此完美解决这个需求。

参考链接:

Notification Service Extension

iOS开发系列--App扩展开发

官方文档

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容