2013-01-01 16 views
1

我使用此代碼來告訴我的第二類將文件保存到指定路徑的路徑:保存到路徑沒有工作,除非我讓用戶選擇

if ([defaults boolForKey:@"SaveAutomatically"]) { 
     basepath = [defaults objectForKey:@"SaveAutomaticallyPath"]; 
     basepath = [basepath stringByAppendingPathComponent:[defaults objectForKey:@"SaveAutomaticallyName"]]; 
} 
[NSThread detachNewThreadSelector:@selector(saveTo:) toTarget:controller withObject:basepath]; 

所以,saveTo:方法被調用。它首先檢查給出的路徑是好的

if (![[[aPath pathExtension] lowercaseString] isEqualToString:@"icns"]) { 
    aPath = [aPath stringByAppendingPathExtension:@"icns"]; 
} 

if ([[NSFileManager defaultManager] fileExistsAtPath:aPath]) { 
    [delegate error:@"File exists already."]; 
    [self performSelectorOnMainThread:@selector(fs) 
          withObject:nil waitUntilDone:NO]; 
} 

然後做一些事情,並創建一個CGImageDestinationRef

NSURL *fileURL = [NSURL fileURLWithPath:aPath]; 
CGImageDestinationRef dr = CGImageDestinationCreateWithURL((CFURLRef)fileURL, kUTTypeAppleICNS , count, NULL); 
if (!dr) { 
    [delegate error:@"Unable to save icon file."]; 
    [self performSelectorOnMainThread:@selector(fs) 
          withObject:nil waitUntilDone:NO]; 
    return; 
} 

dr是零每次。如果我通過使用NSSavePanelsaveTo一條路徑,它不會抱怨並且工作正常。 我試着登錄saveTo:的路徑,但工作正常(例如,/Users/Home/Desk/Results.icns)。

換句話說,當上面的代碼保存到/Users/Home/Desktop/Result.icns失敗了,但是當我讓用戶決定保存到使用NSSavePanel相同的路徑,沒有任何問題。

我正在使用SandBoxing。我該如何解決這個問題?

回答

3

除非用戶明確允許使用打開/保存面板或通過拖放功能,否則沙盒應用程序在其自己的容器文件夾之外沒有文件訪問權限。您需要允許用戶選擇他們希望保存的路徑,並保留該文件夾的安全範圍書籤供以後使用(即,如果您想在應用重新啓動後更新該文件)。

這裏是Apple's Sandbox Design Guide報價:

您的沙盒應用程序可以訪問文件系統中的位置及其 容器的外面有以下三種方式:

  • 在用戶
  • 的特定方向
  • 通過使用特定文件系統位置的權利(描述於「權利和系統資源訪問」中)
  • 當文件系統位置在世界可讀的某些目錄中時
+0

好吧,有道理。謝謝!!! – Fatso

相關問題