0

私は URLScheme を使用しており、シリアル化された NSDictionary をアプリ A からアプリ B に送信する必要があります。

アプリ Aでは、NSKeyedArchiver を使用して NSDictionary を NSData にシリアル化しています

    NSDictionary *myDictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"This is value 1", @"key1", 
                                    @"value 2", @"key2",
                                    @"value3", @"key3", 
                                    @"", @"key4", 
                                    @"value5", @"key5", 
                                    @"value 6", @"key6", 
                                    nil];
NSMutableData *data = [[NSMutableData alloc] init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [archiver encodeObject:myDictionary];
    [archiver finishEncoding];
    [archiver release];

    NSString *bytes = [[[NSString alloc] initWithData:data
                                             encoding:NSASCIIStringEncoding] autorelease];

アプリ Bでは、NSKeyedUnarchiver を使用しています

NSData *data = [[NSString stringWithFormat:@"%@", val] dataUsingEncoding:NSASCIIStringEncoding];        
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
NSDictionary *myDictionary = [[unarchiver decodeObject] retain];
[unarchiver finishDecoding];
[unarchiver release];

私のシリアル化された NSDictionary は次のようになります。

bplist00Ô01T$topX$objectsX$versionY$archiverÑR$0¯
!"#$%&'()U$nullÓ ZNS.objectsWNS.keysV$class¦ ¦Tkey2Tkey5Tkey3Tkey1Tkey6Tkey4Wvalue
2o@

そして、この NSString を NSData に変換して NSDictionary を取り戻すことができないようです。

[dataUsingEncoding:dataUsingEncoding:NSASCIIStringEncoding] の後の NSData は NULL です。

4

2 に答える 2

7

NSJSONSerialization を確認すると、辞書と配列を json プレーン文字列形式に簡単に変換できます。

json データの生成 NSDictionary *mydict = [NSDictionary dictionaryWithObjectsAndKeys: ....

NSData* jsonData = [NSJSONSerialization dataWithJSONObject:info options:NSJSONWritingPrettyPrinted error:&error];

そして、これを元に戻します:

NSError *error = nil;
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];

それよりもはるかに単純になることはなく、外部ライブラリや設定は必要ありません。ビルトイン

于 2012-10-15T14:27:55.853 に答える
3

一体なぜあなたはバイトをNSString-として送信しているのですか?それは決して機能しません!

(a)NSStringは、エンコードされたテキストデータ、つまり特定のルールセットに従うデータ用です。

(b)NSDataは単なるバイトである一連のバイト用です。

(a)ではなく(b)があります。

オブジェクトを送信NSDataし、変換しないでくださいNSString


URLパラメータはどうですか?

さて、上記の私の答えは少し白黒すぎました。

データと文字列の間で本当に変換する必要がある場合は、base64エンコーディングを確認してください。サイズを犠牲にしてデータの安全な文字列表現が得られます。

変換できるライブラリがいくつかあります-これを試してください:https ://github.com/nicklockwood/Base64

ただし、iOS6デバイスで辞書をエンコードしてiOS5でデコードするとどうなりますか?それが機能するかどうかを100%確信することはできません。辞書を文字列に変換して元に戻す独自のコーディング/デコードメソッドを作成する方がよい場合があります。URLの場合は、URLパラメータを使用しないのはなぜx=5&name=Bobですか。

于 2012-10-15T14:00:02.567 に答える