Передача архивных данных через sharedURL - PullRequest
0 голосов
/ 17 июня 2011

В настоящее время у меня есть два несколько похожих приложения, и я искал способ обмена данными между этими двумя приложениями. Я настроил общий URL-адрес и все такое и могу без проблем переходить из одного приложения в другое. Проблема возникает, когда я пытаюсь передать данные через URL. У меня есть класс в обоих приложениях, которые идентичны друг другу, и я полагаюсь на NSKeyedArchiver и декодер для их кодирования и декодирования, а также кодирования их в строках для передачи по URL.

Имея доступ к обеим сторонам, я знаю, что данные, передаваемые из приложения 1 в приложение 2, являются незапятнанными и поступают так же, как приложение 1 закодировало их. Но я не могу расшифровать данные на другой стороне!

Я кодирую это здесь:

NSURL* app2=[NSURL URLWithString:@"app2://"];

if ([[UIApplication sharedApplication] canOpenURL:app2]) {

    NSMutableData *data = [[NSMutableData alloc] init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];       
    [archiver encodeObject:[tableHelper objectAtIndex:[indexPath section]]forKey:@"TempData" ];
    [archiver finishEncoding];  

    NSString* tmp=[[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding ] autorelease];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"app2://%@",[tmp stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]]];
    [data release];
    [archiver release];

}

Затем я расшифрую его так:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    if (!url) {
        return NO;
    }

    NSString *URLString = [url absoluteString];
    NSString* dataString=[[URLString componentsSeparatedByString:@"app2://"] lastObject];

    NSString* perString=[dataString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSKeyedUnarchiver* unArchiver=[[NSKeyedUnarchiver alloc] initForReadingWithData:[perString dataUsingEncoding:NSASCIIStringEncoding]];


    TempItem* temp=[unArchiver decodeObjectForKey:@"TempData"];
    [unArchiver finishDecoding];
    //...//
}

Есть ли что-то еще в кодировании / декодировании пользовательских классов, которые мне не хватает? Я реализую NSCoding в моем классе, проблема, я думаю, в

[perstring dataUsingEncoding:NSASCIIStringEncoding]

как кажется, что он всегда равен нулю?

Спасибо!

Я проверил вывод после кодирования и он как таковой

bplist00Ô,-T$topX$objectsX$versionY$archiverÑXTempData© 
'U$nullÖ
XitemsizeXquantityUpriceV$classYconvertedTunitQ1#?ð

и после добавления процента сбегает

bplist00%C3%94%01%02%03%04%05%08,-T$topX$objectsX$versionY$archiver%C3%91%06%07XTempData%C2%80%01%C2%A9%09%0A%17%18%19%1A%1B%1F'U$null%C3%96%0B%0C%0D%0E%0F%10%11%12%13%14%15%16XitemsizeXquantityUpriceV$classYconvertedTunit%C2%80%03%C2%80%05%C2%80%04%C2%80%08%C2%80%06%C2%80%02Q1%23?%C3%B0%00%00%00%00%00%00%23?%C3%B0%00%00%00%00%00%00%10%01%C3%92%1C%0E%1D%1EZNS.objects%C2%A0%C2%80%07%C3%92%20!%22&X$classesZ$classname%C2%A3%23$%25%5ENSMutableArrayWNSArrayXNSObject%5ENSMutableArray%C3%92%20!(+%C2%A2)*XTempItemXNSObjectXTempItem%12%00%01%C2%86%C2%A0_%10%0FNSKeyedArchiver%00%08%00%11%00%16%00%1F%00(%002%005%00%3E%00@%00J%00P%00%5D%00f%00o%00u%00%7C%00%C2%86%00%C2%8B%00%C2%8D%00%C2%8F%00%C2%91%00%C2%93%00%C2%95%00%C2%97%00%C2%99%00%C2%A2%00%C2%AB%00%C2%AD%00%C2%B2%00%C2%BD%00%C2%BE%00%C3%80%00%C3%85%00%C3%8E%00%C3%99%00%C3%9D%00%C3%AC%00%C3%B4%00%C3%BD%01%0C%01%11%01%14%01%1D%01&%01/%014%00%00%00%00%00%00%02%01%00%00%00%00%00%00%00.%00%00%00%00%00%00%00%00%00%00%00%00%00%00%01F

Я добавил NSLogs в часть декодирования, и это то же самое. Я сбит с толку ... После исправления неправильного размещения [unArchiver finishdecoding]; Теперь я получаю ошибку

*** -[NSKeyedUnarchiver initForReadingWithData:]: data is NULL
...