Я совершенно новичок в объекте C, и в настоящее время я пытаюсь продвинуть функциональность уже существующего проекта. В проекте есть расширение поиска, которое при нажатии на него выполняет действие внутри (IBAction) Share (id) отправителя. Внутри этого действия я хочу прочитать файл из определенного места (файл содержит номер порта) и использовать этот порт, который я хочу подключиться к серверу. Но я обнаружил, что когда я нажимаю на это расширение, ничего не происходит, потому что он пытается пойти и прочитать данные из файла и не может ничего читать. Я попытался отладить это, распечатав все, что он прочитал, в другой файл, но все напечатанное было пустым, подтверждая, что оно не в состоянии прочитать данные. Ниже мой код пытается прочитать порт из временного расположения:Мое приложение OSX изолировано песочницей, и я не могу читать данные из файла, указав абсолютный путь
- (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];
[email protected]"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];
}
}
Приведенный выше код на действие выполняется сначала пытается проверить, если файл присутствует в/вар/папки/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. свойства, чтобы получить разрешение на чтение файла из этого местоположения, но все же это не решит мою проблему. Не могли бы вы предложить, как получить доступ к этому разрешению на чтение файлов в моем приложении, потому что тот же код отлично работает во вновь созданном тестовом проекте.
Следующие шаги: Оригинальное клиентское приложение, работающее с именем пользователя и паролем. После входа в систему - запись порта в файл. В то же время, как только вы вошли в систему с вашим приложением, если теперь вы щелкните правой кнопкой мыши по любому файл в вашей системе вы увидите некоторые дополнительные расширения, такие как общий доступ, доступ к грантам и т. д. (Это связано с тем, что проект-искатель, используемый для добавления расширений, объединяется с исходным клиентом) Теперь, когда я нажимаю на share (при щелчке правой кнопкой мыши по файлу) Я хочу, чтобы действие было выполнено. Логика действия написана в методе отправителя (IBAction) Share (id). Это приложение, используемое для добавления расширений, изолировано, из-за чего разрешения ограничены. Поэтому, когда я нажал на share, моя логика заключалась в том, чтобы прочитать этот файл, получить порт, а затем подключиться к серверу с помощью этого порта. Я хочу делать все внутри действия, но я не могу этого сделать. Он не может найти данные файла из /var/folder/y3/jv117_755fdlvfldsvgr/T/com.aprivacy.xmlcorePort.properties
Это нормально. Я пытался напечатать NSTemporaryDirectory путь и то, что я нашел: /var/folders/y3/jv117_75505fnk8htdrs0qm40000gr/T/com.Aprivacy.MenuContext.APrivacyMenu/ тогда, что я хочу получить доступ является:/вар/папки/y3/jv117_75505fnk8htdrs0qm40000gr /T/com.aprivacy.xmlCorePort.properties Как я могу это сделать? – yukzz
Как заявили zaph, доступно только несколько конкретных каталогов (также в OS X). Используйте один из них. – vadian
Я могу разместить файл во временном каталоге и прочитать его там без использования прав. – yukzz