¿Cómo guardar o almacenar la transacción SKPayment?

Me gustaría almacenar la transacción de SKPayment en los valores predeterminados del usuario o en el dispositivo, y también me gustaría almacenar los datos de la transacción en mi servidor en una fecha posterior (aún no terminada) para que un usuario pueda restaurar una suscripción si es necesario / necesario / posible.

El problema que tengo es que trato de guardar los valores predeterminados del usuario, pero me sigue diciendo:

* - [NSUserDefaults setObject: forKey:]: intento de insertar un valor que no es de propiedad '{transaction = ""; } 'de la clase' __NSCFDictionary '.

El código que utilizo es:

 // Save
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    [dict setObject:transaction forKey:@"transaction"];    
    [[NSUserDefaults standardUserDefaults] setObject:dict forKey:@"TransactionReceipt"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    // Read    
    NSMutableDictionary *savedDict =  [[NSUserDefaults standardUserDefaults] objectForKey:@"MyTransactionReceipt"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    NSLog(@"Saved stored transaction = %@", savedDict);

También intenté guardar el objeto Transaction en sí mismo en lugar de almacenarlo en un diccionario, pero esto siempre da un error, donde se queja

"Intente insertar un valor de propiedad que no sea de inserción ..."

También intenté usar NSKeyedArchiver, pero no estaba seguro de cómo codificarlo para manejar la lectura y escritura de una SKPaymentTransaction.

Cualquier ayuda en esto será muy apreciada.

Gracias por su atención.

preguntado el 08 de noviembre de 11 a las 12:11

1 Respuestas

Resolví el problema almacenando los datos de la transacción en una lista dentro del directorio de documentos.

Esto fue mucho más fácil y confiable para mis requisitos.

A continuación, se muestra un código básico para quienes deseen hacer lo mismo.

// WRITING        
// Save to documents directory
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *receiptStorageFile = [documentsDirectory stringByAppendingPathComponent:@"receipts.plist"];

NSLog(@"Reciept Storage File = %@", receiptStorageFile);

NSMutableArray *receiptStorage = [[NSMutableArray alloc] initWithContentsOfFile:receiptStorageFile];
if(!receiptStorage) {
    receiptStorage = [[NSMutableArray alloc] init];
}

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:transaction.transactionIdentifier forKey:@"transactionIdentifier"];
[dict setObject:transaction.transactionDate forKey:@"transactionDate"];
[dict setObject:transaction.transactionReceipt forKey:@"transactionReceipt"];

// Write
[receiptStorage addObject:dict];
[receiptStorage writeToFile:receiptStorageFile atomically:YES];
[receiptStorage release];


// READING

// Get app documents directory
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);            
NSString *documentsDirectory = [paths objectAtIndex:0];            
NSLog(@"DocumentsDirectory = %@", documentsDirectory);

// Load from documents directory            
NSArray *receipts = [[[NSArray alloc] initWithContentsOfFile:[documentsDirectory stringByAppendingPathComponent:@"receipts.plist"]] autorelease];
// Found a receipt on disk
if ([receipts count]>0) {
    // Do something, read the dictionary, etc.
} // end if

Respondido 06 ago 14, 06:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.