关于iOS自动续订订阅,我有以下问题
a)自动续订订阅是否真的在沙箱环境中自动续订?问题似乎是订阅不会自动更新,尽管文档说即使在沙盒环境中它也应该发生6次.
b)我们是否需要调用restoreCompletedTransactions来获取自动扩展订阅的新收据,或者是-paymentQueue:updatedTransactions:iOS自动调用的方法?(我猜它会自动调用'启动'和'旋转出背景'不确定)
c)您如何在多个设备上处理相同的订阅?这可以通过restoreCompletedTransactions来处理,但是调用它会提示用户输入密码,因此每次启动应用程序时调用它都不是很方便.
当用户首次从Google Play商店购买订阅时,我的应用会向我的服务器发送一张收据,其中包含包裹名称,订阅/产品ID和购买令牌.然后,我可以调用Purchases.subscriptions.get API来验证订阅.
我不清楚的是,一旦更新发生,我是否可以完全验证订阅服务器端?文档对此非常不清楚.
据我了解,使用V3购买API,应用程序需要轮询以查看订阅是否已续订,然后将新收据转发到服务器上.我假设购买令牌在续订时会有所不同,这表明不可能完全在服务器端实施续订检查.
我错过了什么吗?
android subscription in-app-purchase auto-renewing google-play
我正在实现一个自动更新的订阅方案,其中收据验证将由我的服务器端代码处理.根据Apple的文档,我将从中获取收据数据NSBundle
,并将该数据传递给我的服务器,该服务器将联系Apple以验证收据并通知应用程序结果.
现在我的问题与收据验证相关的必要流程有关:
如果用户购买了订阅,我的收据将自动更新来自该购买的信息?如果是这样,是否有必要在购买后立即验证收据,还是应该立即"解锁"应用程序?
在什么情况下我的收据会丢失NSBundle
?如果发生这种情况,我想我应该使用SKReceiptRefreshRequest
刷新收据,并将其发送到服务器进行验证.
如果用户在不同的设备上安装应用程序并恢复购买restoreCompletedTransactions
,我是否会同时自动获取收据?我想我需要在恢复后验证收据,以确保有一个有效的订阅,对吗?
当我的服务器尝试验证收据,并且该收据无效时,应用程序端会发生什么?刷新收据(将要求用户提供凭据)并再次将其传递给服务器以进行新的重新验证?
subscription in-app-purchase ios auto-renewing receipt-validation
我已经在沙箱环境中成功设置并测试了应用内购买.但我有一个问题:
在实际的应用内购买中,我可以通过以下链接关闭iOS设备上的自动续订订阅:http://support.apple.com/kb/HT4098? viewlocale = en_US&locale = en_US
我想知道如何在沙盒环境中做同样的事情.我认为我们必须在App Store中登录以关闭自动续订下标,但测试用户帐户无法登录App Store.所以我认为我们无法关闭沙盒环境中的自动续订下标.
如果是这样,我还需要一个简单的解释,为什么我们不能.
感谢阅读,任何帮助或指示将不胜感激.
我正在尝试使In-App Purchase
订阅提供工作。因此,我从服务器获取了编码的签名,随机数,时间戳和密钥标识符。我创建一个SKPaymentDiscount
对象并将其设置paymentDiscount
为SKMutablePayment
对象。
在第一个弹出窗口中,它显示了预期的修改价格->输入密码,然后继续->第二个弹出窗口:确认订阅:确定->第三个弹出窗口:显示以下错误无法购买 与开发商联系以获取更多信息。
我尝试传递产品的不适用的商品标识。然后它抛出了正确的错误说:这不能应用于此。
PromoOfferAPI.prepareOffer(usernameHash: "name", productIdentifier: "bundleid.product", offerIdentifier: "TEST10") { (result) in
switch result {
case let .success(discount):
// The original product being purchased.
let payment = SKMutablePayment(product: option.product)
// You must set applicationUsername to be the same as the one used to generate the signature.
payment.applicationUsername = "name"
// Add the offer to the payment.
payment.paymentDiscount = discount
// Add the payment to the queue for purchase.
SKPaymentQueue.default().add(payment) …
Run Code Online (Sandbox Code Playgroud) 在验证可更新订阅收据时,我试图获取最新收据的到期日期.
根据收据字段中的apple文档,"expires_date"字段应包含一个数字,该数字是自1970年1月1日00:00:00 GMT以来的毫秒数.(https://developer.apple.com/library/ios /releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html#//apple_ref/doc/uid/TP40010573-CH106-SW1)
当我获取字段但是我收到一个带有来自"expires_date"字段的格式化日期的字符串.还有一个名为"expires_date_ms"的字段似乎提供了正确的数据.Apple声明"以下未记录的密钥保留供Apple使用,必须由您的应用程序忽略."
这是我收据的一个例子:
{"quantity":"1",
"product_id":"com.testapp.test",
"transaction_id":"1000000135676121",
"original_transaction_id":"1000000135134855",
"purchase_date":"2014-12-15 06:53:54 Etc/GMT",
"purchase_date_ms":"1418626434059",
"purchase_date_pst":"2014-12-14 22:53:54 America/Los_Angeles",
"original_purchase_date":"2014-12-15 06:51:12 Etc/GMT",
"original_purchase_date_ms":"1418626272000",
"original_purchase_date_pst":"2014-12-14 22:51:12 America/Los_Angeles",
"expires_date":"2014-12-15 06:56:10 Etc/GMT",
"expires_date_ms":"1418626570000",
"expires_date_pst":"2014-12-14 22:56:10 America/Los_Angeles",
"web_order_line_item_id":"1000000028947356",
"is_trial_period":"false"
}]
Run Code Online (Sandbox Code Playgroud)
我应该使用哪个字段来获取最佳实践的过期日期?
我有一个带有 Nginx docker 容器的应用程序,在部署应用程序的主机(使用 Ubuntu 操作系统)中使用以下命令手动生成 TLS 证书:
certbot certonly --manual --manual-public-ip-logging-ok --preferred-challenges dns -d my.app.com
Run Code Online (Sandbox Code Playgroud)
当证书过期时,我必须更新它们。
但我不能certbot renew
为此目的使用以下命令,因为它会给出错误:
$ sudo certbot renew
Failed to renew certificate my.app.com with error: The manual plugin is not working; there may be problems with your existing configuration.
The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.')
Run Code Online (Sandbox Code Playgroud)
因此,我现在要做的是再次创建证书(使用certbot certonly
之前使用的相同命令)而不是更新它们。
如何使用certbot renew
命令修复错误?
我怎样才能自动化这个设置?
我今天特别密集吗?我正在开发一个应用程序,它需要为旧的iOS版本提供旧版订阅,并自动续订新版iOS的订阅.
通常情况下,我会使用respondsToSelector测试检查我想要使用的类中的适当的东西,但是我看不到storekit中有任何改变的东西可以让我进行测试.
那么我应该如何检查设备是否支持自动更新子设备?我知道我可以查看明确的iOS版本号,但我真的不想这样做.
我可以做一个更明智的检查吗?
我正在模拟在iPhone上的应用程序中购买自动续订订阅.我的问题是,购买被认为是由App商店完成的,而不是.
这是正在发生的事情:
我在第3步出现网络故障时遇到问题.我无法验证收据.但是如果用户试图再次购买,应用商店会告诉他他已经订阅了,即使我没有调用该finishTransaction
方法来完成购买!
这是预期的行为吗?app-store不应该将未完成的交易视为未完成交易,还是我错过了什么?我欢迎任何解决这个问题的建议.
-(void) userPurchase:(SKProduct*) product{
SKPayment *payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
NSLog(@"paymentQueue updatedTransaction");
for (SKPaymentTransaction * transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchasing:
break;
case SKPaymentTransactionStatePurchased:
[self recordSubscription:transaction];
break;
case SKPaymentTransactionStateFailed:
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
[self recordSubscription:transaction];
break;
default: NSLog(@"Default");
break;
}
};
}
-(void) recordSubscription:(SKPaymentTransaction*)transaction{
NSString *jsonObjectString = [self encode:(uint8_t *)transaction.transactionReceipt.bytes length:transaction.transactionReceipt.length];
NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithObjectsAndKeys:jsonObjectString,@"receiptdata", …
Run Code Online (Sandbox Code Playgroud) 我有不同的自动续订订购可能性iOS应用程序,我想提供它的用户,赚取免费一个月的时候,他们邀请朋友到应用程序的机会.
我知道如何处理我给一个尚未订阅的用户免费月份的情况,但我想知道如何处理一年中付费订阅中的用户并应该获得免费月份..
auto-renewing ×10
ios ×6
iphone ×4
subscription ×4
android ×1
certbot ×1
google-play ×1
manual ×1
node.js ×1
sandbox ×1
storekit ×1
swift ×1
ubuntu ×1