iPhone, NSPropertyListSerialization

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • iPhone, NSPropertyListSerialization

    Ich weiß nicht, ob ich mich wieder mal blöd anstelle... ich lasse das iPhone per Bonjour alle Macs im LAN erkennen und stelle dann eine NSFileHandle-Verbindung zwischen den beiden her.

    Auf dem Mac schreibe ich da Daten so rein:

    Quellcode

    1. [incomingConnection writeData:[NSPropertyListSerialization dataFromPropertyList:rootObject format:
    2. NSPropertyListBinaryFormat_v1_0 errorDescription:&errorDesc]];

    wenn ich aber auf dem iPhone die Daten wieder entserialisieren will per

    Quellcode

    1. NSData *requestData = [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem];
    2. id rootObject = [NSPropertyListSerialization propertyListFromData:requestData mutabilityOption:
    3. NSPropertyListImmutable format:nil errorDescription:&errorDesc];

    dann funktioniert das ab und zu mal, oft genug erhalte ich aber auch
    error Conversion of data failed. The file is not UTF-8, or in the encoding specified in XML header if XML.

    In dem entsprechenden Objekt (Ich verschicke so sowohl Arrays als auch Dictionaries) sind wiederum nur Objekte, die serialisiert werden können, sprich Strings, NSDates, Arrays, Dictionaries.

    Bin ich jetzt blöd? -- Das einzige, was mir eingefallen ist, woran es liegen könnte, wenn es nicht Apples Fehler ist wäre daß nicht das ganze empfangene Objekt auf einmal gelesen wird und ich da versuche, "Stückchen" wieder zusammenzusetzen?
    Weiß jemand, wie sich das verhält? -- Und vor allen Dingen: welchen Sinn hätte der Mechanismus mit den Filehandles, wenn dem so wäre?
    if (!exit(-1)) fprintf(stderr, "exit call failed. Program will continue\n");
  • Nee, es ging wirklich um FileHandles, die ich zur Kommunikation zwischen Mac und iPhone benutze, da nutze ich NSPropertyListSerialization, um allen möglichen Kram da reinpacken und zwischen den beiden Geräten hin- und herschicken zu können.

    In meiner Naivität war ich davon ausgegangen, daß ich mich da nicht wie bei rohen Sockets um die Größe der Objekte und Puffer und so zu kümmern bräuchte, sondern daß ich immer die Daten des ganzen Objektes -- und eben auch nicht mehr -- bekäme.

    War aber ein Irrtum, den ich korrigiert habe.
    if (!exit(-1)) fprintf(stderr, "exit call failed. Program will continue\n");
  • Trotzdem! Falls Du mal was speichern musst. In der Beta muss man sich nen separaten Ordner anlegen damit es klappt. Siehe Apple Code:

    Quellcode

    1. #pragma mark Begin Workaround: create application "Documents" directory if needed
    2. // Workaround for Beta issue where Documents directory is not created during install.
    3. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    4. NSString *documentsDirectory = [paths objectAtIndex:0];
    5. BOOL exists = [fileManager fileExistsAtPath:documentsDirectory];
    6. if (!exists) {
    7. BOOL success = [fileManager createDirectoryAtPath:documentsDirectory attributes:nil];
    8. if (!success) {
    9. NSAssert(0, @"Failed to create Documents directory.");
    10. }
    11. }
    12. #pragma mark End Workaround
    13. NSString *writableDBPath = [documentsDirectory stringByAppendingFormat:@"/bookdb.sql"];
    14. success = [fileManager fileExistsAtPath:writableDBPath];
    15. if (success) return;
    16. // The writable database does not exist, so copy the default to the appropriate location.
    17. NSString *defaultDBPath = [NSString stringWithFormat:@"%@/bookdb.sql", [[NSBundle mainBundle] resourcePath]];
    18. success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
    19. if (!success) {
    20. NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    21. }
    22. }
    Alles anzeigen
  • Im Moment bezieht meine Applikation noch alle benötigten Daten je nach Bedarf vom Mac, aber der Code wird demnächst bestimmt noch verwurstet werden, danke!
    if (!exit(-1)) fprintf(stderr, "exit call failed. Program will continue\n");
  • Quellcode

    1. CFSocketContext socketCtxt = {0, self, NULL, NULL, NULL};
    2. ipv4socket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketAcceptCallBack, (CFSocketCallBack)&WLTCPServerAcceptCallBack, &socketCtxt);
    3. ipv6socket = CFSocketCreate(kCFAllocatorDefault, PF_INET6, SOCK_STREAM, IPPROTO_TCP, kCFSocketAcceptCallBack, (CFSocketCallBack)&WLTCPServerAcceptCallBack, &socketCtxt);
    4. if (NULL == ipv4socket || NULL == ipv6socket) {
    5. if (error) *error = [[NSError alloc] initWithDomain:TCPServerErrorDomain code:kTCPServerNoSocketsAvailable userInfo:nil];
    6. if (ipv4socket) CFRelease(ipv4socket);
    7. if (ipv6socket) CFRelease(ipv6socket);
    8. ipv4socket = NULL;
    9. ipv6socket = NULL;
    10. NSLog (@"Error creating socket");
    11. return NO;
    12. }
    Alles anzeigen

    CFSocketCreate gibt immer null zurück - also nicht viel.

    Firmware 1.1.4

    BSD Sockets scheinen zu funktonieren
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • Ist ja merkwürdig...

    Ich habe allerdings auch so einige merkwürdige Sachen erlebt beim Rumgespiele. -- Naja, steht ja auch groß und fett "Beta" drübergekleistert.

    (Mal so nebenbei, daß es ein Doku-Update gibt hast Du mitbekommen?)
    if (!exit(-1)) fprintf(stderr, "exit call failed. Program will continue\n");