App Clip 与主App共享数据

概述

App Clip与主App 共享数据利用的是App Group功能。(如果你对App Group不了解,可看这篇文章的最后由关于怎么创建App Group的介绍。)
共享数据有利于从App Clip切换到主App良好的用户体验,例如:

  • 主App显示用户已经在App Clip输入的数据信息。
  • 主App可以使用App Clip已下载的数据。
  • 可以不用再次(重复)登录。

App Clip 与主App共享数据方法

将数据存储在共享容器中,App Clip 和主App 都可以访问其中的数据,从而提供良好的用户体验。
要使用存储共享数据,请执行以下操作:

  1. 在主app和App Clip的target > Signing & Capabilities 点击 “+Capability“添加App Groups功能。

  2. 对于主App和App Clip,你需要添加相同的App Group Id,例如:group.exampleApp.appClipMigration。(相同的App Group Id,返回相同共享区目录)


    15.png
  3. 在你的App Clip 和主App,获取共享区的目录URL方法:containerURL(forSecurityApplicationGroupIdentifier:),然后利用这个目录URL存储数据,调用存储的方法write(to:atomically:encoding:)。读取存储的数据方法可以使用init(contentsOf:)

除了共享容器外,app clip还可以将信息存储在一个共享的UserDefaults实例中,该实例可供主App访问。App Clip使用UserDefaults并存储数据示例代码如下:

guard let sharedUserDefaults = UserDefaults(suiteName: "group.exampleApp.appClipMigration") else {
    // Error handling
}
sharedUserDefaults.set("A sample string", forKey: "sharedText")

在主App中,我们可以再用UserDefaults读取App Clip存的数据示例代码如下:

guard let sharedUserDefaults = UserDefaults(suiteName: "group.exampleApp.appClipDataMigration") else {
    // Error handling
}
guard let migratedData = sharedUserDefaults.string(forKey: "sharedText") else { return }

苹果为了保护用户信息(安全性考虑),App Clip只能和主App进行数据共享。他们不允许我们使用keychain group在App Clip和主App进行数据共享。(我们知道App Group功能,只有统一证书签名和一样的App Group id的应用,可以进行数据共享;这里苹果官方文档说App Clip只能和主App进行数据共享,如果我们做一个和主App证书和App Group id都一样的X应用,那App Clip不就能和X应用共享数据啦。)
Important
不要在App Group或UserDefaults中存储敏感的用户信息,如密码。

提供用Apple登录

你们可以实现App Clip允许用户登录、注册到你们的服务上。如果你的app clip要求用户登录一个帐户,也可以考虑使用 Sign in with Apple登录。它除了提供简单、安全和隐私保护的帐户创建和登录体验外,它还提供了升级到主App的良好体验。
如果你的App Clip使用了Sign in with Apple和数据共享,则安装主应用之后不需要再次登录。示例代码如下:

let groupUserDefaults = UserDefaults(suiteName: "group.com.example.appClipDataMigration")
guard let credential = authorization.credential as ASAuthorizationAppleIDCredential else { return }
groupUserDefaults?.set(credential.user, forKey: "SavedUserID")

在主应用的代码中,检索存储的Apple ID授权认证并使用它登录用户:

let provider = ASAuthorizationAppleIDProvider()
let groupUserDefaults = UserDefaults(suiteName: "group.com.example.appClipDataMigration")
let user = groupUserDefaults?.get("SavedUserID")
provider.getCredentialState(forUserID: user) { state, error in
    if state == .authorized {
        readFavoriteSmoothies(user)
    }
}

创建App Group

如果不了解App Group,可以看一下。

  1. 首先进入苹果开发者中心苹果开发者传送门 ,点击下图的App Groups选项:
    16.png

点击添加App Group,填写相应信息,点击确认即可


17.png
  1. 更新自己应用的bundle Id中的App Group配置,选择你的创建的App Group Id,然后更新描述文件下载运行即可。
  1. 打开你的xcode项目工程,先选中根目录,在target中选中你的工程–>Capabilites,添加App Group id,如下图:


    18.png
  2. 代码使用
    4.1 NSUserDefaults示例:

//初始化一个供App Groups使用的NSUserDefaults对象
NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.company.appGroupName"];
 
//写入数据
[userDefaults setValue:@"value" forKey:@"key"];
 
//读取数据
NSLog(@"%@", [userDefaults valueForKey:@"key"]);

4.2 NSFileManager示例:

//获取分组的共享目录
NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.company.appGroupName"];
NSURL *fileURL = [groupURL URLByAppendingPathComponent:@"demo.txt"];
 
//写入文件
[@"abc" writeToURL:fileURL atomically:YES encoding:NSUTF8StringEncoding error:nil];
 
//读取文件
NSString *str = [NSString stringWithContentsOfURL:fileURL encoding:NSUTF8StringEncoding error:nil];
NSLog(@"str = %@", str);

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