过去几天我一直试图测试我的第一个应用程序中的purchse iphone应用程序.不幸的是我无法找到与iTunes服务器通信以验证transactionReceipt的方法.
因为这是我第一次尝试使用这项技术,所以我选择直接从iPhone验证收据,而不是使用服务器支持.但是在尝试使用来自谷歌代码的JSON api创建的JSON onbject发送POST请求之后,itunes总是返回一个奇怪的响应(而不是我等待的"status = 0"字符串).
这是我用来验证收据的代码:
- (void)recordTransaction:(SKPaymentTransaction *)transaction {
NSString *receiptStr = [[NSString alloc] initWithData:transaction.transactionReceipt encoding:NSUTF8StringEncoding];
NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"algo mas",@"receipt-data",nil];
NSString *jsonString = [jsonDictionary JSONRepresentation];
NSLog(@"string to send: %@",jsonString);
NSLog(@"JSON Created");
urlData = [[NSMutableData data] retain];
//NSURL *sandboxStoreURL = [[NSURL alloc] initWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"will create connection");
[[NSURLConnection alloc] initWithRequest:request delegate:self];
}
Run Code Online (Sandbox Code Playgroud)
也许我忘记了请求标题中的内容,但我认为问题出在我用来创建JSON对象的方法中.
在将JSON对象添加到HTTPBody之前,它是如何看起来的:
string to send: {"receipt-data":"{\n\t\"signature\" = \"AUYMbhY
...........
D0gIjEuMCI7Cn0=\";\n\t\"pod\" = \"100\";\n\t\"signing-status\" = \"0\";\n}"} …Run Code Online (Sandbox Code Playgroud) 这曾经为我工作,但现在不再工作,我无法弄清楚为什么.我在我的应用中有应用内购买设置.我确认我有一套正确的产品标识符,并与itunesconnect中相应的应用内购买项目相匹配.这个电话是苹果公司的观点[productRequest start],但我从来没有得到过回复,尽管将代表委托给自己.我错过了什么?
NSLog(@"productIdentifiersSet: %@", productIdentifiersSet);
if ([productIdentifiersSet count]) {
SKProductsRequest *productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiersSet];
[productRequest setDelegate:self];
[productRequest start];
}
Run Code Online (Sandbox Code Playgroud)
.........
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
<never called>
}
- (void)requestDidFinish:(SKRequest *)request {
<never called>
}
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
<never called>
}
Run Code Online (Sandbox Code Playgroud) 我正在使用StoreKit进行应用内购买.当用户按下"取消"按钮时,我发现API的行为很古怪.
例如,如果我在"确认您的应用内购买"屏幕上按"取消",我会按照我的预期获得SKPaymentTransactionStateFailed交易error.code == SKErrorPaymentCancelled.
但如果我按下Buy然后按取消,我就会收到Failed交易error.code == 0.这error.localizedDescription是"无法连接到iTunes Store"这显然是一个谎言.
将所有Failed交易视为可忽略的取消很有诱惑力,但我也可以清楚地看到,如果设备在飞机模式下处于离线状态,我会得到一个Failed没有警报弹出窗口的交易; 在这种情况下,我应该通知用户解释问题.
我注意到MKStoreKit假设所有失败都是取消.MKStoreManager的failedTransaction方法不会被调用; MKStoreObserver总是要求transactionCanceled所有Failed交易.该MKStoreManager.h意见建议没有错误消息的transactionCanceled,这是有道理的,但谁就会通知给用户的Failed非交易取消?
处理这些故障的最佳做法是什么?我应该吞下错误吗?始终显示错误,即使它是多余的?
这是我第一次实施In App Purchases.在开发和测试我的In App Purchase时,我在购买过程中看到以下警告:

我的应用程序内购买工作完美,应用程序接近提交.
在提交应用程序之前我是否必须做一些事情(使"环境:沙盒"标签消失)或者在我提交时自动处理所有这些内容?
我刚刚添加了SKStoreProductViewController并从我自己的UIViewController中呈现了它.如果我将设备旋转到横向模式 - 只有标题适合宽度,其他部分将被截断
....
NSDictionary *parameters = @{SKStoreProductParameterITunesItemIdentifier:[NSNumber numberWithInteger:[productID integerValue]]};
[self.storeViewController loadProductWithParameters:parameters
completionBlock:^(BOOL result, NSError *error) {
if (result)
{
[presentingViewController presentModalViewController:self.storeViewController
animated:YES];
}
handler(result);
}];
Run Code Online (Sandbox Code Playgroud)


