我正在尝试写入我的资源中的“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]]];
我做错了什么?
答案 0 :(得分:9)
现有代码不会覆盖index.html
文件的原因是应用程序无法覆盖其资源。 Apple的iOS Application Programming Guide具体说:
这是包含应用程序本身的bundle目录。不要在此目录中写任何内容。为防止篡改,bundle目录在安装时签名。写入此目录会更改签名并阻止您的应用程序再次启动。
而是写入您的文档目录。您可以像这样获取文档目录的路径:
NSString * docsDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
请注意,iOS上的NSHomeDirectory()
简单地返回应用程序包的路径。获得文档目录的路径后,您可以写入资源,比如index.html,如下所示:
NSString * path = [docsDir stringByAppendingPathComponent:@"index.html"];
[myString writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
请注意,我已将error:
参数更改为nil
。这实际上不会影响任何事情,但通常的做法是使用nil
来指示NULL Objective-C对象。
答案 1 :(得分:1)
尝试将文件移动到Documents Directory,然后再执行这一系列代码的操作
#import <Foundation/Foundation.h>
@interface NSFileManager (NSFileManagerAdds)
+ (NSString*) copyResourceFileToDocuments:(NSString*)fileName withExt:(NSString*)fileExt;
@end
#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"];