2016-05-24 7 views
0

Я совершенно новичок в объекте 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

ответ

1

Однонаправленные приложения (все в iOS) имеют доступ только к определенным каталогам. Используйте NSSearchPathForDirectoriesInDomains, чтобы получить пути к доступным каталогам.

Ex:

Objective-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) 
} 

Swift:

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

Примечание: песочницы пути не соответствует по чистой сборки.

1

Не используйте абсолютные пути в песочнице.

В ОС X есть функция NSTemporaryDirectory(), чтобы иметь доступ к временному каталогу для этого конкретного приложения в контейнере. Права не нужны.

Из документации

Некоторых путей ознакомительной APIs (над POSIX слоем) относится к приложению конкретным мест за пределами домашней директории пользователя. Например, в изолированном приложении функция NSTemporaryDirectory предоставляет путь к каталогу , который находится за пределами домашнего каталога пользователя, но определенному для вашего приложения и в вашей песочнице; у вас есть неограниченное чтение/запись доступ к нему для текущего пользователя. Поведение этих API-интерфейсов для определения пути соответствующим образом настраивается для Sandbox Sandbox, и никакое изменение кода не требуется .

Источник: App Sandbox in Depth

+0

Это нормально. Я пытался напечатать NSTemporaryDirectory путь и то, что я нашел: /var/folders/y3/jv117_75505fnk8htdrs0qm40000gr/T/com.Aprivacy.MenuContext.APrivacyMenu/ тогда, что я хочу получить доступ является:/вар/папки/y3/jv117_75505fnk8htdrs0qm40000gr /T/com.aprivacy.xmlCorePort.properties Как я могу это сделать? – yukzz

+0

Как заявили zaph, доступно только несколько конкретных каталогов (также в OS X). Используйте один из них. – vadian

+0

Я могу разместить файл во временном каталоге и прочитать его там без использования прав. – yukzz

 Смежные вопросы

  • Нет связанных вопросов^_^