2012-05-16 33 views
9

Estoy implementando compras en la aplicación para nuestra aplicación iOS para varias suscripciones auto renovables. Cuando se complete el pago, debemos enviar la información de la transacción a nuestro servidor (nube) para registrar la información, de modo que podamos verificar la recepción en un intervalo establecido para asegurarnos de que la suscripción sea válida, no cancelada/reembolsada o renovada. Vamos a hacer las llamadas JSON desde el servidor en un intervalo establecido para hacer esto a través de la guía de compras en la aplicación y nuestro secreto compartido, aún tenemos que llegar a eso, pero antes de hacerlo necesitamos tener los datos relevantes de la compra , es decir, el TransactionReceipt que es un objeto NSData.Convertir NSData a base64encoded Y una matriz de bytes en C#

Queremos enviar dos parámetros a nuestro servicio web para el TransactionReceipt (entre otros elementos, como el ProductID comprado, etc.). Queremos enviar esto como un valor codificado en base64 que es lo que creemos que debe enviarse en la solicitud JSON para validación, por lo que lo almacenaremos en SQL Server.

¿Cómo podemos usar MonoTouch/C# para convertir NSData "TransactionReceipt" a base64encoded y también a byte []?

Gracias.

Respuesta

6

Hay dos maneras sencillas de obtener datos de NSData, utilizando las propiedades Stream o Bytes y Length. La versión corriente se vería así:

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

la versión Bytes y Length sería:

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

Conseguir la cadena de salida base 64 permanece idéntica:

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

Recibí este error al intentar utilizar el método ToByte superior: // Mensaje: Wrapper para NSMutableData no es compatible, llame a new UnmanagedMemoryStream ((Byte *) mutableData.Bytes, mutableData.Length) en su lugar // Excepción: Wrapper para NSMutableData no es compatible, llame al nuevo UnmanagedMemoryStream ((Byte *) mutableData.Bytes, mutableData.Length) en su lugar ::: en MonoTouch.Foundation.NSData.AsStream() [0x0002f] en/Developer/MonoTouch/Source/monotouch/src /shared/Foundation/NSData.cs:144 – Neal

+0

No todos los 'NSData' son mutables y' AsStream' comprobará esto, ver: https://github.com/mono/maccore/blob/master/src/Foundation/NSData .cs # L136 Puede probar el código sugerido (es decir, 'UnmanagedMemoryStream') o la segunda versión de' ToByte' que proporcioné (que usa 'Marshal' y copia los datos). – poupou

0

que funciona también:

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