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>

を使用してファイルを正しく開いて読み取ることができますが、既存のものを上書きせずにアプリのメイン Data.plist にNSLogインポートし、インポートしたplist を Documents/Inbox フォルダーから削除する必要があります。dictionary

手がかりは素晴らしいでしょう:)

//編集

以下のコメントに基づいてメソッドを更新しました。ファイル 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 に答える