标签: storekit

StoreKit SKProductsRequest崩溃

我根据应用程序内购买编程指南使用以下代码来请求产品列表.它曾经在我的iPhone应用程序中正常工作,但现在每次请求产品列表时它都会崩溃.(void)productsRequest:(SKProductsRequest **)request didReceiveResponse:(SKProductsResponse **)response永远不会调用委托方法.

SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"my.product.identifier"]];
[request setDelegate:self];
[request start];
Run Code Online (Sandbox Code Playgroud)

正如我所说,它工作得非常好,然后停止工作.这是在调用上面的代码时发生的崩溃.

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000011
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                 0x000034f8 objc_msgSend + 24
1   StoreKit                        0x00003e18 -[SKProductsRequest handleFinishResponse:returningError:] + 40
2   StoreKit                        0x000050c4 -[SKRequest _requestFinishedNotification:] + 152
3   Foundation                      0x00019b9a _nsnote_callback + 150
4   CoreFoundation                  0x0006c2de __CFXNotificationPost_old + 390
5   CoreFoundation                  0x0001ab32 _CFXNotificationPostNotification + 122
6   Foundation                      0x000048e4 -[NSNotificationCenter postNotificationName:object:userInfo:] + 64
7   AppSupport …
Run Code Online (Sandbox Code Playgroud)

iphone crash delegates storekit in-app-purchase

17
推荐指数
1
解决办法
8431
查看次数

检测已取消的itunes登录提醒以进行应用内购买

我有一个实现的类SKPaymentTransactionObserver.但是,当单击购买按钮时,如果用户未登录到应用商店,则会收到警报,要求提供现有ID或创建新ID.如果用户点击取消此消息或后续登录凭据警报,则不会收到该取消的通知.点击购买按钮后,我有一个覆盖屏幕的活动视图,所以我真的需要知道登录提醒是否被取消.

我已经测试了错误代码SKErrorPaymentCancelled,如果在登录后取消购买过程,则可以使用.我正在设备上进行测试.

有线索吗?

-UPDATE-

道歉我忘了提到这只发生在尝试恢复交易时,并且揭示了答案:我对协议缺乏了解.

objective-c storekit ios

17
推荐指数
2
解决办法
3994
查看次数

错误域= SKErrorDomain代码= 2"无法连接到iTunes Store"UserInfo = 0x6083900 {NSLocalizedDescription =无法连接到iTunes Store}

我正在尝试使用测试帐户测试我的应用内购买.我第一次尝试购买应用内自动续订订阅,一切顺利,没有错误,交易完成如预期,交易状态更新为"SKPaymentTransactionStatePurchased".但是,当我测试用户尝试再次购买订阅的情况时,我不断收到上述错误.即使商店工具包框架显示一个说明用户已订阅的对话框,我的观察者也会将该事务视为状态失败(SKPaymentTransactionStateFailed).

storekit文档明确指出"如果用户试图购买他们已经购买的非消费产品或可更新订阅,您的应用程序将收到该项目的常规交易,而不是恢复交易.但是,该产品不会再次向用户收取费用你的申请应该将这些交易视为与原始交易的交易相同".就我而言,当我再次购买时,我一直将交易状态变为"失败".

有任何想法吗?这是在沙箱测试环境中.

iphone storekit

16
推荐指数
2
解决办法
8551
查看次数

检查自动续订订阅是否仍然有效

每当我打开应用程序时,我都想检查自动可续订订阅状态.

这是为了确保用户仍然订阅了该服务.我该如何实现这一目标?

有什么想法吗?谢谢

PS:我正在使用 SwiftyStoreKit

storekit ios swift swiftystorekit

16
推荐指数
2
解决办法
9352
查看次数

如何使用不续订的应用程序内购买支持多个设备?

我正在构建一个iOS应用程序,其中包含一个不续订的IAP.Apple在他们的IAP概述中提供了这个金块:

您需要向用户拥有的所有设备提供非续订订阅.不续订订阅不会自动同步到Store Kit的所有设备; 你必须自己实现这个基础设施.例如,大多数订阅由外部服务器提供; 您的服务器需要实施一种机制来识别用户并将订购购买与购买它们的用户相关联.

我想遵循这条规则:我希望我的用户能够利用他们在其他设备上的一台设备上购买的订阅.那么如何在iPhone和iPad上识别同一个用户呢?我知道您不能使用Apple ID,也不能依赖注册方法.

我刚才发现了这个问题 ; 那里给出的答案似乎不可行.其他人必须有更优雅的东西.

itunesconnect storekit in-app-purchase ios

15
推荐指数
1
解决办法
6793
查看次数

skstoreproductviewcontroller:如何在启动时打开"评级和评论"

我看到一些教程SKStoreProductViewController,例如: 在我的应用程序中打开App Store中的应用程序列表

但是,它始终SKStoreProductViewController在启动时打开"详细信息",如何以编程方式打开"评级和审核"

rating review storekit ios

15
推荐指数
1
解决办法
2325
查看次数

在服务器端收据验证失败时,我应该调用finishTransaction吗?

我使用服务器端收据验证.

客户的时候

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

被调用,并且transactionStateSKPaymentTransactionStatePurchased,客户端将收据发送到我们的服务器,我们的服务器验证它.

当服务器端收据验证成功时,客户端明显调用finishTransaction,没问题.

