美文网首页
App Clip 与主App共享数据

App Clip 与主App共享数据

作者: 烽火连天x | 来源:发表于2020-07-03 16:03 被阅读0次

    概述

    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共享数据

          本文链接:https://www.haomeiwen.com/subject/rtnjqktx.html