是否有可能在横向模式下调整"产品页面",使其看起来不错?
环境:iPhone 4S IOS 6.0.1
在StoreKit下载IAP内容包后,它会向我返回一个NSURL,如下所示:
文件://localhost/private/var/mobile/Applications/45EF2B3A-3CAB-5A44-4B4A-631A122A4299/Library/Caches/BA32BC55-55DD-3AA4-B4AC-C2A456622229.zip/
尽管我发现所有来源都声称StoreKit在下载后解压缩了内容包,但它还是通过ZIP传递给我.此ZIP可能包含内容包的文件结构.但是我如何解压缩呢?
我正在尝试为我的Mac应用设置应用内购买.购买产品工作正常,但我无法[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]工作.
设置事务观察器(否则购买将无效)并使用[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]恢复以前的所有购买.
StoreKit现在应该使用paymentQueue:updatedTransactions:恢复交易和paymentQueueRestoreCompletedTransactionsFinished:或paymentQueue:restoreCompletedTransactionsFailedWithError:报告成功或失败.但是没有这些方法被称为.绝对没有回应.
如果我使用[[SKPaymentQueue defaultQueue] restoreCompletedTransactions],我得到以下输出:
忽略restoreCompletedTransactions,因为已经恢复了事务
有很多讨论,其中restoreCompletedTransactions返回一个空结果.但就我而言,根本就没有结果.
我怎样才能知道出了什么问题?
我们的后端进行服务器端收据验证.为了检查可续订订阅的最后到期日期,我们查看latest_receipt_info中的信息.这种方法大多数时候都有效.
但是,我们遇到一些用户,即使有活动订阅,latest_receipt_info也只包含已经过期的初始订阅.我想知道是否有人已经遇到了这个错过交易的问题.这看起来非常奇怪,因为Apple没有返回正确的信息.这些用户收费正常,但Apple的回复并未反映出这一点.我错过了什么吗?文档远非伟大......谢谢!
iOS 9.2.1,Xcode 7.2.1,ARC启用
我使用下面的方法来检查的失败SKProductsRequest和SKReceiptRefreshRequest:
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error
{
NSLog(@"error: %@", error);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是具体的SKReceiptRefreshRequest.我正在测试两个条件,(1)当用户取消登录到iTunes Store以获取收据请求时,以及(2)当用户尝试登录并且没有连接时(飞机模式).
我收到以下错误:
没有连接时:
错误域= SSErrorDomain代码= 110"无法连接到iTunes Store"UserInfo = {NSLocalizedDescription =无法连接到iTunes Store,NSUnderlyingError = 0x13c76d680 {错误域= NSURLErrorDomain代码= -1009"无法连接到iTunes Store"UserInfo = {NSLocalizedDescription =无法连接到iTunes Store,NSErrorFailingURLStringKey =
{您的产品ID和相应的URI}
,_kCFStreamErrorCodeKey = 8,_kCFStreamErrorDomainKey = 12,NSLocalizedDescription = Internet连接似乎处于脱机状态.}}}
当用户点击取消时:
错误域= SSErrorDomain代码= 16"无法连接到iTunes Store"UserInfo = {NSLocalizedDescription =无法连接到iTunes Store,NSUnderlyingError = 0x13c6ac7b0 {错误域= AKAuthenticationError代码= -7003"(null)"}}
我使用原始错误代码来区分错误并触发相应的UI事件来处理错误状态.但我一直在这样做,却没有理解底层错误是什么.
两者之间的常见错误域是SSErrorDomain.
有人可以详细说明SSErrorDomain是什么以及它属于哪个框架?另外,您能否提供一些有关此域名的所有可能错误代码的有用文档?
提前致谢!
如何在 Xcode 12 中使用新的 .storekit 测试恢复购买?当我打电话时SKPaymentQueue.default().restoreCompletedTransactions(),它直接转到paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue)0 个事务。
在这段25 分钟的 WWDC 视频、这篇同样来自 Apple 的文档文章以及 Internet 上的任何少数教程中,都没有提到“恢复” 。更令我困惑的是我找不到任何关于此的抱怨/问题?!
我觉得我已经疯了。如果有人可以点亮一些灯,那就太好了。提前致谢!