2016-04-18 22 views
7

Ho un'app creata originariamente nell'obiettivo C (consente di chiamare questa versione 1) e ora ho convertito la mia app in Swift 2.0 (versione 2). Una delle funzioni principali dell'app è la possibilità di inviare immagini e testo da un dispositivo a un altro. Immagini e testo sono memorizzati in NSMutableDictionary e quindi codificati in NSData e inviati/memorizzati nel server di back-end di Parse. Il design della mia app ha anche la capacità di inviare per e-mail un'immagine da un dispositivo a un altro.UIImage codificato su NSData in ObjectiveC e quindi decodificato in Swift

Questo funziona bene per entrambe le versioni della mia app: Objective C e Swift. Grande !

Il mio problema si verifica quando un utente invia NSData dalla versione 1 della mia app a un dispositivo con versione 2 (fondamentalmente un'immagine codificata nell'obiettivo C e quindi decodificata in Swift) !! Il testo codificato decodifica bene ma non l'immagine (salvata come objectForKey ("dati")). Vedi sotto l'esempio. quizData è un array che detiene il dizionario (elementi keyValue) che sono stati inviati da un altro dispositivo. Questo array funziona con tutti gli oggetti ad eccezione di objectForKey ("dati"). Questo oggetto è l'immagine codificata.

var imageData = NSData() 

imageData = quizData.objectAtIndex(currentQuestionNumber).objectForKey("data") as! NSData 

    // the following always prints out lots of info to confirm the imageData has the encoded image 
    print("imageData.length = \(imageData.length)") 
    print("imageData.description = \(imageData.description)") 

    // decoding 
    photoImageView.image = UIImage(data:imageData) 

ok, quindi quanto sopra funziona quando l'immagine è stata creata su un altro dispositivo utilizzando Swift. Ma se l'immagine creata e inviata dalla versione 1 (obiettivo c), il PhotoImageView è vuoto (nessun errore) eppure imageData è enorme (la stampa mostra che imageDate trattiene l'immagine dell'utente).

Surley se un oggetto NSdata ha i dati per una UIImmagine dovrebbe essere possibile decodificare in ObjC o Swift ?? Nessun problema l'invio di più codici, se richiesto

Domanda modificato come segue: Non sono sicuro se questo aiuta veramente ma heres codice objc per l'invio di un NSData via e-mail (tutti i dati applicazione viene salvato un plist)

// emailArray to be populated with selected data from plist 
NSMutableArray *emailArray = [NSMutableArray arrayWithContentsOfFile:path]; 

MFMailComposeViewController *emailPicker = [[MFMailComposeViewController alloc]init]; 
emailPicker.mailComposeDelegate =self; 


/// NSdata from emailArray 
NSData *emailQuizData = [NSKeyedArchiver archivedDataWithRootObject:emailArray]; 
[emailPicker addAttachmentData:emailQuizData mimeType:@"application/quizApp" fileName:_quizNameLabel.text]; 
+0

sarebbe d'aiuto se ci mostri il codice che codifica i dati dell'immagine come NSData e lo mette in il dizionario (il codice Obj-C) – dirkgroten

+0

Vorrei anche provare con la decodifica della codifica delle immagini Base64. – Maulik

+1

Nessuno del tuo codice ha molto senso. Che cosa ha a che fare il codice Objective-C con il codice Swift? L'Objective-C sta caricando un file plist (con contenuti sconosciuti), archiviando l'array risultante e inviando l'archivio come allegato e-mail. Il codice Swift mostra solo un tentativo di ottenere 'NSData' da qualche array sconosciuto. Da dove proviene 'quizData' nel codice Swift? La tua domanda dice che c'è un problema nell'invio di dati da un dispositivo a un altro. Come è fatto? Mostra codice rilevante con più contesto. – rmaddy

risposta

8

se usi la codifica base64 questo problema non dovrebbe sorgere.

qui è l'implementazione in rapida:

import UIKit 

func base64StringForImage(image: UIImage) -> String? { 
    guard let data = UIImagePNGRepresentation(image) else { return nil } 
    return data.base64EncodedStringWithOptions([]) 
} 

func imageFromBase64String(string: String) -> UIImage? { 
    guard let data = NSData(base64EncodedString: string, options: []) else { return nil } 
    return UIImage(data: data) 
} 

qui è l'implementazione in objc:

#import <UIKit/UIKit.h> 

NS_INLINE NSString * base64StringForImage_objc(UIImage *image) { 
    NSData *imageData = UIImagePNGRepresentation(image); 
    return [imageData base64EncodedStringWithOptions:0]; 
} 

NS_INLINE UIImage * imageFromBase64String_objc(NSString *string) { 
    NSData *imageData = [[NSData alloc] initWithBase64EncodedString: string options: 0]; 
    return [[UIImage alloc] initWithData:imageData]; 
}