- [NSString writeToFile:] не изменяет содержимое файла - PullRequest
2 голосов
/ 09 сентября 2011

Я пытаюсь записать файл "index.html", который есть в моих ресурсах.Я могу загрузить файл без проблем, но я не могу писать в него.Ничто не отображается как ошибка, оно просто не пишет.Приложение не прерывается и ничего, но при повторной загрузке файла ничего не меняется.

Мой код записи:

NSBundle *thisBundle = [NSBundle bundleForClass:[self class]];
NSString *path = [thisBundle pathForResource:@"index" ofType:@"html"];
NSString *myString = [[NSString alloc] initWithFormat:@""];
[myString writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:NULL];

Мой код загрузки:

[myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]isDirectory:NO]]];

Что я делаю не так?

Ответы [ 2 ]

9 голосов
/ 09 сентября 2011

Причина, по которой ваш существующий код не перезаписывает файл index.html, заключается в том, что приложение не может перезаписать свои ресурсы. Руководство по программированию приложений для iOS от Apple специально гласит:

Это каталог, содержащий само приложение. Не пишите ничего в этот каталог. Во избежание взлома каталог комплекта подписывается во время установки. Запись в этот каталог изменяет подпись и предотвращает повторный запуск приложения.

Вместо этого пишите в каталог документов. Вы можете получить путь к каталогу документов следующим образом:

NSString * docsDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

Обратите внимание, что NSHomeDirectory() на iOS просто возвращает путь к комплекту вашего приложения. Получив путь к каталогу документов, вы можете записать в ресурс, скажем, index.html, следующим образом:

NSString * path = [docsDir stringByAppendingPathComponent:@"index.html"];
[myString writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];

Обратите внимание, что я изменил ваш параметр error: на nil. На самом деле это ни на что не повлияет, но обычной практикой является использование nil для обозначения объектов NULL Objective-C.

1 голос
/ 09 сентября 2011

Попробуйте переместить ваш файл в каталог документов, прежде чем выполнять операцию, которую выполняет этот набор кода

.h

#import <Foundation/Foundation.h>

@interface NSFileManager (NSFileManagerAdds)
+ (NSString*) copyResourceFileToDocuments:(NSString*)fileName withExt:(NSString*)fileExt;
@end

.m

#import "NSFileManager + NSFileManagerAdds.h"

@implementation NSFileManager (NSFileManagerAdds)

+ (NSString*) copyResourceFileToDocuments:(NSString*)fileName withExt:(NSString*)fileExt
{
    //Look at documents for existing file
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", fileName, fileExt]];

    NSFileManager* fileManager = [NSFileManager defaultManager];

    if(![fileManager fileExistsAtPath:path])
    {
        NSError *nError;
        [fileManager copyItemAtPath:[[NSBundle mainBundle] pathForResource:fileName ofType:fileExt] toPath:path error:&nError];
    }

    return path;
}

@end

Наконец, вы должны использовать что-то вроде этого:

[NSFileManager copyResourceFileToDocuments:@"index" withExt:@"html"];
...