我想按照其电子商务跟踪指南中的说明,使用Google Analytics SDK for iOS v2跟踪应用内购买情况.
我在收到SKPaymentTransactionStatePurchased事务更新后正在执行以下操作:
- (void) trackTransaction:(SKPaymentTransaction*)transaction
{
NSString *transactionIdentifier = transaction.transactionIdentifier;
GAITransaction *gaiTransaction = [GAITransaction transactionWithId:transactionIdentifier withAffiliation:@"App Store"];
SKPayment *payment = transaction.payment;
NSString *productIdentifier = payment.productIdentifier;
SKProduct *product = [self productForIdentifier:productIdentifier];
NSString *productTitle = product.localizedTitle;
int64_t priceInMicros = product.price.floatValue * 1000000; // FIXME: Doesn't consider different currencies
[gaiTransaction addItemWithCode:productIdentifier name:productTitle category:nil priceMicros:priceInMicros quantity:payment.quantity];
gaiTransaction.revenueMicros = priceInMicros * payment.quantity; // FIXME: doesn't consider Apple's cut
id<GAITracker> tracker = [GAI sharedInstance].defaultTracker;
[tracker trackTransaction:gaiTransaction];
} …Run Code Online (Sandbox Code Playgroud) 我正在为我的应用实施应用内购买(即将发布),并为iOS6和iOS7提供支持.我的问题与iOS6和iOS7上的非续订订阅机制之间的差异有关,更具体地说,关于如何实现恢复.为了适应iOS6和iOS7,我实现了一个服务器端解决方案来启用恢复.我可以选择允许用户创建可以在不同设备上使用的用户名/密码(如果数据丢失,则使用同一设备)进行恢复.我的大部分工作基本上都在工作,但随着我的测试进展,我发现了一些奇怪的东西.
iOS7恢复过程的初始部分使用SKReceiptRefreshRequest刷新应用程序中的收据.当我从iOS7设备上删除应用程序时,重新安装(此时没有收据;使用iExplorer进行测试),并进行恢复,SKReceiptRefreshRequest恢复10次购买(我在测试期间为此特定用户创建) .其中一个是非消耗品,其中九个不续订.这让我很困惑.从Apple文档中,我预计只会在刷新的收据中看到非消费品购买.来自https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateLocally.html:
"消耗品和非更新订阅:在购买时,消费品或非续订订购的应用内购买收据会添加到收据中.它会保留在收据中,直到您的应用完成该交易.在此之后,下次更新收据时会将其从收据中删除 - 例如,当用户再次购买时,或者您的应用明确刷新收据时.
与非续订订阅有关,请访问https://developer.apple.com/in-app-purchase/In-App-Purchase-Guidelines.pdf:
使用iCloud或您自己的服务器跟踪购买情况,并允许用户将购买的订阅恢复到单个用户拥有的所有iOS设备