当服务器端收据验证失败时,由于apple临时返回非json,或者客户端发送了无效收据,或者其他什么,服务器将该信息返回给客户端.

接下来,我们的客户应该怎么做?我们打电话finishTransaction吗?

这导致无效的交易永远存在于队列中?喜欢在这个问题中说:iPhone应用程序内购买:收据验证

但如果您发现收据无效,则应完成关联交易.如果没有,您可能会在事务队列中永久存在额外的事务.这意味着每次你的应用运行时,每个事务都会调用一次paymentQueue:updatedTransaction:

但是,如果我们这样做finishTransaction,我们的宝贵用户将收到此收据(我们未能验证),对吧?

或者验证失败的交易在某个时期到期了吗?

这是在Apple的文档中的某处记录的吗?我在http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/Introduction/Introduction.html中找不到任何内容.

storekit ios

15
推荐指数
1
解决办法
1345
查看次数

使用自动可续订应用程序内购买时如何恢复正确的交易?

这个问题涉及自动可再生IAP以及如何恢复它们.这些链接:这个这个有没有帮助我很遗憾.

在我的应用程序中,我有用户订阅自动可再生应用程序内购买.他们可以订阅1个月,6个月或12个月.

订阅时,交易收据将发送到我的服务器以供以后验证.我不会立即验证收据,因为它会降低用户体验的速度(对苹果服务器的收据验证查询对我来说大约需要1到2秒).相反,我使用天真的方法并提供用户订阅的内容,而无需任何直接收据验证.我安排了一个cron作业,每天验证每个用户的收据,并撤销过期收据的权限.

既然苹果指南明确指出具有自动续订订阅的应用程序需要恢复功能,我选择实现它.

当我尝试在沙盒模式下恢复购买时,使用:

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

我不仅获得当前订阅,还获得回调中所有先前订阅(包括过时订阅):

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
Run Code Online (Sandbox Code Playgroud)

目前我已经尝试了大约30次IAP,这意味着上面的方法发送了30个不同的事务(过时和活动).对于这些交易中的每一个,我将交易收据上传到我的Web服务以供以后验证.

现在.如果最后一个事务具有过时的收据(但倒数第二个事务实际上是有效的),它将覆盖当前用户的当前(有效)收据,从而错误地撤销用户的权限.

基本上我的问题是,在调用时restoreCompletedTransactions我获得了过时和活动事务的列表.在服务器端,它们可能会互相失效.最理想的情况是,我只想检索一个事务(最相关)并将该收据发送到我的服务器以供以后验证.

总而言之,我想我的主要问题是:

如何确保仅恢复活动(即最新)事务?

cocoa-touch storekit in-app-purchase ios

15
推荐指数
1
解决办法
2861
查看次数

检测用户是否退还了应用购买项目中的"耗材"(应用购买系统中的Apple应用商店)

我到目前为止在线阅读,检测用户是否取消了应用内购买的唯一方法是使用我从用户的iPhone获取的收据数据,并检查该项目中是否存在cancellation_date,但据我所知,此字段仅在自动续订订阅项目上找到.

(至少我在网上看到的每篇帖子都是我发现在应用程序购买中谈论的,根本没有提到消耗品.)

因为它们总是存储在收据数据中,而消耗品存储在收据数据中,直到应用程序本身完成交易,一旦完成,该项目的购买交易将在完成处理后从收据数据中永久消失. iPhone.

所以我的问题是,如果用户要求取消从Apple购买的应用程序,这是一个消耗品,我是否也在收据数据中取回同一项目交易,其中包含cancellation_date字段?

我从未见过有人证实这一点.

如果有人可以在其中提供带有cancellation_date示例的receipt-data base64字符串,那将是很好的(如果这样做是合法的).

storekit ios receipt-validation

15
推荐指数
1
解决办法
1177
查看次数

如何使自动续订订阅与内部用户绑定,而不是苹果ID?

我似乎遇到了一堵砖墙,但基本上我在我的应用程序中的是用户的登录页面和创建帐户页面.当用户打开我的应用并创建新帐户时,他们的信息将存储在Firebase服务器(BaSS)上.

现在我的问题是我将如何制作它以便对于通过我的应用程序创建帐户的每个用户,他们可以选择订阅我的应用程序,并且此订阅仅对他们的帐户有效(不是苹果ID).目前,如果用户与我创建了一个帐户并继续说订阅服务,那么一切都可以访问应用程序的全部功能.

但是,当他们注销并创建另一个帐户时,因为现在它的订阅与用户的苹果ID相关联,另一个帐户或任何帐户可以完全访问该应用程序.不只是购买的那个.

所以我想我的问题是如何制作它以便每次订阅/购买都与我的内部用户相关联,而不是设备上登录的苹果ID.(基本上像pandoraspotify,您对应用的访问权限取决于您的帐户,而不是您的苹果ID)

根据苹果文档:

持续使用您自己的服务器将收据的副本连同某种凭据或标识符一起发送到您的服务器,以便您可以跟踪哪些收据属于特定用户.例如,让用户使用电子邮件或用户名以及密码向服务器标识自己.不要使用UIDevice的identifierForVendor属性 - 您不能使用它来识别和恢复同一用户在其他设备上进行的购买,因为不同的设备对此属性具有不同的值.

我如何使用Firebase做类似的事情?

storekit in-app-purchase ios firebase swift3

15
推荐指数
1
解决办法
1413
查看次数