首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改NSObjects的内部属性(特别是SKPaymentTransaction)

修改NSObjects的内部属性(特别是SKPaymentTransaction)
EN

Stack Overflow用户
提问于 2014-07-14 09:18:57
回答 2查看 329关注 0票数 4

我正在尝试对我们的收据验证服务器进行单元测试,虽然我可以修改内部API以避免这个问题,但这意味着我们没有完全测试客户端API,所以我想避免这种情况。

作为API的一部分,我们通过一个SKPaymentTransaction,然后将Transaction.transactionReceipt传递到服务器。

为了正确测试这一点,我想用我选择的一个SKPaymentTransaction实例(有效值和无效值)创建一个transactionReceipt实例。

不幸的是,SKPaymentTransaction将transactionReceipt属性定义为只读,而且由于this,我不能声明扩展/子类将其定义为ReadW区。

我似乎也无法将SKPaymentTransaction指针转换为char*来手动注入内存中的值,因为Xcode在ARC下不允许这样做。

有人知道我怎样才能达到我想要的目标吗?

谢谢李

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-14 14:32:35

结果,我可以使用transactionReceipt getter将自己的数据注入调用中。

所以我的结局是

代码语言:javascript
复制
-(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];
}

我写了一篇博文,展示了我的过程,并在这里给出了更多细节。

http://engineering-game-dev.com/2014/07/23/injecting-data-into-obj-c-readonly-properties/

票数 3
EN

Stack Overflow用户

发布于 2016-02-09 06:11:28

我子类为SKPaymentTransaction (例如,MutableSKPaymentTransaction),覆盖只读参数。已经有一个可变的SKPaymentTransaction,您可以使用它,也可以用类似的方式覆盖SKPayment。

示例:

在头文件(MutableSKPaymentTransaction.h)文件中

代码语言:javascript
复制
#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

在方法文件(MutableSKPaymentTransaction.m)中:

代码语言:javascript
复制
#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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24733223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档