AppleWatch沙盒共享文件及它的一些特殊情况

我们在做AppleWatch开发的时候难免碰到,watch和iPhone都需要使用同一张图片和数据等信息,而且watch和iPhone的沙盒是完全分开的,不能访问另一个沙盒存储的数据,所以在watch1.0的时候就有了AppGroups这个概念,AppGroups就是在苹果的服务器上配置一个共享文件夹的权限来让我的iPhone沙盒和Extension沙盒进行数据共享。他的本质上可以理解为重新生成一个沙盒使得以上两个沙盒之间都有权限来访问AppGroups沙盒里面的数据,一方存储了数据就都可以使用,这里证书的配置就不详细述说了,具体步骤百度还是可以找到的,本文将叙述一些其他开发者没有讲述到的问题,讲述的是watch2.0开发时为什么不能和1.0之前一样获取到共享数据呢?

配置完appGroups后...

首先讲一下1.0数据的共享
Watch1.0开发,全程值使用NSFileManager.defaultManager()单例来管理文件的读、写。
iPhone端:(写入图片)

        //1.获取图片的路径
        let imagePath = NSBundle.mainBundle().pathForResource("appgroups", ofType: "png")
        
        //2.把图片转成二进制
        let imageData = NSData(contentsOfFile: imagePath!)
        
        //3.获取共享文件夹的路径
        let groupPath = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.com.heima")?.path
        
        //4.拼接图片的路径
        let path = groupPath! + "/appgroups.png"
        
        //5.将图片数据写入到共享文件夹
        NSFileManager.defaultManager().createFileAtPath(path, contents: imageData, attributes: nil)

Watch端(读取图片)

//第一种方式 NSFileManager
        //1.获取appgroups路径
        let groupsPath = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.com.heima")?.path   注:该id为appGroup生成文件

        //2.拼接图片路径
        let imagePath = groupsPath! + "/appgroups.png" 注:拼接字符串为图片名
        //3.获取appgroups路径中的二进制文件
        let data = NSData(contentsOfFile: imagePath)
        //4.设置图片
        image.setImageData(data)

打印路径可发现,读取数据完全正常!

Watch2.0开发
1、首先在手机端存储数据:

//1.获取图片的路径
        let imagePath = NSBundle.mainBundle().pathForResource("appgroups", ofType: "png")
        
        //2.把图片转成二进制
        let imageData = NSData(contentsOfFile: imagePath!)
        
        //3.获取共享文件夹的路径
        let groupPath = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.com.heima")?.path
        
        //4.拼接图片的路径
        let path = groupPath! + "/appgroups.png"
        print(path)
        //5.将图片数据写入到共享文件夹
        NSFileManager.defaultManager().createFileAtPath(path, contents: imageData, attributes: nil)

2、在AppleWatch中读取手机端存储的数据

        //1.获取appgroups路径
        let groupsPath = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.com.heima")?.path
        //2.拼接图片路径
        let imagePath = groupsPath! + "/appgroups.png"
        print(imagePath)
        //3.获取appgroups路径中的二进制文件
        let data = NSData(contentsOfFile: imagePath)
        //4.设置图片
        image.setImageData(data)

//打印以上存储和读取的路径

1、///Users/apple/Library/Developer/CoreSimulator/Devices/645C8002-9BF1-4ED9-8435-4EDA16C4846E/data/Containers/Shared/AppGroup/BD379CDD-FB1D-44CC-9377-06EB4C7E7B8F/appgroups.png
2、///Users/apple/Library/Developer/CoreSimulator/Devices/467BE9CB-3468-42D3-BE72-13519B772993/data/Containers/Shared/AppGroup/CD2D9904-14F7-4510-8DB0-C5A8FBE3270A/appgroups.png

可以发现2种方式,模拟器路径并不相同,为什么呢?
官方并没有给出明确的答复
但是通过分析:我们可以得出1、为什么不相同,因为Watch2.0之后iPhone和watch分开独立运行了,不和以前一样只能在iPhone连接的情况下,才能运行app,所以现在分开后,模拟器运行的路径不一样就可以理解了。
2、哪要拿到数据怎么办呢?
假如数据在iPhone的代码当中,可以通过传值的方式来给watch传值,而且只要一行代码,不是更方便?所以以上苹果的做法也就可以理解了!!

以上纯属个人分享!现国内关于AppleWatch的资料还太少,许多问题都没能得到解决,希望各开发者能够将自己好的想法分享出来,不单单是Watch开发,共同营造一个良好的开发环境,虽然也有压力,但是还是希望大家克服压力,尽一份自己的力量。

你可能感兴趣的:(AppleWatch沙盒共享文件及它的一些特殊情况)