天天看點

Xcode6 模拟器路徑【修改】

       【修改】

       在釋出該部落格後幾天,蘋果公司釋出了Xcode6.0.1,在筆者更新了Xcode到6.0.1後,發現,除了在下文中提到的Xcode6模拟器路徑的變更還依舊如部落格所寫之外,應用程式的路徑、Document路徑、Library路徑、tmp路徑,甚至NSUserDafults的路徑,都回到了Xcode6之前,或許是蘋果在釋出Xcode6之後,遭到了開發者的集體吐槽,表示不适應後,進行了更改。

       【原文】

         Xcode6釋出後,出現了很多的變動,功能性的變動,在這裡不進行過多的贅述,在WWDC上蘋果已經進行了講述,網上也有很多文章,這裡要介紹的是一些不太容易發現的,但很重要的小地方。

         1、Xcode6模拟器路徑的變更

          在Xcode5和之前的版本中,Xcode的模拟器路徑為:/Users/username/Library/Application Support/iPhone  Simulator。在該檔案夾下,可以檢視到所有的模拟器版本,點進去後,可檢視應用沙盒情況。

Xcode6 模拟器路徑【修改】

在開發中,建議将檔案拖動快捷路徑到Finder左側個人收藏下,可以友善打開檢視應用沙盒。

        在Xcode6中,将模拟器的位置進行了變更,位址如下:/Users/username/Library/Developer/CoreSimulator,打開後會發現如下情況:

Xcode6 模拟器路徑【修改】

在這裡,蘋果對模拟器進行了編碼處理,并不是以模拟器系統版本進行的命名和分類,而是對Xcode6中所有的模拟器進行的區分,裡面的16個檔案夾分别對應的Xcode6中的16種模拟器

Xcode6 模拟器路徑【修改】
Xcode6 模拟器路徑【修改】

那如何根據這個看似亂碼的檔案夾,判斷出是哪一款模拟器呢?

       選中某個檔案後,打開會看到一個名為data的檔案夾,和device.plist的配置檔案,打開device.plist的配置檔案後,會看到模拟器的UDID、裝置類型、系統版本、名稱等。通過這個可以知道模拟器的裝置和系統版本。打開後,會發現,前面的看似亂碼的檔案名稱,其實就是模拟器的裝置UDID,雖然從這裡可以得到模拟器的UDID,蘋果也用它來進行分類模拟器,但在實際的程式設計中,如果想最後釋出到APP Store的話,還是放棄UDID吧,這也是蘋果比較霸道的一點,當然了也是在保護使用者隐私的情況下做出的。

Xcode6 模拟器路徑【修改】

         2、應用沙盒位址的變更

        得到了模拟器路徑後,還是用很多的不同的,應用的沙盒位址也和之前有所不同。

       在Xcode5及之前的版本中,沙盒位址為如下:/Users/username/Library/Application Support/iPhone  Simulator/7.0.3/Applications,在Applications文加下,會找到應用程式的沙盒。

Xcode6 模拟器路徑【修改】

在打開應用沙盒後,會有應用程式檔案、Document檔案夾、Library檔案夾、tmp檔案夾。至于這幾個檔案夾的作用不在此做贅述。

Xcode6 模拟器路徑【修改】

       在Xcode6中,應用程式檔案、Document檔案夾、Library檔案夾、tmp檔案夾這四個檔案放在了不同的目錄中。應用程式檔案路徑:/Users/username/Library/Developer/CoreSimulator/Devices/模拟器UDID/data/Containers/Bundle/,Application檔案夾下;Document檔案夾、Library檔案夾、tmp檔案夾路徑:/Users/username/Library/Developer/CoreSimulator/Devices/模拟器UDID/data/Containers/Data/,Application檔案下。但是不幸的是,這兩個路徑打開後的檔案名,還是經過編碼過的,而且,同一個應用中的應用程式檔案和Document、Library、tmp檔案夾所在的檔案夾的檔案名是不同的。隻能自己找。 

Xcode6 模拟器路徑【修改】

       3、NSUserDefault 檔案存儲位置變更

       NSUserDefault是iOS提供的本地化資料存儲方式,會在沙盒中自動建立一個.plist的配置檔案,将資料儲存起來,在讀取時,以NSDictionary字典來進行接收 

