2012-06-08 43 views

回答

26

是的,但它需要「臨時例外」權利。 「臨時」意味着它可能在未來版本的操作系統中消失,但這不是一個很大的風險。更大的問題是「異常」一詞:這意味着您必須證明您對該權利的使用是合理的,否則App Store審覈人員可能會拒絕您。

提交一份錯誤報告,解釋您認爲自己應該能夠做什麼,但今天不能訪問~/Library,並且最好在主題上啓動一個論壇主題。他們可能會建議使用替代方法,而不是訪問~/Library(甚至可能使用私有API),在這種情況下,請按照他們的說法進行操作。或者他們可能會說現在使用暫時的例外,在這種情況下,這樣做。或者他們可能不會迴應,在這種情況下,您會使用暫時的例外情況並穿過手指。無論如何,請確保您的App Store提交評論註釋鏈接到錯誤報告和/或論壇主題。

您將不得不手動編輯項目的權利plist來執行此操作,但這不是很難。創建一個com.apple.security.temporary-exception.files.home-relative-path.read-only數組,其中一個字符串爲"/Library/"。就像這樣:

<key>com.apple.security.temporary-exception.files.home-relative-path.read-only</key> 
<array> 
    <string>/Library/</string> 
</array> 

額外/末是沙盒是如何知道你要訪問的目錄,而不是文件。如果你離開它,你將可以訪問~/Library中的所有文件,這是你所要求的,但不能訪問~/Library(遞歸)子目錄中的文件,如~/Library/LaunchAgents/com.mycompany.myapp.myoldagent.12345678-ABCD-EF00-1234-567890ABCDEF.plist,這可能是你想要的。請參閱權利密鑰參考文檔中的File Access Temporary Extensions

此外,請注意,您已經可以免費訪問~/Library下的某些內容,無論是因爲它們被複制到容器中,還是在使用合適的API而不是使用路徑時間接訪問。因此,可能有更好的方法來完成您正在做的事情 - 例如,讀取以前的非沙盒版應用程序留下的文件,您可能可以將它們遷移到容器中並在那裏讀取它們。

一兩件事:只要有訪問〜/ Library不改變什麼NSHomeDirectory()URLsForDirectory:inDomains:等將返回 - you'll仍然得到~/Containers/com.mycompany.myproduct/Data/Library來代替。蘋果的處理這個半官方的建議是使用BSD API來獲取用戶的真正的家目錄,最簡單的方法是這樣的:

const char *home = getpwuid(getuid())->pw_dir; 
NSString *path = [[NSFileManager defaultManager] 
        stringWithFileSystemRepresentation:home 
        length:strlen(home)]; 
NSURL *url = [NSURL fileURLWithPath:path isDirectory:YES]; 

的幾個注意事項:

  • 這通常不是一個好主意太頻繁地打電話給getpwuid。最好的解決方案是儘早調用此代碼,然後緩存結果NSURL
  • 這顯然也可以用於獲取其他用戶的家(因此也可以用於Library)目錄,但App Store幾乎肯定不會允許任何真正嘗試這種操作的軟件。
  • 圖書館在~/Library這個事實被認爲是一個「實現細節」,可能會有一天發生變化,這是另一個原因(在權利之上),這必須被認爲是暫時的解決方法,直到Apple提供真正的解決方案到您的更高級別的問題,這可能值得在您的評論說明中提及。
+0

感謝您的回答! – dot

+0

Upvoted,雖然你提出的使用'getpwent() - > pw_dir'的解決方案爲我返回'/ var/virusmails'。 –

+2

這對我有效:'getpwnam([NSUserName()UTF8String]) - > pw_dir' –

相關問題