在Objective-C(iPhone)中将字符串保存到文件中

3

我似乎遇到了一个问题,即在iPhone上从字符串保存xml文件。该文件本身存在且包含在项目中(因此在工作区内),并且代码段给出的所有指示都经过模拟器的验证而在iPhone上失败(错误513),但是无论哪种情况下,文件都没有被保存!

{
Hits = config->Hits;

NSString*   filenameStr = [m_FileName stringByAppendingFormat: @".xml" ]; 
NSString*   pData = [self getDataString];  // write xml format - checked out ok
NSError     *error;

/* option 2 - does not work as well
 NSBundle        *mainBundle = [NSBundle mainBundle];
 NSURL           *xmlURL = [NSURL fileURLWithPath:[mainBundle pathForResource: m_FileName ofType: @"xml"]];

 if(![pData writeToURL: xmlURL atomically: true encoding:NSUTF8StringEncoding error:&error]) 
 {
 NSLog(@"Houston - we have a problem %s@\n",[error localizedFailureReason]);
 return false;
 }
 */

if(![pData writeToFile: filenameStr atomically: FALSE encoding:NSUTF8StringEncoding error:&error]) 
{
    NSLog(@"Houston - we have a problem %s@\n",[error localizedFailureReason]);
    return false;
}
return true;

任何帮助都将不胜感激, -A

1
你能提供解释513错误的字符串吗? 另外,顺便说一下:在打印localizedFailureReason时,最好使用%@而不是%s。%@格式说明符需要一个NSString *,而%s则需要一个以null结尾的char *字符串。 - Tyler
1
从技术上讲,%@ 接受任何 NSObject 类型,并调用 [object description],在字符串的情况下是它本身;但它也适用于其他 NSObject 类型(如数组、集合等)。 - AlBlue
1个回答

19

不应该写入应用程序包中包含的文件。在真正的iPhone上,你可能会因为这些文件是数字签名的而被禁止这样做。

即使你可以修改封装文件,但这并不是存储数据的好地方。从应用商店升级或Xcode构建重新安装应用程序将用原始文件覆盖该文件。

相反,应将XML存储到文档目录中。可以像这样获取路径:

NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
    NSUserDomainMask, YES); 
NSString* documentsDirectory = [paths objectAtIndex:0];     
NSString* leafname = [m_FileName stringByAppendingFormat: @".xml" ]; 
NSString* filenameStr = [documentsDirectory
    stringByAppendingPathComponent:leafname];

如果你的文件需要一些初始状态,而你又不想在代码中生成它,那么可以让你的应用程序在第一次需要使用它时检查文档目录中是否存在该文件,如果缺失,则从包中的模板进行复制。

存储结构化数据的替代方法是使用用户默认设置。例如:

[[NSUserDefaults standardUserDefaults] setObject:foo forKey:FOO_KEY];

1
+1 对于用户默认设置的方法。然而,该文件并不是因为数字签名而防止被覆盖,而是因为它是只读的,无法被覆盖。它们也被数字签名了,但这并不是阻止其被写入的原因。 - AlBlue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接