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

有没有人有任何想法如何重置和/或清除IOS应用内购买沙箱? 我有一个应用程序,我正在使用沙盒testing,我想testing新的购买,而不必每次购买东西时创build一个新的testing用户。 如果我不这样做,那么当我点击我的应用程序的购买button时,我(当然)总是会收到应用程序内购买项目已经购买的消息。

国际海事组织(IMO)有三件事可以做,以testing非易耗品的承受能力:

  1. 您可以将多个testing帐户关联到一个电子邮件。 例如,Gmail可以为电子邮件添加一个“加号”string来为一个地址创build别名 :因此tester+01@gmail.comtester+02@gmail.com都只是去tester@gmail.com 。 也许其他电子邮件主机也一样。 当您创buildtesting帐户时,您需要引入:名字,姓氏,电子邮件地址,密码,秘密问题,秘密答案,出生date和iTunes商店国家/地区。 您可以为tester+01@gmail.comtester+02@gmail.com完全相同的数据(包括密码),您将拥有两个testing帐户。 最后,在您的tester@gmail.com收件箱中,您将收到两封来自Apple的validation邮件,以确认两个testing帐户。

  2. 假设您的产品ID为“Extra_Levels”,则为非消耗品。 不要在所有方法(requestProduct,purchaseProduct,…)中写入@“Extra_Levels”,只需编写PRODUCT_ID1并在某个头文件中放入#define PRODUCT_ID1 @"Extra_Levels" (不带分号!),然后预处理程序将searchPRODUCT_ID1和将其replace为@“Extra_Levels”。 然后创build一个名为@“Extra_Levels_01”的新的非消耗品,并更改#define将与为所有testing用户重置购买行为一样好。

  3. 正如应用程序指出的那样,当您通过首先使用易耗IAP购买非易损IAP(以便testing用户可以根据需要进行尽可能多的购买)来消除一些错误时,您可以testing代码的正确行为。 当然,你也应该在这之后用真正的非易损件IAP来testing代码。

就我所知,你不能这样做。 沙箱后端的工作方式就像一个真实的账户 – 一旦购买,就会被购买(因此您可以testing恢复)。 你应该做的大部分的开发与商店的东西被淘汰,然后当你到真正的testing,只是期望创build几个testing帐户。

我有2个应用程序购买项目。 1用于生产。 另一个用于testing。 当我需要“清除”我删除应用程序项目,并创build一个新的(在iTunes连接15秒和1秒更改代码中的产品ID)

如果我不需要testing“新用户”,我使用应用程序项目中的生产。

那么在技术上你不需要那个。

如果您获得SKPaymentTransactionStateRestored ,则它与validation用户并授予其购买的app storeSKPaymentTransactionStateRestored 。 我有一个开关,如:

 - (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 } } } 

让您的应用程序逻辑/收回购买的问题很简单:如果您在钥匙串中caching购买,请删除您的钥匙串。 如果你正在做一些其他的事情,只要改变你的本地应用程序状态,假装用户从来没有购买过它。 请求购买对话框仍然是完全一样的,唯一的区别是当你冲YES,它给你SKPaymentTransactionStateRestored而不是SKPaymentTransactionStatePurchased

看看SimStoreKit 。 这是一个“iPhone的StoreKit的模拟版本,用于在iPhone模拟器上testing商店UI,甚至在设备上不需要在Connect中设置IAP。

SimStoreKit在ILSimSKTransactions密钥下以用户默认值存储购买。 所以要清除所有的购买,你可以做:

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

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

在使用沙箱进行testing之前,我已经成功地使用SimStoreKit来debugging应用程序的商店前台。 这个库的#define ILSimReplaceRealStoreKit 1是它可以设置为使用与真正的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。

删除您的应用程序,并重新安装也适用于沙箱testing。 显然取决于应用程序,但我正在testing基于订阅的应用程序,目前只在注册时购买,所以这是最简单的解决scheme。

只要继续使用相同的testing帐户,恢复购买,而不是完成新的。 毕竟,无论您开始购买还是恢复旧版本,您的应用程序都会执行相同的操作(至less在初始阶段,用户界面在完成时可能会有不同的更新)。 苹果是在不同的情况下处理事情的人 – 不要担心。

将您的投递逻辑放在SKPaymentTransactionStateRestored案例中,在这个方法的实现中进行testing:

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

那么一定要把这个交付逻辑放到SKPaymentTransactionStatePurchased的情况下。

最后,因为我们大多数人都是不同程度的强迫症,所以要用最新的方法进行最后的testing(绝对没有什么大不了的)。

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

不是一个真正的答案,而是帮助解释。

以为由于文件必须被下载,也许它可能被删除。 下面的简单函数试试(Swift 3.0):

 func removeReceipt() { if let receiptURL = Bundle.main.appStoreReceiptURL { print("receipt URL: \(receiptURL)") do { try FileManager.default.removeItem(at: receiptURL) print("Success") } catch let error as NSError { print("ERROR: \(error.localizedDescription)") } } } 

得到以下回应:

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

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

虽然代码显示它将收据从应用程序包中拉出,但还是认为这个包是静态的,所以收据仍然可以删除。 我敢肯定有这样的安全原因,所有这些都以这种方式工作 – 所以最后不得不删除应用程序以(重新)testing从没有收据到下载新收据的情况。

采购是未完成的交易。 所有你需要做的testing只是完成它们。

 for (SKPaymentTransaction *transaction in [SKPaymentQueue defaultQueue].transactions) [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

或者创build多个testing用户解决scheme,您可以在iTunes连接中的应用程序购买中创build多个testing,然后您不需要更改用户帐户。