我对目标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找到文件数据
答案 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,不需要更改代码 需要的。