是否有人对如何重置和/或清除iOS应用内购买沙箱有任何想法?
我有一个正在使用沙箱测试的应用程序,我想测试新购买的商品,而不必每次购买商品时都创建新的测试用户。
如果我不这样做,那么当我单击应用程序的“购买”按钮时,我(当然)总会收到一条消息,表明已经购买了应用程序内购买商品。
是否有人对如何重置和/或清除iOS应用内购买沙箱有任何想法?
我有一个正在使用沙箱测试的应用程序,我想测试新购买的商品,而不必每次购买商品时都创建新的测试用户。
如果我不这样做,那么当我单击应用程序的“购买”按钮时,我(当然)总会收到一条消息,表明已经购买了应用程序内购买商品。
Answers:
IMO您可以做三件事来使非消耗品的测试可以承受:
您可以将多个测试帐户关联到一封电子邮件。例如,Gmail允许您在电子邮件中添加“加号”字符串以创建地址的别名:因此tester+01@gmail.com
,tester+02@gmail.com
两者都只是去了tester@gmail.com
。可能其他电子邮件主机也这样做。创建测试帐户时,您需要输入:名字,姓氏,电子邮件地址,密码,机密问题,机密答案,出生日期和iTunes商店国家/地区。您可以输入完全相同的数据(包括密码)tester+01@gmail.com
, tester+02@gmail.com
并且您将拥有两个测试帐户。最后,在tester@gmail.com
收件箱中,您将收到来自Apple的两封验证电子邮件,以确认两个测试帐户。
假设您的产品ID @“ Extra_Levels”为非消耗品。无需在所有方法(requestProduct,purchaseProduct等)中编写@“ Extra_Levels”,只需编写PRODUCT_ID1
并放置一些头文件#define PRODUCT_ID1 @"Extra_Levels"
(不带分号!),然后预处理器将搜索PRODUCT_ID1并将其替换为@“ Extra_Levels”。然后创建一个名为@“ Extra_Levels_01”的新非消耗品并更改#define与为所有测试用户重置购买商品一样好。
正如appsmatics指出的那样,当您购买非消耗性的IAP时,可以通过先使用消耗性的IAP(这样测试用户可以根据需要进行多次购买)来消除一些错误,从而测试代码的正确行为。当然,此后,您还应该使用真正的非消耗性IAP测试代码。
+
电子邮件地址不能再用于注册Apple ID。
据我所知,你不能这样做。沙盒后端的工作方式类似于真实帐户-购买后,即已购买(因此您可以测试还原)。您应该在商店的所有东西都填满的情况下完成大部分开发工作,然后在进行真实测试时,只需期望创建多个测试帐户即可。
SKPaymentTransactionStateRestored
从App Store回来了,而不是SKPaymentTransactionStatePurchased
。由于您并非在这里使用真实货币,因此就测试目的而言,它SKPaymentTransactionStateRestored
实际上是100%等效的SKPaymentTransactionStatePurchased
。将您的应用程序状态重置为“未购买”实际上取决于您(只需删除相关的钥匙串条目或您用来缓存“用户购买的X”的内容)
我有2个应用程式内购买项目。1个用于生产。另一个用于测试。当我需要“清除”时,我删除应用程序中的项并创建一个新项(在iTunes Connect中为15秒,在代码中更改产品ID为1秒)
如果我不需要测试“新用户”,则可以在应用程序项中使用生产。
好吧,从技术上讲,您不需要。
如果您获得SKPaymentTransactionStateRestored
,则相当于100%的应用商店等同于验证用户并准予其购买。我有一个类似的开关:
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
for( SKPaymentTransaction *purch in transactions )
{
switch( purch.transactionState )
{
case SKPaymentTransactionStateRestored:
info( "PURCHASE RESTORE" ) ;
// fall thru
case SKPaymentTransactionStatePurchased:
[[SKPaymentQueue defaultQueue] finishTransaction:purch];
// Do regular changes to app state for this purchase,
// register in keychain, etc.
break ;
//.. other cases
}
}
}
让您的应用逻辑/收回购买的问题很简单:如果您在钥匙串中缓存购买,请删除您的钥匙串。如果您以其他方式进行操作,只需将本地应用程序的状态更改为假装,就像用户从未购买过它一样。“购买”对话框的请求仍然完全相同,唯一的区别是,当您按“是”时,会显示SKPaymentTransactionStateRestored
而不是SKPaymentTransactionStatePurchased
。
删除应用程序并重新安装也可以进行沙箱测试。显然取决于应用程序,但是我正在测试基于订阅的应用程序,该应用程序仅在注册时才购买,因此这是最简单的解决方案。
签出SimStoreKit。它是“ iPhone StoreKit的模拟版本,无需在Connect中设置IAP即可在iPhone Simulator甚至设备上测试商店UI。”
SimStoreKit将购买的商品存储在用户默认的密钥下ILSimSKTransactions
。因此,要清除所有购买商品,您可以执行以下操作:
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"ILSimSKTransactions"]
在模拟器上,您只需删除您的应用并重新安装即可。
在使用沙箱进行测试之前,我已经成功地使用SimStoreKit调试了应用程序的店面。该库的优点是可以将其设置为使用与真正的StoreKit框架相同的类名(#define ILSimReplaceRealStoreKit 1
先做,再做#include <ILSimStoreKit.h>
)。
在需要访问StoreKit的源文件中,包含以下头文件:
#import <TargetConditionals.h>
#if TARGET_IPHONE_SIMULATOR
#define kILSimAllowSimulatedStoreKit 1
#define ILSimReplaceRealStoreKit 1
#import <ILSimStoreKit.h>
#else
#import <StoreKit/StoreKit.h>
#endif
当我在模拟器上运行时,具有使用SimStoreKit的效果;当我在设备上运行时,具有使用真实的StoreKit的效果。
或者,要创建多个测试用户解决方案,您可以在iTunes Connect的应用程序购买中创建多个测试,则无需更改用户帐户。
只需继续使用相同的测试帐户,即可恢复购买交易而不是完成新的购买交易。毕竟,无论您是开始新购买还是恢复旧购买,您的APP都会做同样的事情(至少在最初,也许用户界面在完成后会有所不同)。苹果在不同情况下对事物的处理方式有所不同-不用担心。
将交付逻辑放在此方法的实现中的SKPaymentTransactionStateRestored案例中进行测试:
- (void)paymentQueue:(SKPaymentQueue *)queue
updatedTransactions:(NSArray *)transactions;
然后确保将传递逻辑放入SKPaymentTransactionStatePurchased案例中。
最后,由于我们大多数人对强迫症都有不同程度的要求,因此请使用新的方法进行最终测试(绝对确定性没有第二个困难)。
最后要注意的是:考虑苹果的位置。如果开发人员不得不浪费时间创建数十个或数百个帐户来彻底测试IAP,那么他们将可以解决该问题。没有问题。