gpt4 book ai didi

ios - 如何在应用重启或重新安装时检查iOS中的订阅是否处于事件状态

转载 作者:行者123 更新时间:2023-12-01 16:05:12 25 4
gpt4 key购买 nike

我有一个带有订阅(不续订)的iOS应用( objective-c )。
当用户重新启动应用程序时,如何检查它是否仍处于 Activity 状态?
我已经阅读了很多有关此内容的信息,但并没有清楚地回答如何正确执行此操作。
我目前拥有的是在应用启动时注册TransactionObserver,

IAPManager* iapManager = [[IAPManager alloc] init];
[[SKPaymentQueue defaultQueue] addTransactionObserver: iapManager];
然后,当用户进行购买时,
- (void) paymentQueue: (SKPaymentQueue *)queue updatedTransactions: (NSArray *)transactions {
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchasing:
[self showTransactionAsInProgress:transaction deferred:NO];
break;
case SKPaymentTransactionStateDeferred:
[self showTransactionAsInProgress:transaction deferred:YES];
break;
case SKPaymentTransactionStateFailed:
[self failedTransaction:transaction];
[queue finishTransaction: transaction];
break;
case SKPaymentTransactionStatePurchased:
[self persistPurchase: transaction];
[queue finishTransaction: transaction];
break;
case SKPaymentTransactionStateRestored:
[self restoreTransaction:transaction];
[queue finishTransaction: transaction];stopBusy];
break;
default:
break;
}
}
}
因此,当用户首次订阅时,此方法工作正常。
但是我对您应该如何存储/跟踪此购买感到困惑。我存储在用户已订阅以启用应用程序功能的静态变量中,但是当用户重新启动应用程序时,应如何检查他们是否具有 Activity 订阅?
我使用的代码将预订存储在iCloud或NSUserDefaults中。
在iCloud中存储根本不起作用,当他们重新启动应用程序时,他们失去了订阅。可以在NSUserDefaults中存储,但是订阅最终将过期,并且可以退款或取消。如何检查它是否处于 Activity 状态?我可以存储订阅日期并假设持续时间,然后尝试检查一下自己,但这似乎非常错误。
另外,如果用户卸载了该应用程序并重新安装,或者获得了一部新手机/等,该怎么办。
- (void) persistPurchase: (SKPaymentTransaction*) transaction {
#if USE_ICLOUD_STORAGE
NSUbiquitousKeyValueStore *storage = [NSUbiquitousKeyValueStore defaultStore];
#else
NSUserDefaults *storage = [NSUserDefaults standardUserDefaults];
#endif
if ([transaction.payment.productIdentifier isEqualToString: SUBSCRIPTION]) {
[storage setBool: true forKey: SUBSCRIPTION];
[IAPManager upgrade];
}
[storage synchronize];
[self unlockPurchase: transaction];
}
为此,我认为我需要调用restoreCompletedTransactions。我认为不将订阅存储在NSUserDefaults中是有意义的,而是在每次应用启动时调用restoreCompletedTransactions。
但是从我阅读的内容来看,Apple似乎希望您使用“恢复购买”按钮来执行此操作?每次应用启动时都调用它是否有意义?
这将在您处理过的每笔付款中调用回调(我认为?),这些付款如何知道它们是否仍处于 Activity 状态?
我可以获取交易日期,但这不会告诉我付款是否过期,除非我假设付款未被取消并假定期限并自己检查日期?还是Apple只为您提供来自restoreCompletedTransactions的有效订阅/付款?
还需要再次调用finishTransaction进行还原吗?
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

最佳答案

当用户重新启动时,如何检查它是否仍处于 Activity 状态
应用程式?

https://developer.apple.com/documentation/storekit/in-app_purchase/persisting_a_purchase

对于非续订订阅,请使用iCloud或您自己的服务器保留
持久记录。

