Modificación de las properties internas de NSObjects (específicamente SKPaymentTransaction)

Estoy intentando probar la unidad de nuestro server de verificación de recibos y, aunque puedo modificar la API interna para evitar este problema, significa que no estamos probando completamente la API del cliente, por lo que me gustaría evitarlo.

Como parte de nuestra API, pasamos un SKPaymentTransaction y luego pasamos el Transaction.transactionReceipt a nuestro server.

Para probar esto correctamente, me gustaría crear una instancia de SKPaymentTransaction con una transacción Recibo de mi elección (valores válidos y no válidos).

Desafortunadamente, SKPaymentTransaction define la propiedad transactionReceipt como de solo lectura, y no puedo declarar una extensión / subclass que la define como readwrite debido a esto .

Tampoco parece que pueda convertir el puntero SKPaymentTransaction en un char * para inyectar manualmente los valores en la memory, ya que Xcode no lo permite en ARC.

¿Alguien tiene una idea de cómo puedo lograr lo que estoy buscando?

Gracias Lee

Resulta que puedo cambiar el recibidor de transacción para inyectar mis propios datos en la llamada.

Entonces termino con algo como

-(void)test_function { SKPaymentTransaction* invalidTransaction = [[SKPaymentTransaction alloc] init]; Method swizzledMethod = class_getInstanceMethod([self class], @selector(replaced_getTransactionReceipt)); Method originalMethod = class_getInstanceMethod([invalidTransaction class], @selector(transactionReceipt)); method_exchangeImplementations(originalMethod, swizzledMethod); // Call to receipt verification server } - (NSData*)replaced_getTransactionReceipt { return [@"blah" dataUsingEncoding:NSUTF8StringEncoding]; } 

Escribí una publicación de blog que muestra mi process, y doy un poco más de detalles aquí.
http://engineering-game-dev.com/2014/07/23/injecting-data-into-obj-c-readonly-properties/

Subclass SKPaymentTransaction (por ejemplo, MutableSKPaymentTransaction), anulando los parameters readonly. Ya existe una SKPaymentTransaction mutable, que puede usar, o puede anular SKPayment de una manera similar.

Ejemplo:

en el file del encabezado (MutableSKPaymentTransaction.h)

 #import <StoreKit/StoreKit.h> @interface MutableSKPaymentTransaction : SKPaymentTransaction @property (readwrite, copy, nonatomic) NSError * error; @property (readwrite, copy, nonatomic) SKPayment * payment; @property (readwrite, copy, nonatomic) NSString * transactionIdentifier; @property (readwrite, copy, nonatomic) NSDate * transactionDate; @property (readwrite, copy, nonatomic) NSArray * downloads; @property (readwrite, copy, nonatomic) SKPaymentTransaction *originalTransaction; @property (assign, nonatomic) SKPaymentTransactionState transactionState; @end 

y en el file de método (MutableSKPaymentTransaction.m):

 #import "MutableSKPaymentTransaction.h" @implementation MutableSKPaymentTransaction // readonly override @synthesize error = _error; @synthesize payment = _payment; @synthesize transactionIdentifier = _transactionIdentifier; @synthesize transactionDate = _transactionDate; @synthesize downloads = _downloads; @synthesize originalTransaction = _originalTransaction; @synthesize transactionState = _transactionState; @end