0

我正在尝试让我的应用程序从电子邮件中将设置导入自身。这将起作用的方式是用户将向settings.properties自己发送一个文件,这实际上是一个plist看起来像这样的文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Viewer</key>
    <array>
        <string>username</string>
        <string>password</string>
        <string>http://www.example.com</string>
        <string>/example</string>
        <string>urlparam=whatever</string>
    </array>
</dict>

我可以使用 正确打开和读取文件NSLog,但我需要将其dictionary导入我的应用程序主 Data.plist 而不覆盖已经存在的内容,然后从 Documents/Inbox 文件夹中删除导入的 plist。

任何线索都会很棒:)

//编辑

我已经根据下面的评论更新了我的方法。它现在仅在我的应用程序文档目录中已存在文件 Data.plist 时才有效。因此,如果它不存在,我需要创建它,然后添加到我的 .properties 文件中。

这是我目前正在使用的代码。

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
if (url){

        NSDictionary *openedDictionary = [NSDictionary dictionaryWithContentsOfURL:url];

        // get paths from root direcory
        NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
        // get documents path
        NSString *documentsPath = [paths objectAtIndex:0];
        // get the path to our Data/plist file
        NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"Data.plist"];
        NSDictionary *originalDictionary = [NSDictionary dictionaryWithContentsOfFile:plistPath];

        NSMutableDictionary *newDictionary = [originalDictionary mutableCopy];
        for (NSString *key in openedDictionary) {
            if (!newDictionary[key]) {
                newDictionary[key] = openedDictionary[key];
            }
        }

        [newDictionary writeToFile:plistPath atomically:YES];

    }
    NSError *error = nil;
    if (![[NSFileManager defaultManager] removeItemAtURL:url error:&error]) {
        NSLog(@"error while deleting: %@", [error localizedDescription]);
    }
    return YES;
}
4

2 回答 2

2

首先,如果你的数据结构是错误的。您有用于设置的字典而不是数组,它更具可读性,并且您可以更简单地解析它并且不会出错。

我建议将您的文件编辑为此

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>username</key>
    <string>username_value</string>
    <key>password</key>    
    <string>password_value</string>
    <key>url</key>
    <string>www.example.com</string>
    <key>url2</key>
    <string>/example</string>
    <key>urlparam</key>
    <string>urlparam=whatever</string>
</dict>

将 plist 转换为字典非常简单。

NSData* plistData = [source dataUsingEncoding:NSUTF8StringEncoding];
NSString *error;
NSPropertyListFormat format;
NSDictionary* plist = [NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&error];

您应该阅读有关序列化属性列表的更多信息

转换 plist 后,比较值并进行适当的更改并将字典写入 plist 文件。

这是代码片段:

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    if (url){

        NSDictionary *openedDictionary = [NSDictionary dictionaryWithContentsOfURL:url];

        // get paths from root direcory
        NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
        // get documents path
        NSString *documentsPath = [paths objectAtIndex:0];
        // get the path to our Data/plist file
        NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"Data.plist"];
        NSDictionary *originalDictionary = [NSDictionary dictionaryWithContentsOfFile:plistPath];

        NSMutableDictionary *newDictionary = [originalDictionary mutableCopy];
        for (NSString *key in openedDictionary) {
            if (!newDictionary[key]) {
                newDictionary[key] = openedDictionary[key];
            }
        }

        [newDictionary writeToFile:plistPath atomically:YES];

    }
    NSError *error = nil;
    if (![[NSFileManager defaultManager] removeItemAtURL:url error:&error]) {
        NSLog(@"error while deleting: %@", [error localizedDescription]);
    }
    return YES;
}
于 2013-08-01T09:46:49.093 回答
1

尝试首先将您的主要数据 plist 读入一个临时可变变量。然后将从导入的 plist 文件中读取的数据追加到临时变量中。现在将临时变量中的数据写入主数据plist,覆盖整个数据。

于 2013-08-01T09:38:54.030 回答