我认为最好使用服务器(这样您可以接收退款通知)而不是iCloud(您将不会收到通知)。
我猜你的意思是你想检查一下:

  • 不可退款的订阅尚未退款
  • 订阅尚未到期(期限尚未完成)。

  • 我假设您使用收据。这很重要,因为如果用户选择在未到期的订阅到期之前对其进行续订,则需要使用它来计算订阅的持续时间。

    因此,当用户首次订阅时,此方法工作正常。但是我很困惑
    有关如何存储/跟踪此购买的信息。我存储在静态
    用户订阅以启用应用程序功能的变量,但是
    当用户重新启动应用程序时,我应该如何检查他们是否拥有
    Activity 订阅?

    我认为,正确的方法是 检查存储在服务器中的记录。这是因为,Apple会将退款通知发送到您在服务器上配置的URL。
    该链接说明了如何通知您的服务器退款。
    https://developer.apple.com/documentation/storekit/in-app_purchase/handling_refund_notifications
    由于 ,苹果不会直接通知您的应用退款,因此您必须与服务器联系,以查看是否已退款。如何与服务器通信取决于您(定期轮询,推送通知等)。关键是,您应该在服务器上存储一条记录,并告知已经退款给您的应用程序,以便您可以决定是否撤消该功能。
    由于您需要在服务器上存储记录以检查退款,因此您也可以询问自己的服务器,订阅是否已过期。为此,您只需要在应用程序中存储一个标识符(NSUserDefaults等),以便您可以询问服务器该期限是否已到期。
    这比将订阅的结束日期简单地存储在应用程序中要好,因为如果您以不安全的方式存储结束日期,则用户可以简单地编辑文件并继续延长结束日期。苹果在以下 link中声明:

    存储收据需要更多的应用逻辑,但会阻止
    持久记录不会被篡改。
    由于您需要实施服务器来检查退款,因此使用服务器来检查订阅是否已过期很简单。

    可以在NSUserDefaults中存储,但是最终可以进行订阅
    已过期,可以退款或取消。如何检查是否
    活性?我可以存储订阅日期并假设持续时间
    并尝试检查一下自己,但这似乎非常错误。

    .....
    是的,我认为将订阅日期存储在设备上并不是的最佳方式,原因有以下几个:
  • 用户可以更改其设备上的时间来欺骗您的应用,然后继续使用您的订阅。完成后,他可以将时间重置为正确的时间。
  • 如果您以不安全的方式存储订阅到期日期,并且他的手机越狱了,他可以自己编辑日期。

  • 正确的方法是查询服务器。 这样,他将无法在他的设备上编辑时间来欺骗您的应用以扩展他的订阅。如果您存储的订阅日期不安全,他将无法“编辑”订阅日期。该应用程序只需将标识符发送到您的服务器,并收到有关订阅是否处于 Activity 状态的是或否响应。以下 link描述了如何执行此操作:

    将收据的副本以及凭据或凭证发送到您的服务器
    标识符,以便您可以跟踪哪些收据属于
    特定用户。例如,让用户对您的身份进行识别
    具有用户名和密码的服务器。不要使用identifierForVendor
    UIDevice的属性。不同的设备为此具有不同的值
    property ,因此您不能使用它来识别和恢复购买的商品
    由同一用户在另一台设备上。

    ..

    为此,我认为我需要调用restoreCompletedTransactions。我认为
    不要将订阅存储在NSUserDefaults中,
    但每次应用程序调用一次restoreCompletedTransactions
    开始。
    但是从我阅读的内容来看,Apple似乎希望您拥有一个“还原
    购买”按钮可以执行此操作吗?仅调用它是否有意义
    每次应用启动时?这将在每个
    您曾经为这些付款处理过的付款(我认为是??)
    知道他们是否仍然活跃吗?

    不,在您的应用每次启动时调用恢复购买不是一个好主意。 苹果明确表示不:
    https://developer.apple.com/documentation/storekit/in-app_purchase/restoring_purchased_products

    重要提示请勿自动恢复购买,尤其是当您的
    应用启动。恢复用户的App Store的购买提示
    凭据,这会中断您的应用程序流程。

    它还说:

    但是,在给定的条件下,应用可能需要其他方法
    情况:...
    您的应用使用非续订订阅-您的应用负责
    恢复过程。

    我认为,不必在每次启动应用程序时恢复购买-如果要在新设备上重新安装/安装,则恢复购买是有意的。它也不会告诉您订阅是否已经退款或有效,因为如果发出退款,Apple只会通知您的服务器URL。 每次应用启动时,您应该做的是查询服务器。
    苹果自己说要保持服务器上用户帐户的余额更新,以识别退款滥用情况。

    减少退款滥用,并确定重复退款的购买者
    将REFUND通知映射到服务器上的玩家帐户。
    监视和分析您的数据以识别可疑的退款 Activity 。
    如果您跨多个平台提供内容,请保持余额
    用户帐户已在您的服务器上更新。使用App Store服务器
    通知以获取接近实时状态更新
    影响您客户的交易。

    您应该实现“恢复购买”按钮,以处理用户卸载/重新安装应用程序/在其他设备上安装的情况。 ,当用户恢复购买时,您应该能够计算出需要与服务器进行对话的标识符,以检查订阅是否仍处于 Activity 状态(您可以只使用原始交易ID)
    您的收据将包含原始购买日期和产品ID,并且每次购买非续订订阅时都会更新。您可以通过调用刷新收据(SKReceiptRefreshRequest)来访问此数据,以便任何设备都具有收据,并且可以计算订阅期。

    我可以获取交易日期,但这不能告诉我是否
    付款是否到期,除非我认为付款没有取消,并且
    假设持续时间并自己检查日期?还是苹果只给
    您是否通过restoreCompletedTransactions激活了订阅/付款?

    在实现订阅行为时,首次启动订阅时,应将到期日期存储在服务器上。如前所述,Apple会将退款通知发送到您的服务器,因此,如果订阅已退款或过期,则应与服务器一起检查应用程序。还请记住-用户可以更改其设备的时间/日期来绕过您在设备上存储到期日期。但是,如果您正在使用自己的服务器进行检查,则他不能,因为他无法篡改您服务器上的时间。

    还需要再次调用finishTransaction进行还原吗?

    我使用swift,然后您只需调用restoreCompletedTransactions()。易于实现。
    另请: How to restore in-app purchases correctly?
    此时,您可能想知道,如果收据中包含每笔非续订订阅购买记录 ,那么为什么我需要服务器来检查订阅是否处于 Activity 状态?
  • 因为(对于非续订订阅)退款通知仅发送到您的服务器。收据上未提及它们。
  • 您可以使用收据来计算订阅的结束日期,但是它不会告诉您是否已退款。
  • 您仍然想与服务器核对,以便用户不能简单地在此设备上更改时间/日期来解决您的订阅期限。

  • 记得:
    每次用户购买非续订订阅时,都应确保服务器上的逻辑计算出正确的结束日期。例如,如果他选择在当前订阅到期之前购买非续订订阅,则应通过仅在当前订阅结束时才开始下一个订阅来正确计算结束日期。

    关于ios - 如何在应用重启或重新安装时检查iOS中的订阅是否处于事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63362493/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com