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


116

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

我有一个正在使用沙箱测试的应用程序,我想测试新购买的商品,而不必每次购买商品时都创建新的测试用户。

如果我不这样做,那么当我单击应用程序的“购买”按钮时,我(当然)总会收到一条消息,表明已经购买了应用程序内购买商品。

Answers:


75

IMO您可以做三件事来使非消耗品的测试可以承受:

  1. 您可以将多个测试帐户关联到一封电子邮件。例如,Gmail允许您在电子邮件中添加“加号”字符串以创建地址的别名:因此tester+01@gmail.comtester+02@gmail.com两者都只是去了tester@gmail.com。可能其他电子邮件主机也这样做。创建测试帐户时,您需要输入:名字,姓氏,电子邮件地址,密码,机密问题,机密答案,出生日期和iTunes商店国家/地区。您可以输入完全相同的数据(包括密码)tester+01@gmail.comtester+02@gmail.com并且您将拥有两个测试帐户。最后,在tester@gmail.com收件箱中,您将收到来自Apple的两封验证电子邮件,以确认两个测试帐户。

  2. 假设您的产品ID @“ Extra_Levels”为非消耗品。无需在所有方法(requestProduct,purchaseProduct等)中编写@“ Extra_Levels”,只需编写PRODUCT_ID1并放置一些头文件#define PRODUCT_ID1 @"Extra_Levels"(不带分号!),然后预处理器将搜索PRODUCT_ID1并将其替换为@“ Extra_Levels”。然后创建一个名为@“ Extra_Levels_01”的新非消耗品并更改#define与为所有测试用户重置购买商品一样好。

  3. 正如appsmatics指出的那样,当您购买非消耗性的IAP时,可以通过先使用消耗性的IAP(这样测试用户可以根据需要进行多次购买)来消除一些错误,从而测试代码的正确行为。当然,此后,您还应该使用真正的非消耗性IAP测试代码。


17
哇,我从未听说过这种超级秘密的gmail功能。多么有用!
bobobobo

4
我刚刚发现您实际上不必验证测试用户的电子邮件。您只需将123@123.com输入指定的密码即可(您仍将在沙盒模式下使用该密码),它仍然可以正常工作。我昨晚刚刚测试。
2014年

3
电子邮件别名的加号技巧绝非GMail本身。在电子邮件服务器中,这是非常古老的传统,可以追溯到几十年前。但是它从未被纳入任何电子邮件规范中。因此,请使用您特定的电子邮件服务器对其进行测试,以确保它对此功能有所了解。
罗勒·布尔克

2
我would'n认为这是不可能清除应用内购买测试账号;)万岁苹果:)
巴特洛梅耶Semańczyk

12
+电子邮件地址不能再用于注册Apple ID。
pkamb

32

据我所知,你不能这样做。沙盒后端的工作方式类似于真实帐户-购买后,即已购买(因此您可以测试还原)。您应该在商店的所有东西都填满的情况下完成大部分开发工作,然后在进行真实测试时,只需期望创建多个测试帐户即可。


3
同意samvermette的观点,这很疯狂,因此测试与真实商店非常接近。至少必须有一种清除沙箱中购买的方法。为了测试同一位用户进行多次购买,我还添加了一个Consumable类型。
appsmatics 2012年

4
@samvermette 唯一的区别是您SKPaymentTransactionStateRestored从App Store回来了,而不是SKPaymentTransactionStatePurchased。由于您并非在这里使用真实货币,因此就测试目的而言,它SKPaymentTransactionStateRestored实际上是100%等效的SKPaymentTransactionStatePurchased。将您的应用程序状态重置为“未购买”实际上取决于您(只需删除相关的钥匙串条目或您用来缓存“用户购买的X”的内容)
bobobobo

9

我有2个应用程式内购买项目。1个用于生产。另一个用于测试。当我需要“清除”时,我删除应用程序中的项并创建一个新项(在iTunes Connect中为15秒,在代码中更改产品ID为1秒)

如果我不需要测试“新用户”,则可以在应用程序项中使用生产。


是的,制作产品的新副本并更改代码中的产品名称(大概已经定义了它的名称)似乎是迄今为止进行实际测试的最简单解决方案。
朱利安·席姆斯(JulianSymes)2014年

7

好吧,从技术上讲,您不需要。

如果您获得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


5

删除应用程序并重新安装也可以进行沙箱测试。显然取决于应用程序,但是我正在测试基于订阅的应用程序,该应用程序仅在注册时才购买,因此这是最简单的解决方案。


3

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的效果。


无法使它正常工作。我遇到了构建错误。我将zip中的所有文件复制到了我的项目中,并用#define ILSimReplaceRealStoreKit 1 #import“ ILSimStoreKit.h”替换了所有#import <StoreKit / StoreKit.h>
Jay Q.

您只需要以ILSimSK开头的文件。其他内容用于演示应用程序。也许您应该发布一个带有您得到的确切错误的问题。“我遇到构建错误”并没有多说。
Emile Cormier 2012年

-1

或者,要创建多个测试用户解决方案,您可以在iTunes Connect的应用程序购买中创建多个测试,则无需更改用户帐户。


1
拒绝的原因是:1.这不是一个好的解决方案,因为您可能正在尝试测试特定的应用内购买解决方案,该解决方案可能需要使用应用程序用户登录和跨设备/平台内容可用性的许多方案。2.创建多个测试购买就像创建多个测试帐户一样(实际上)很繁琐。3.此外,答案的格式不是很好。
mickeymoon

-1

只需继续使用相同的测试帐户,即可恢复购买交易而不是完成新的购买交易。毕竟,无论您是开始新购买还是恢复旧购买,您的APP都会做同样的事情(至少在最初,也许用户界面在完成后会有所不同)。苹果在不同情况下对事物的处理方式有所不同-不用担心。

将交付逻辑放在此方法的实现中的SKPaymentTransactionStateRestored案例中进行测试:

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

然后确保将传递逻辑放入SKPaymentTransactionStatePurchased案例中。

最后,由于我们大多数人对强迫症都有不同程度的要求,因此请使用新的方法进行最终测试(绝对确定性没有第二个困难)。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.