概述
App Clip与主App 共享数据利用的是App Group功能。(如果你对App Group不了解,可看这篇文章的最后由关于怎么创建App Group的介绍。)
共享数据有利于从App Clip切换到主App良好的用户体验,例如:
- 主App显示用户已经在App Clip输入的数据信息。
- 主App可以使用App Clip已下载的数据。
- 可以不用再次(重复)登录。
App Clip 与主App共享数据方法
将数据存储在共享容器中,App Clip 和主App 都可以访问其中的数据,从而提供良好的用户体验。
要使用存储共享数据,请执行以下操作:
-
在主app和App Clip的target > Signing & Capabilities 点击 “+Capability“添加App Groups功能。
-
对于主App和App Clip,你需要添加相同的App Group Id,例如:group.exampleApp.appClipMigration。(相同的App Group Id,返回相同共享区目录)
15.png -
在你的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,可以看一下。
- 首先进入苹果开发者中心苹果开发者传送门 ,点击下图的App Groups选项:
16.png
点击添加App Group,填写相应信息,点击确认即可
17.png
- 更新自己应用的bundle Id中的App Group配置,选择你的创建的App Group Id,然后更新描述文件下载运行即可。
-
打开你的xcode项目工程,先选中根目录,在target中选中你的工程–>Capabilites,添加App Group id,如下图:
18.png -
代码使用
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);
网友评论