从测试用户的IOS应用内购买沙箱中清除购买

时间:2011-10-12 22:45:06

标签: iphone ios in-app-purchase

有没有人对如何重置和/或清除IOS应用内购买沙箱有什么想法?我有一个应用程序,我正在测试沙盒,我想测试新的购买,而不必每次购买时都创建一个新的测试用户。如果我不这样做,那么当我点击我的应用程序的购买按钮时,我(当然)总是会收到一条消息,说明已经购买了应用程序内购买项目。

9 个答案:

答案 0 :(得分:68)

IMO有三件事可以让非耗材测试变得可以忍受:

  1. 您可以将多个测试帐户与一封电子邮件相关联。例如,Gmail允许您向电子邮件to create aliases for an address添加“加号”字符串:因此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. 正如应用程序指出的那样,您可以通过首先使用耗材IAP购买非耗材IAP来测试代码的正确行为(以便测试用户可以根据需要进行尽可能多的购买)以摆脱一些错误。当然,您也应该在之后使用真正的非消耗性IAP测试代码。

答案 1 :(得分:31)

据我所知,你不能这样做。沙盒后端的工作方式与真实帐户相同 - 一旦购买,就会购买(因此您可以测试还原)。您应该在商店内容中填充大部分内容,然后当您真正测试它时,只需要创建多个测试帐户。

答案 2 :(得分:7)

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

如果我不需要测试“新用户”,我会在app项目中使用该产品。

答案 3 :(得分:6)

嗯,从技术上讲,你不需要那个。

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

答案 4 :(得分:3)

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

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

当我在模拟器上运行时,以及当我在设备上运行时使用真实的StoreKit时,这会产生使用SimStoreKit的效果。

答案 5 :(得分:3)

删除您的应用并重新安装也适用于沙盒测试。显然取决于应用程序,但我正在测试一个仅在注册时购买的基于订阅的应用程序,因此它是最简单的解决方案。

答案 6 :(得分:0)

继续使用相同的测试帐户,恢复购买而不是完成新购买。毕竟,无论您是开始新购买还是恢复旧购买,您的APP都会做同样的事情(至少在最初阶段,用户界面可能会在完成后以不同方式更新)。 Apple是那些在不同情况下处理事物的人 - 不用担心。

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

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

然后务必将该交付逻辑放入SKPaymentTransactionStatePurchased案例中。

最后,因为我们大多数人都在不同程度上都是强迫症,所以要用新账户做最后的测试(绝对不能确定第二个问题)。

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

答案 7 :(得分:0)

不是一个真正的答案,但有助于解释。

认为既然必须下载文件,那可能就是删除了。下面的简单函数尝试(Swift 3.0):

{{1}}

得到以下回复:

收据URL:file:/// private / var / mobile / Containers / Data / Application / 7A2-App-Related-Number-67 / StoreKit / sandboxReceipt

错误:无法删除“sandboxReceipt”,因为您无权访问它。

虽然代码显示它将收据从应用程序包中拉出来,但有点认为该包是静态的,因此收据可能仍然是可删除的。我确信有一些安全理由说明为什么这一切都以这种方式运作 - 所以最终必须删除应用程序到(重新)测试从无收据到下载新收据的情况。

答案 8 :(得分:-2)

另外,要创建多个测试用户解决方案,您可以在iTunes中创建多个应用程序购买测试连接,然后您无需更改用户帐户。