Xcode6 模拟器路徑【修改】

       在Xcode5及之前的版本中,具體的路徑為:/Users/shifengwei/Library/Application Support/iPhone Simulator/7.0.3/Applications/C9588981-3D82-49BC-92B8-F5BA72185629/Library,Preferences檔案夾下,名稱為程式Bundle Identifier的plist檔案。在删除模拟器中的程式後,在Library檔案夾下的plist檔案會相應的删除。

       在Xcode6中,程式對使用NSUserDefault方式建立的plist檔案的位置進行了更換,具體路徑為:/Users/username/Library/Developer/CoreSimulator/Devices/模拟器UDID/data/Library,Preferences檔案夾下。

       這裡特别說一下,如果按照在Finder裡打開的路勁來看,并不是這樣的,但通過 Finder,前往檔案夾,通過該路徑查找是可以查到的。上述的路徑位址是通過檢視Preferences檔案夾的顯示簡介獲得的。

Xcode6 模拟器路徑【修改】

        通過上述的路徑可以看出,通過NSUserDefault建立的plist檔案夾還是在Library檔案下,但不同的是,真正存放的位置變了,成了在模拟器的資料庫檔案夾下,這樣的改變所産生的變化就是,當我們在删除模拟器中的應用程式後,plist檔案還是會保留,并不會删除。

       那麼,既然模拟器中的位置變了,那更新到iOS8後,在這方面有什麼不同呢?下面就說說在在真機中調試的不同。

        1、Organizer中,在Xcode5中,是Devices、Projects、Archives三欄,而在Xcode6中,單獨将Devices拿了出來,成了和Organizer平級的,在Xcode菜單欄,Window下。如果了解過Xcode從4.X更新到5時,就會知道,Organizer在那個時候也變更過,從原來的四欄變成了三欄,将幫助文檔移除了。

       2、在進行真機調試時,會打開真機中應用程式的沙盒,進行檢視,在Xcode中,  打開Devices的Application中,可以下載下傳下來應用程式的沙盒,通過右擊顯示包内容來檢視沙盒的資訊。但是在iOS8和iOS7及之前出現了不同。

Xcode6 模拟器路徑【修改】
Xcode6 模拟器路徑【修改】

       上圖為同一款應用在不同的系統中所表現的,上圖為iOS8下,下載下傳下來的沙盒内容,下圖為iOS7.0.4下,下載下傳下來的沙盒内容,很顯然,在iOS8下,通過Devices下載下傳的沙盒内容無法檢視沙盒裡面的内容。 

Xcode6 模拟器路徑【修改】

                我們通過第三方的軟體,在這裡使用的是iFunBox,找到應用程式後,打開發現可以檢視到沙盒的内容,複制到本地後,發現,原本的5個檔案,隻有3個,也就是Document檔案夾、Library檔案夾、tmp檔案夾三個。

     這裡特别說一下,上述提到過的,在模拟器中,通過NSUserDefault自動建立的plist檔案,在删除軟體後,還會保留,但在真機中,也是會删除的,相應的plist檔案的路徑到了通過導出的Library檔案夾下的Preferences檔案夾下,删除應用程式後,不會保留。這應該算是一個真機和模拟器中的不同。

       這個不同會造成一種情況,那是否還可以使用NSUserDefault?就筆者目前來看,還不至于廢棄NSUserDefault,畢竟它隻是在模拟器中會出現删除應用保留的情況,在真機中不會,而且NSUserDefault在開發中,作為資料持久化,在儲存資料時,還是很好用的。當然了,也有開發者會不适應這種情況,擔心在真機中會出現,如果有開發者認為不适應的話,可以自己建立一個plist檔案在沙盒中,代替,但是如果說應用中使用的NSUserDefault比較多的話,不建議這樣,畢竟蘋果封裝的NSUserDefault還是很好用的。可以在模拟器删除檔案後,在儲存plist檔案的檔案夾下,将plist檔案删除即可,多個步驟而已,至少目前來看,在真機中還是和之前一樣的。

       當然,在iOS中,除了NSUserDefault會系統自動生成檔案進行資料儲存外,歸檔也是一樣的,由于筆者沒有進行測試,為了避免誤導,這裡就不說了,待測試後,進行總結釋出。

PS:最後補充一下,打開或關閉Mac的隐藏檔案的指令。

打開Mac隐藏檔案指令:defaults write com.apple.finder AppleShowAllFiles -bool true

關閉Mac隐藏檔案指令:defaults write com.apple.finder AppleShowAllFiles -bool false

方法:在終端中,輸入該指令,回車,然後在強制退出中,重新開機Finder,即可。