iOS应用内购买:何时以及为何SKPaymentTransactionStateRestored作为交易状态发回?
是否与定期订阅计划有关?
我正在实施StoreKit应用内应用程序购买界面,虽然看起来SKStoreProductViewControlleriPad上的手柄风景,但我的iPhone上的应用程序似乎没有这样做(它是通用的).
界面SKStoreProductViewController是如此有限,我似乎无法以VC任何方式操纵. 有没有其他人遇到这个?任何解决方法?
当我运行在iPad上运行的代码时,SKStoreProductViewController它从左侧进入,大约一英寸,并在那里挂起直到被解雇.它看起来很实用,但它会让解雇时出现的VC混乱.
这是代码:
// Set up the store vc (creating it if not already done)
if (self.storeVC == nil) self.storeVC = [[SKStoreProductViewController alloc] init];
self.storeVC.delegate = self;
NSDictionary *params = [NSDictionary dictionaryWithObject:appID forKey:SKStoreProductParameterITunesItemIdentifier];
// Set up a HUD in case connecting to the store takes a while
[MBProgressHUD showHUDAddedTo:self.view animated:YES];
[self.storeVC loadProductWithParameters:params
completionBlock:^(BOOL result, NSError *error) {
[MBProgressHUD hideHUDForView:self.view animated:YES];
if (result) {
[self presentViewController:self.storeVC animated:NO completion:^{
}];
}
}]; …Run Code Online (Sandbox Code Playgroud) 我在我的申请中提供非消耗品.
假设用户购买该项目并尝试在具有相同ID的其他设备上安装该应用程序.如果用户已经登录并且已经购买了该项目,我想显示一些弹出并告诉用户您已经购买了它,所以现在免费下载.现在发生的事情是,当我再次点击购买项目时据说你已经购买了该项目点击下载.
有没有办法获取用户登录详细信息,并检查用户是否已经进行了应用程序内购买.
我登录并尝试购买已购买的商品时出现问题.两种警报视图不时出现.我正在使用沙盒环境.
你已经购买了它但尚未下载.点击即可立即下载.这个警报视图只有OK按钮.当我们按下Ok控制转到 - (void)failedTransaction:(SKPaymentTransaction*)事务
你已经购买了这个.点击确定再次免费下载.这个警报视图有两个按钮,一个是取消,另一个是好的.按下OK按钮控制转到 - (void)completeTransaction:(SKPaymentTransaction*)交易,这很好.
一个想法为什么交易显示这种奇特的行为.
谢谢
这是我第一次使用Store Kit,在我尝试恢复购买之前,一切都很顺利.我已经看到其他几个关于类似问题的堆栈溢出的帖子,但我找不到适用于我的解决方案.
我的应用程序中有一个按钮,可以调用[[SKPaymentQueue defaultQueue] restoreCompletedTransactions].这反过来触发了该SKPaymentTransactionObserver方法paymentQueueRestoreCompletedTransactionsFinished:.问题是paymentQueueRestoreCompletedTransactionsFinished:返回队列中的事务为零.
如果我然后尝试购买,我会收到通知我已经购买了.这告诉我商店知道我的测试Apple ID已经成功完成了之前尝试的购买.那为什么会paymentQueueRestoreCompletedTransactionsFinished:在它的队列中返回一个空事务集合?
有人提到沙箱行为不规律,但我需要看到这个工作在我上线AppStore之前.
有任何想法吗?我错过了什么吗?
提前致谢.
我正在为我们的iOS应用程序实现各种自动续订订阅的应用程序内购买.付款完成后,我们需要将交易信息发送到我们的服务器(云)以记录信息,以便我们可以在设定的时间间隔内验证收据,以确保订阅有效,不会取消/退款或续订.我们将在设定的时间间隔内从服务器进行JSON调用以通过应用程序内购买指南和我们的共享秘密进行此操作,但尚未达到此目的,但在此之前我们需要从购买中获取相关数据,即TransactionReceipt,它是一个NSData对象.
我们想要为TransactionReceipt向我们的Web服务发送两个参数(以及其他项目,例如购买的ProductID等).我们希望将此作为base64encoded值发送,这是我们认为需要在JSON请求中发送以进行验证的,因此我们将其存储在SQL Server中.
顺便说一句,使用MonoTouch/C#我们可以将NSData"TransactionReceipt"转换为base64encoded还有一个byte []吗?
谢谢.
我在我的应用程序中有很多一次购买IAP.用户可以很好地购买它们.
我的问题是,我与乱舞整合追踪真正的购买与只是一个购买的恢复,但我SKPaymentTransaction的transactionState总是回来的SKPaymentTransactionStatePurchased,而不是SKPaymentTransactionStateRestored.
显然SKPaymentTransactionStateRestored只会在- (void)restoreCompletedTransactions何时调用,但何时调用此方法?
我的思维过程是购买应该是这样的:1)用户选择产品,2)询问用户是否想购买X数量的产品.3)服务器检查用户之前是否购买过,以及是否已通过设置恢复SKPaymentTransactionStateRestored.否则,处理事务并设置SKPaymentTransactionStatePurchased.显然这是错的,我想- (void)restoreCompletedTransactions在两者之间的某个地方打电话???
谢谢,
将
我昨天发布了iOS 9.3和OSX 10.11.4(包括Swift 2.2),更新到最新版本的Xcode 7.3.
当我构建我的应用程序时,我收到一个错误,说明
Use of unresolved identifier 'SKErrorPaymentCancelled'我用来检查用户是否取消了付款.我没有做任何特别的事情,只需记录它(如下所示).
private func failedTransaction(transaction: SKPaymentTransaction) {
print("failedTransaction...")
if transaction.error!.code == SKErrorPaymentCancelled {
print("Transaction Cancelled: \(transaction.error!.localizedDescription)")
}
else {
print("Transaction Error: \(transaction.error!.localizedDescription)")
}
SKPaymentQueue.defaultQueue().finishTransaction(transaction)
}
Run Code Online (Sandbox Code Playgroud)
我在Swift 2.2更新日志中找不到任何内容,表明StoreKit中的任何内容都已更改.在我更新之前,这工作正常.
还有其他人看到这个问题吗?
我尝试SKStoreReviewController.requestReview()在我的iMessage扩展中调用,但它从不显示UI.我知道系统控制是否出现,但根据文档(https://developer.apple.com/documentation/storekit/skstorereviewcontroller/2851536-requestreview),它似乎应该至少出现一次.
如果我将调用移动到包含应用程序,它将按预期工作.整个用户体验基于imessage扩展,因此这不是一个真正可行的解决方案
我正在尝试使用 Xcode 12 和 StoreKit 配置文件验证收据,但不断收到 21002 错误。根据文档,我需要使用不同的证书。我生成了证书,但不清楚如何处理它?
#if DEBUG
let certificate = “StoreKitTestCertificate”
#else
let certificate = “AppleIncRootCertificate”
#endif
Run Code Online (Sandbox Code Playgroud)
这很好,但有什么用certificate?
我正在按照测试中断的应用内购买的步骤进行操作,如 Apple 文档中“测试中断的购买”标题下的概述。我的问题从第 6 步开始,其中指出:
“在您的代码中,观察付款失败。付款队列收到状态为 SKPaymentTransactionState.failed 的更新交易。”
这对我有用,但失败状态会触发我的 UI 显示错误警报,指出付款失败,即使它只是准备显示条款和条件页面。
有没有办法检测事务何时实际失败,而不是暂停以让其他操作发生?我原以为这里的 SKPaymentTransactionState 状态是deferred而不是failed,因为这样可以更容易地进行适当处理。