2012-05-16 19 views
9

Sto implementando gli acquisti in-app per la nostra app iOS per vari abbonamenti auto-rinnovabili. Una volta completato il pagamento, è necessario inviare le informazioni sulla transazione al nostro server (cloud) per registrare le informazioni in modo da poter verificare la ricezione su un intervallo prestabilito per assicurarsi che l'abbonamento sia valido, non cancellato/rimborsato o rinnovato. Faremo le chiamate JSON dal server in un intervallo predefinito per farlo tramite la guida agli acquisti in-app e il nostro segreto condiviso, dobbiamo ancora arrivare a questo, ma prima di farlo dobbiamo avere i dati rilevanti dall'acquisto , cioè TransactionReceipt che è un oggetto NSData.Converti NSData in base64 codificato AND un array di byte in C#

Vogliamo inviare due parametri al nostro servizio web per TransactionReceipt (tra gli altri articoli come ProductID acquistato, ecc.). Vogliamo inviarlo come valore codificato in base64 che è ciò che crediamo debba essere inviato nella richiesta JSON per la convalida, quindi lo memorizzeremo in SQL Server.

HOw, utilizzando MonoTouch/C# è possibile convertire NSData "TransactionReceipt" in base64encoded e anche un byte []?

Grazie.

risposta

6

Ci sono due modi semplici per ottenere dati da NSData, utilizzando le proprietà Stream o Bytes e Length. La versione corrente sarà simile:

public byte[] ToByte (NSData data) 
{ 
    MemoryStream ms = new MemoryStream(); 
    data.AsStream().CopyTo (ms); 
    return ms.ToArray(); 
} 

la versione Bytes e Length sarebbe:

public byte[] ToByte (NSData data) 
{ 
    byte[] result = new byte[data.Length]; 
    Marshal.Copy (data.Bytes, result, 0, (int) data.Length); 
    return result; 
} 

Ottenere la stringa di output Base64 rimane identico:

public string ToBase64String (NSData data) 
{ 
    return Convert.ToBase64String (ToByte (data)); 
} 
+0

Ho ricevuto questo errore durante il tentativo di utilizzare il metodo ToByte: // Messaggio: Wrapper per NSMutableData non è supportato, richiamo nuovo UnmanagedMemoryStream ((Byte *) mutableData.Bytes, mutableData.Length) invece // Eccezione: wrapper per NSMutableData non è supportato, chiama new UnmanagedMemoryStream ((Byte *) mutableData.Bytes, mutableData.Length) invece ::: a MonoTouch.Foundation.NSData.AsStream() [0x0002f] in/Developer/MonoTouch/Source/monotouch/src /shared/Foundation/NSData.cs:144 – Neal

+0

Non tutti i 'NSData' sono modificabili e' AsStream' controllerà per questo, vedere: https://github.com/mono/maccore/blob/master/src/Foundation/NSData .cs # L136 Puoi provare il codice suggerito (es 'UnmanagedMemoryStream') o la seconda versione di' ToByte' fornita (che utilizza 'Marshal' e copia i dati). – poupou

0

che funziona troppo:

string yourDataInBase64 = Convert.ToBase64String(yourData.ToArray());