有人有任何见解吗?
问题:为什么SKReceiptRefreshRequest会在收据中留下非续订产品的购买?这是Apple文档中的错误还是还有其他事情发生?
14年2月23日; 更新:我最近在Apple上发布了一个错误报告.还没回来.虽然,实际上,我不希望这个"虫子"消失!
15年10月20日; 更新:似乎Apple实际上已经解决了这个"错误".现在,当我使用恢复时SKReceiptRefreshRequest(这似乎是Apple推荐的恢复方法,请参阅https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Restoring.html) ,我现在没有在收据中显示未续订的订阅购买.我只收到非消耗品(我的应用程序只有非续订订阅和非消耗品购买).在我写完这篇文章后,我会立即向Apple提交一份错误报告,他们的文档对预期的行为不明确.
到目前为止,我对此测试的测试包括我在iOS 8.4和iOS9上运行的应用程序(实际上因为我没有正确的设备运行生产版本,因此测试版为9.1 beta),因此看起来这是Apple的服务器端更改而不是严格说iOS /设备方改变.另请注意,到目前为止,我的所有测试都是在我的应用程序的开发版本中,因此在应用内购买沙箱中也是如此.我很快就会进行生产测试.
15年12月3日; 更新; 在Apple技术支持的提示下,我又进行了一些测试.这一次,在运行iOS9.2 beta 4(13C75)的iPad上.现在看来我们已经恢复"正常",不续订订阅.也就是说,当我进行恢复时,我再次看到收据中未续订的订阅.
我在我的应用程序中进行了应用程序内购买,iOS 8中的新增内容是"延期"交易,部分在技术说明中描述
我理解它的作用,我需要不阻止UI,并更新我的UI以反映事务状态是延迟的.但是,我应该在-(void)transactionDeferred:(SKPaymentTransaction *)transaction暂时忽略交易的方法中放置什么呢?
我只更新了用户界面吗?UI的内容应该是什么?我是否需要用"您的购买延期"等替换价格标签?我认为没有办法测试这个,至少我没有看到任何与我的沙箱测试帐户有关的事情.如果有办法完成整个过程,看看它是如何工作的,那对我来说会更有意义.
我们正在使用付款的服务器端验证,如此 -
对于特定用户,我们未在服务器上获得交易收据,因此无法验证收据.我们猜测在步骤2和3中出现了问题.如果在向服务器发送收据时出现连接问题,应用程序将在后续应用程序恢复时重试.
现在我们有一个丢失的交易收据和愤怒的用户.你怎么建议我们前进?我们怎样才能防止这种情况发生?我们可以遵循哪些指导方针或最佳做法来防止这种情况发生?
谢谢.
我的应用程序在IAP沙箱中进入了一些奇怪的状态...每次启动应用程序时都会询问特定测试用户的密码.我想由于未完成的交易.我真的想完成那笔交易,但这是不可能的.一些背景信息以及我为它做了些什么:
[[SKPaymentQueue defaultQueue] addTransactionObserver:self][SKPaymentQueue defaultQueue].transactions.count总是0如此,所以我无法手动完成未完成的交易唯一的问题是改变包ID,这在我的情况下是不可取的.希望有人知道如何摆脱未完成的交易的替代方法.
我想创建一个按钮,用户可以取消自动续订订阅(或重定向到App Store).
如果没有用户必须首先完成整个购买过程,这是否可能?如果是的话,你会怎么做呢?
对此事的任何想法将不胜感激!!
在使用旧 API 进行应用内购买的应用程序 ( StoreKit 1 ) 上。该应用程序已在 App Store 上发布。购买的是非消耗品。
在尝试迁移到StoreKit 2时,我无法恢复购买。具体显示和购买产品按预期工作,但是当删除并重新安装应用程序,然后尝试恢复购买时,我无法做到这一点。
我正在尝试使用新的 API 来恢复它们,但它似乎不起作用。到目前为止我已经尝试过:
我在应用程序的整个生命周期中监听交易更新,其中:
Task.detached {
for await result in Transaction.updates {
if case let .verified(safe) = result {
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个调用此方法的按钮,但除了提示使用 Apple ID 再次登录之外,它似乎根本没有任何效果:
try? await AppStore.sync()
Run Code Online (Sandbox Code Playgroud)
这不会返回任何项目
for await result in Transaction.currentEntitlements {
if case let .verified(transaction) = result {
}
}
Run Code Online (Sandbox Code Playgroud)
这不会返回任何项目
for await result in Transaction.all {
if case let .verified(transaction) = result {
}
}
Run Code Online (Sandbox Code Playgroud)
如前所述,我在购买该商品并删除该应用程序后尝试此操作。所以我确信它应该能够恢复购买。我在模拟器上使用Configuration.storekit …
这个问题与我在这里找到的其他问题略有不同.My In App StoreKit正在运行,我可以成功地在我的商店中列出产品.我已经浏览了Apple文档,从未看到我的问题(我可能已经错过了).
我的客户(非营利组织)希望能够通过他们的应用程序接受捐款.我想让他们能够动态添加新的捐赠活动,而无需用户更新他们的应用程序.我的意思是,他们可能有一个特殊的"帮助我们赞助即将到来的植树节活动",并接受特定于该案例的捐款.
我目前正在阅读这样的产品:
SKProductsRequest *request=
[[SKProductsRequest alloc] initWithProductIdentifiers:
[NSSet setWithObjects: @"goldSponsor", @"silverSponsor"];
Run Code Online (Sandbox Code Playgroud)
这意味着如果Arbor Day活动出现,我将不得不发布更新以在我的请求列表中包含@"arborSponsor".如何申请捆绑下的每件产品?
我尝试过使用@"com.thedomain.*"和其他一些没有运气的猜测.有可能返回整个列表,我错过了一些非常简单的东西吗?谢谢!
使用以下代码,SKStoreProductViewController可以显示应用程序的描述.
当我触摸"免费"按钮时,它会显示"安装应用".然后我触摸"安装应用程序",进度条显示在应用程序图标内.但是,进度条会在2-3秒内消失,应用程序仍会被卸载.
这是我的演示应用程序.有谁知道原因?
SKStoreProductViewController *skvc = [[SKStoreProductViewController new] autorelease];
skvc.delegate = self;
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"425349261" forKey:SKStoreProductParameterITunesItemIdentifier];
[skvc loadProductWithParameters:dict completionBlock:nil];
[self presentViewController:skvc animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud) 我正在iOS应用程序中进行自动更新订阅IAP.我打算在同一个订阅组中有3个不同的层.在我的测试中,我已经能够成功购买订阅,看到它在沙箱上更新了几次,然后在5或6次尝试后停止.这部分工作正常.但我想尝试从应用程序从一个层升级到更高层.这一次,当我尝试将带有新(升级)productID的SKPayment添加到支付队列时,我首先收到警告"你想要修改你的订阅......",然后我点击继续,我得到一个确认消息,但我也收到SKPaymentQueue: updatedTransactions状态失败的回调.错误说:
"失败的事务错误=错误域= SKErrorDomain代码= 0"无法连接到iTunes Store"UserInfo = {NSLocalizedDescription =无法连接到iTunes Store}
任何想法为什么会发生这种情况,以及是否甚至可以从沙箱测试订阅组更新?如果没有,那你将如何进行测试呢?