为我的应用内购买运行测试(第一次在应用内购买).我在这段代码的第三行得到了EXC_BAD_ACCESS:
SKPayment *payment = [SKPayment paymentWithProduct:electronicProd];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] addPayment:payment];
Run Code Online (Sandbox Code Playgroud)
这是一个按钮的IBAction.electronicPack在标题中声明为SKProduct.在productsRequest didReceiveResponse中抛出了一些NSLog,当请求产品时(在viewDidLoad中),他们表明它正确地获取产品并将其存储在electronicPack中.在didReceiveResponse页面中将electronicPack定义为[[request.products] objectAtIndex:0].所以是的.多数民众赞成在哪里,不知道该怎么做.任何帮助表示赞赏.
更新:FIXED意外遗留在添加额外事务观察器的代码中lol
我已经查看了iOS StoreKit中与"无法连接到iTunes商店"相关的许多现有问题,我认为我的情况不包括在内:
在iOS模拟器中运行时,恢复之前购买的应用内购买后出现"无法连接到iTunes商店"错误.如果我点击取消,则弹出窗口消失,恢复成功.
购买应用内购买时,只有在恢复时才会出现问题.
此外,问题只出现在模拟器上,而不是在真正的iPhone上进行测试时.
我很确定一切都好,只是想确认它只是一个模拟器错误.还有谁见过这个?
我有一些用户报告说,在尝试购买应用程序后,该应用程序现在在启动时崩溃.我已要求他们删除并重新安装尚未运行的应用程序,并试图让他们进入飞行模式以停止任何无效的网络通信.
我无法在我的设备上复制错误,我的应用程序购买在沙箱和生产模式中完成得很好.我的想法是,他们的事务以某种方式收到了一个nil productIdentifier,导致启动崩溃,但我不确定在app启动时调用哪些事务观察器方法,我可以为他们解决问题.
有没有办法"清除"事务队列或在启动时测试nil productidentifier并允许这些用户至少再次运行应用程序?我已经使用下面的代码完成了几百个应用内购买,而这最近刚开始发生.在app启动时调用哪个辅助方法?
在AppDelegate.m中
[[SKPaymentQueue defaultQueue] addTransactionObserver:[MovieClockIAPHelper sharedHelper]];
Run Code Online (Sandbox Code Playgroud)
在app帮助程序代码中:
- (id)initWithProductIdentifiers:(NSSet *)productIdentifiers {
if ((self = [super init])) {
// Store product identifiers
_productIdentifiers = [productIdentifiers retain];
// Check for previously purchased products
NSMutableSet * purchasedProducts = [NSMutableSet set];
for (NSString * productIdentifier in _productIdentifiers) {
BOOL productPurchased = [[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier];
if (productPurchased) {
[purchasedProducts addObject:productIdentifier];
NSLog(@"Previously purchased: %@", productIdentifier);
}
else{
NSLog(@"Not purchased: %@", productIdentifier);
}
}
self.purchasedProducts = purchasedProducts;
}
return self;
}
- (void)requestProducts …Run Code Online (Sandbox Code Playgroud) 我已经阅读了iOS 10.3中提供的这一新功能,并认为它将更灵活,开箱即用.但是在我阅读了文档后,我发现你需要决定显示它的时间和调用它的viewController.有没有什么方法可以让我在任何一个viewController在那一刻显示的随机时间后触发它?
有时我会在文本中遇到一个非常讨厌的对话框:"点击继续并登录以检查下载." 如果我登录(使用沙箱用户)或点击取消,则会立即再次显示该对话框.
我正在使用非续订订阅和非消费品.
任何想法如何摆脱这个对话?
谢谢
/马丁
在iTunes Connect中,可以为自动续订订阅提供免费试用期.
App > Manage In App Purchases > Subscription Basic > 1 Month > Offer a free trial?
Run Code Online (Sandbox Code Playgroud)
如何在客户端获取此信息?SKProduct我可以看到没有关于此的任何信息.由于我们正在进行营销活动,因此最终用户看不到有关产品的信息有试用期非常困惑.
当然可以从我维护的服务器获取这种信息,但是我们将有更新我们的服务器和iTunes Connect的开销.所以我不接受这种答案,除非它连接起来从Apple的服务中检索试用期信息.

我的意思是,我的步骤应该是什么?
1)得到
SKPaymentTransactionStatePurchased2)从SKPaymentQueue中删除它并提供内容
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];3)验证收据然后,如果它无效,则阻止我刚刚提供的内容
或者我应该将第二步改为第三步?
1)得到
SKPaymentTransactionStatePurchased2)验证收据然后,如果它无效,则不提供内容
3)
SKPaymentQueue无论如何都要将它取下[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
在第一种情况下,用户可以在购买后立即关闭互联网,因此我将无法验证收据.但是在第二步中,在步骤1和步骤2之间可能会出现一些互联网问题,所以我不会完成交易,也不会提供内容,这将是糟糕的用户体验.
那你选择了什么样的应用程序?为什么?
我的选择
我选择了第二种情况,因为选择第一种方案会让我的应用程序很容易被iAP Cracker破解.
情况:
- 用户进行IAP并获得一些内容,我们存储用户设备ID以确保他们可以随时访问此内容.
- 用户认为他们不喜欢这些内容,因此他们致电Apple并获得退款.
- 即使已经为其IAP退款,用户仍然可以访问内容
问题:
我们不希望用户再次访问此内容.这可能成为他们利用的漏洞.(解锁内容,然后获得退款并保持对所述内容的访问权限)
问题:我们
是否有办法检查用户是否已使用transactionId,transactionReceipt或我们可能拥有的任何其他信息退还IAP?
作为参考,我已经阅读了StoreKitGuide,它没有提到这种情况.
我正在添加通过iOS SDK的StoreKit API购买自动更新内容的功能.
在我的iOS设备上的沙箱中测试时,同意购买后,警报中会显示以下消息:
分享您的信息?[app name here]的发布者希望根据他们的隐私政策使用您的姓名,电子邮件和邮政编码.
使用"不允许"和"允许"按钮
我不想/需要这些信息,也不想通过提示来惹恼我的用户.但是,我无法弄清楚如何禁用此提示来收集私人信息.
任何提示表示赞赏!
我在iOS上进行应用内购买时遇到问题.我在游戏中有5个应用内购买,所有这些都在iPhone 6(iOS 8.3)上测试时完全按照预期工作.当我在iPad Air 2(iOS 8.2)上进行测试时,所有IAP都会立即失败.还有其他人遇到过这个问题吗?是否有一些我必须添加的特定于iPad的代码?
编辑:奇怪的是,将iPad更新到iOS 8.3修复了这个问题.关于为什么会出现这个问题的任何想法?我应该将我的应用程序更改为仅支持iOS 8.3及更高版本吗?
为了测试应用程序,我使用的是TestFlight,相同的网络连接和相同的Apple ID.
我用于应用程序内购买的代码如下:
func inApp() {
if (SKPaymentQueue.canMakePayments())
{
var productID:NSSet = NSSet(object: product_id);
var productsRequest:SKProductsRequest = SKProductsRequest(productIdentifiers: productID as Set<NSObject>);
productsRequest.delegate = self;
productsRequest.start();
}else{
displayAlert()
}
}
func buyProduct(product: SKProduct){
var payment = SKPayment(product: product)
SKPaymentQueue.defaultQueue().addPayment(payment);
}
func productsRequest (request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
var count : Int = response.products.count
if (count>0) {
var validProducts = response.products
var validProduct: SKProduct = response.products[0] as! SKProduct
if (validProduct.productIdentifier == product_id) …Run Code Online (Sandbox Code Playgroud)