为测试用户清除 iOS 应用内购买沙箱中的购买

是否有人有任何关于如何重置和/或清除 iOS 应用程序内购买沙箱的想法?

我有一个应用程序,我正在测试的沙箱,我想测试新的购买不必创建一个新的测试用户每次我购买的东西。

如果我不这样做,那么我(当然)总是得到一个消息,在应用程序内购买项目已经购买时,我点击我的应用程序的购买按钮。

52902 次浏览

据我所知,你不能这么做。沙箱后端的工作方式与真正的帐户类似——一旦购买了它,它就被购买了(因此您可以测试恢复)。你应该做的大部分开发与商店的东西刷出来,然后当你开始测试它的真正,只是期望创建几个测试帐户。

看看 SimStoreKit。它是“ iPhone 的 StoreKit 的模拟版本,用于在 iPhone 模拟器上测试存储 UI,甚至在设备上测试存储 UI,而无需在 Connect 中设置 IAP。”

SimStoreKit 将购买记录存储在用户默认的键 ILSimSKTransactions下:

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"ILSimSKTransactions"]

在模拟器上,您可以简单地删除您的应用程序并重新安装它。

我已经成功地使用 SimStoreKit 在沙箱测试之前调试了我的应用程序的商店前端。这个库的美妙之处在于,它可以被设置为使用与真正的 StoreKit 框架相同的类名(通过在执行 #include <ILSimStoreKit.h>之前执行 #define ILSimReplaceRealStoreKit 1)。

在需要访问 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 连接中创建多个应用程序购买测试,那么你就不需要更改用户帐户。

国际海事组织有3件事情你可以做,使测试非消耗品可承受:

  1. 您可以将许多测试帐户关联到一个电子邮件。例如,Gmail 允许你在电子邮件 为地址创建别名中添加一个“加号”字符串: 所以 tester+01@gmail.comtester+02@gmail.com实际上都转到了 tester@gmail.com。可能其他电子邮件主机也这么做。当您创建一个测试帐户时,您需要介绍: 名字、姓氏、电子邮件地址、密码、秘密问题、秘密答案、出生日期和 iTunes 商店国家。您可以为 tester+01@gmail.comtester+02@gmail.com放置完全相同的数据(包括密码) ,并且您将拥有两个测试帐户。最后,在您的 tester@gmail.com收件箱中,您将收到两封来自苹果的验证电子邮件,以确认两个测试帐户。

  2. 假设您有一个非消费品,其产品 ID 为@“ Ultra _ Level”。不要在所有的方法(requestProduct,buy aseProduct,...)中写入@“ Ultra _ Level”,只要写入 PRODUCT_ID1,在一些头文件中放入 #define PRODUCT_ID1 @"Extra_Levels"(不要使用分号!)然后,预处理器将搜索 PRODUCT _ ID1并将其替换为@“ Ultra _ Level”。然后创建一个新的非消耗品@“ Ultra _ Level _ 01”,并更改 # Definition 将与重新设置所有测试用户的购买一样好。

  3. 正如 appsmatic 所指出的,当您购买一个不可消费的 IAP 时,您可以通过首先使用一个可消费的 IAP (以便测试用户可以根据需要进行尽可能多的购买)来测试代码的正确行为,以消除一些 bug。当然,之后还应该使用真正的不可消费的 IAP 测试代码。

我有2个应用程序购买项目。 生产1。 另一个用来测试。当我需要“清除”时,我删除应用程序中的项目并创建一个新的(15秒在 itunes 连接和1秒改变产品 ID 的代码)

如果我不需要测试“新用户”,我使用产品在应用程序项目。

严格来说,你不需要那个。

如果你得到 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
}
}
}

让你的应用程序逻辑/收回购买的问题很简单: 如果你缓存购买的钥匙链,删除你的钥匙链。如果你是以其他方式做到这一点,只要改变你的本地应用程序状态,假装用户从来没有购买过它。购买请求对话框仍然是完全相同的,唯一的区别是当你点击 YES 时,它会给你 SKPaymentTransactionStateRestored而不是 SKPaymentTransactionStatePurchased

只要继续使用相同的测试帐户,恢复购买,而不是完成新的。毕竟,无论你是开始一个新的购买还是恢复一个旧的,你的应用程序将做同样的事情(至少在最初,也许用户界面将更新完成后不同)。苹果是那些在不同情况下处理事情的不同的人——不要担心。

将您的传递逻辑放置在 SKPaymentTransactionStateRestred 案例中,并在此方法的实现中进行测试:

- (void)paymentQueue:(SKPaymentQueue *)queue
updatedTransactions:(NSArray *)transactions;

然后确保将该交付逻辑放入 SKPaymentTransactionStatePurchase 案例中。

最后,因为我们中的大多数人都有不同程度的强迫症,用一个新的说法做最后的测试(为了绝对确定而做第二个说法并不是什么大不了的事)。

最后要注意的是: 考虑苹果的立场。如果开发人员不得不浪费时间创建数十个或数百个帐户来彻底测试 IAP,那么他们本可以解决这个问题。没问题。

删除您的应用程序和重新安装工程也为沙箱测试。显然这取决于应用程序,但是我正在测试一个基于订阅的应用程序,它只在注册时购买,所以这是最简单的解决方案。

现在可以通过 重置资格进行订阅购买了

  1. 在测试 iOS 设备上,打开设置 > 苹果 ID > 媒体和购买(或 iTunes 和/或 iOS13及更早版本的应用程序商店)。在 Sandbox Account 部分下,点击突出显示的 Sandbox Apple ID,然后点击 Manage 打开沙箱订阅管理页面。
  2. 如果订阅已过期,请点击其中一个选项重新订阅。
  3. 一旦您重新订阅或当您有一个订阅正在进行,您可以使用重置资格按钮重置和赎回另一个介绍提供(试用或折扣价格)。

您可以在 AppStore Connect 中清除沙盒 Apple ID 的购买历史记录。

清除测试人员的购买记录:

  1. 在“用户和访问”中的“沙箱”下,单击“测试人员”。
  2. 单击“编辑”。
  3. 选择要修改的每个测试人员的复选框,然后单击“清除购买历史记录”。
  4. 在出现的对话框中单击“清除购买历史记录”。

请参阅文档 https://help.apple.com/app-store-connect/#/dev7e89e149d

您可以清除测试人员的购买历史记录,这样您就可以继续使用相同的沙箱 Apple ID 进行正在进行的测试。清除购买历史记录将删除沙箱环境中选定的测试人员过去购买的所有自动更新的订阅和非消耗品。客户在应用程序商店中进行的应用程序内购买不受影响。

清除测试人员的购买记录:

在“用户和访问”中的“沙箱”下,单击“测试人员”。

单击“编辑”。

enter image description here

选择要修改的每个测试人员的复选框,然后单击“清除购买历史记录”。

enter image description here

在出现的对话框中单击“清除购买历史记录”。

enter image description here

大量购买的沙箱苹果 ID 可能需要更长时间才能清除。此操作不能被逆转。