我的OSX应用程序是沙箱,我无法通过指定绝对路径从文件中读取数据

时间:2016-05-24 15:57:24

标签: objective-c macos plist entitlements

我对目标C完全不熟悉,目前我正在尝试推进已有项目的功能。 项目中有一个查找程序扩展程序,在单击时执行内部操作(IBAction)共享(id)发送程序。 在此操作中,我想从特定位置读取文件(该文件包含端口号)并使用我想要连接到服务器的端口。 但我发现当我点击这个扩展名时,没有任何反应,因为它试图从文件中读取数据并且无法读取任何内容。 我尝试通过将其读取的任何内容打印到其他文件来调试它,但所有打印的内容都是空白的,确认它无法读取数据。下面是我的代码试图从临时位置读取端口:

- (IBAction)privateShareAction:(id)sender {

  NSFileManager *filemgr;
  filemgr = [NSFileManager defaultManager];

  if ([filemgr fileExistsAtPath: @"/var/folders/y3/jv117_75505fnk8htdrs0qm40000gr/T/com.aprivacy.xmlCorePort.properties" ] == YES)
  {
    //create file handle
    NSFileHandle *file;
    file = [NSFileHandle fileHandleForReadingAtPath:@"/var/folders/y3/jv117_75505fnk8htdrs0qm40000gr/T/com.aprivacy.xmlCorePort.properties"];
    //read data into file in NSData format
    NSData *filedata;
    filedata = [file readDataToEndOfFile];
    NSLog(@"fileDATA = %@", filedata);

    //convert NSData to NSString
    NSString *string;
    string = [[NSString alloc] initWithData:filedata encoding:NSASCIIStringEncoding];

    NSMutableString *directoryPath1 = [NSMutableString stringWithString: @"share1>"];

    [directoryPath1 appendString: string];

    NSData *dataToWrite3 = [directoryPath1 dataUsingEncoding: NSUTF8StringEncoding];

    NSFileHandle* outputFile = [NSFileHandle fileHandleForWritingAtPath:@"/Users/yp/Downloads/a.txt"];

    [outputFile seekToEndOfFile];
    [outputFile writeData:dataToWrite3];

    //convert from string to array
    NSArray *lines = [string componentsSeparatedByString:@"="];
    NSLog(@"arrau = %@", lines);
    //take one of the string and store it in sword
    NSString *sword = [lines objectAtIndex:1];
    NSLog(@"port : %@", sword);
    int port1=[sword intValue];
    Communicator *c = [[Communicator alloc ]init];
    c.host=@"http:127.0.0.1";
    c.port=port1;
    [c setup];
  }

  else
  {
    NSAlert *alert = [[NSAlert alloc] init];
    [alert setMessageText:@"Error"];
    [alert setInformativeText:@"You are not logged in.Kindly login to start performing the operations"];
    [alert setAlertStyle:NSWarningAlertStyle];
    [alert runModal];
  }
}

上面的代码,在执行的操作上首先尝试检查文件是否存在于/var/folders/y3/jv117_75505fnk8htdrs0qm40000gr/T/com.aprivacy.xmlCorePort.properties位置。 这完全正常,如果文件存在,它会显示一个弹出警报(发生)。 但是如果该文件存在,它将进入if条件并尝试读取它失败的文件。它总是打印一个空白字符串,表明没有任何内容被读取。 然后我去检查App Sandbox中的权利。 我尝试添加一个名为com.apple.security.temporary-exception.files.absolute-path.read-only的权利,其字符串值设置为/var/folders/y3/jv117_75505fnk8htdrs0qm40000gr/T/com.aprivacy.xmlCorePort.properties这样它就获得了从这个位置读取文件的权限,但它仍然无法解决我的问题。 任何人都可以建议如何在我的应用程序中访问此文件读取权限,因为相同的代码在新创建的测试项目中完全正常。

以下步骤:原始客户端应用程序运行-login,包含用户名和密码登录后-it将端口写入文件同时,一旦您使用应用程序登录,如果现在您右键单击任何文件在你的系统中,你会看到一些额外的扩展,如共享,授权访问等。(这是因为用于添加扩展的finder项目与原始客户端合并)现在,当我点击say share(右键单击文件)时,我想要执行一个动作。动作的逻辑写在(IBAction)共享(id)发送方法这个用于添加扩展的应用程序是沙箱,因为权限受到限制。因此,当我点击共享时,我的逻辑是读取该文件,获取端口,然后使用该端口连接到服务器。我想做一切行动,但我无法这样做。它无法从/var/folder/y3/jv117_755fdlvfldsvgr/T/com.aprivacy.xmlcorePort.properties找到文件数据

2 个答案:

答案 0 :(得分:1)

沙盒应用程序(全部在iOS中)仅允许访问特定目录。使用NSSearchPathForDirectoriesInDomains获取可用目录的路径。

例如:

目标-C:

NSArray *documentDirectoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:fileName];

NSError *error;
BOOL status = [string writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (status == NSError) {
    NSLog(@"error: %@", error)
}

夫特:

let filePath = "path/file.txt";
let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as! String
let path = documentDirectoryPath + filePath

注意:在干净的构建中,沙盒路径不一致。

答案 1 :(得分:1)

不要在沙盒应用程序中使用绝对路径。

在OS X中,有NSTemporaryDirectory()函数可以访问容器中此特定应用程序的临时目录。不需要权利。

来自文档

  

一些路径查找API(在POSIX层之上)是指特定于应用程序的   用户主目录之外的位置。在沙盒应用中,   例如,NSTemporaryDirectory函数提供了一个路径   目录位于用户主目录之外但特定于   你的应用程序和你的沙盒;你有不受限制的读/写   为当前用户访问它。这些路径发现的行为   API适用于App Sandbox,不需要更改代码   需要的。

来源:App Sandbox in Depth