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

我們在做AppleWatch開發(fā)的時候難免碰到,watch和iPhone都需要使用同一張圖片和數據等信息,而且watch和iPhone的沙盒是完全分開的,不能訪問另一個沙盒存儲的數據,所以在watch1.0的時候就有了AppGroups這個概念,AppGroups就是在蘋果的服務器上配置一個共享文件夾的權限來讓我的iPhone沙盒和Extension沙盒進行數據共享。他的本質上可以理解為重新生成一個沙盒使得以上兩個沙盒之間都有權限來訪問AppGroups沙盒里面的數據,一方存儲了數據就都可以使用,這里證書的配置就不詳細述說了,具體步驟百度還是可以找到的,本文將敘述一些其他開發(fā)者沒有講述到的問題,講述的是watch2.0開發(fā)時為什么不能和1.0之前一樣獲取到共享數據呢?

配置完appGroups后...

首先講一下1.0數據的共享
Watch1.0開發(fā),全程值使用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)

打印路徑可發(fā)現(xiàn),讀取數據完全正常!

Watch2.0開發(fā)
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

可以發(fā)現(xiàn)2種方式,模擬器路徑并不相同,為什么呢?
官方并沒有給出明確的答復
但是通過分析:我們可以得出1、為什么不相同,因為Watch2.0之后iPhone和watch分開獨立運行了,不和以前一樣只能在iPhone連接的情況下,才能運行app,所以現(xiàn)在分開后,模擬器運行的路徑不一樣就可以理解了。
2、哪要拿到數據怎么辦呢?
假如數據在iPhone的代碼當中,可以通過傳值的方式來給watch傳值,而且只要一行代碼,不是更方便?所以以上蘋果的做法也就可以理解了?。?/p>

以上純屬個人分享!現(xiàn)國內關于AppleWatch的資料還太少,許多問題都沒能得到解決,希望各開發(fā)者能夠將自己好的想法分享出來,不單單是Watch開發(fā),共同營造一個良好的開發(fā)環(huán)境,雖然也有壓力,但是還是希望大家克服壓力,盡一份自己的力量。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容