iphone - iOS 将字典从一个 plist 导入到另一个 plist

标签 iphone ios objective-c email plist

我正在尝试让我的应用程序从电子邮件中将设置导入到自身中。这将起作用的方式是用户将向自己发送一个 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;
}

最佳答案

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

我建议将您的文件编辑成这样

<?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];

您应该阅读更多关于 Serializing a Property List 的内容

转换 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;
}

关于iphone - iOS 将字典从一个 plist 导入到另一个 plist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17989471/

相关文章:

ios - 我们可以以编程方式注销Facebook吗

iphone - NSURLConnection 发送数据两次

iphone - 使用Newtonsoft.Json消除引号转义

iphone - 使用动态行高时 UITableView 出现间隙

iphone - 从文件异步加载图像

ios - 如何为 iOS 应用程序创建带有时间和日期网格的 UI

iphone - PurgeIdleCellConnections 导致应用程序卡住然后崩溃

ios - 快速解析: can not retrieve the value of a bool in _User class

ios - 在不同的 View Controller 中执行操作

ios - 如何在 UIScrollView 上添加 UIViewController View