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);

你可能感兴趣的:(App Clip 与主App共享数据)