首页 > 解决方案 > iOS 上的 cordova-plugin-purchase:如果不先卸载应用程序,order() 将无法工作

问题描述

我们正在开发一个应用程序,它使用 Ionic (Angular) 和 Capacitor 以及cordova-plugin-purchase来提供订阅(每月和每年)。购买在 Android 上完美运行。但是,在 iOS 上,虽然第一次购买工作正常,但在购买到期后(通过取消订阅,因为它实际上是自动续订)并且用户再次购买任何产品(现在处于valid状态,因为它已经过期),调用该order()函数确实什么都不做。产品状态保持不变valid,JavaScript 控制台和 Xcode 中都没有写入日志。也没有错误。我们已验证我们的验证服务器正在返回正确的响应。但是,当我们卸载该应用程序并再次从 Xcode 安装它时,购买会再次开始工作,并调用order()功能确实再次显示购买对话框,并且事情按预期工作。直到订阅到期,他们再次尝试购买。

但是,如果产品尚未过期,并且用户尝试通过订阅另一种订阅类型来更改订阅,则调用该order()函数将按预期工作。只有当订阅过期时,它才会开始工作,直到应用程序被删除/卸载然后再次安装。

我们使用非常标准的代码来实现购买——我们尝试尽可能少地让它变得简单。

初始化:

    this.store.validator = 'https://xxxxxxx/api/app/purchased';

    this.store.register([
      {
        type: this.store.PAID_SUBSCRIPTION,
        id: this.YEARLY_SUBSCRIPTION
      },
      {
        type: this.store.PAID_SUBSCRIPTION,
        id: this.MONTHLY_SUBSCRIPTION
      }
    ]);

    this.subscriptions.add(
      this.status.userData.subscribe(ud => {
        this.user = ud;
        this.store.applicationUsername = ud.id.toString(10);
      })
    );

    this.store.when(this.YEARLY_SUBSCRIPTION)
      .cancelled(this.purchaseCancelled)
      .updated(this.purchaseYearlyUpdated)
      .approved(this.purchaseApproved)
      .verified(this.purchaseVerified)
      .owned(this.purchaseOwned);

    this.store.when(this.MONTHLY_SUBSCRIPTION)
      .cancelled(this.purchaseCancelled)
      .updated(this.purchaseMonthlyUpdated)
      .approved(this.purchaseApproved)
      .verified(this.purchaseVerified)
      .owned(this.purchaseOwned);

    this.store.error(this.handleError);

    this.store.autoFinishTransactions = true;

    this.store.refresh();

其他功能:

  purchaseCancelled = (p: IAPProduct) => {
    console.log(`${ p.id } cancelled`);
  }

  purchaseYearlyUpdated = (p: IAPProduct) => {
    console.log(`${ p.id } updated`);
    this.yearlyProduct = p;
    this.changeDetectorRef.detectChanges();
  }

  purchaseMonthlyUpdated = (p: IAPProduct) => {
    console.log(`${ p.id } updated`);
    this.monthlyProduct = p;
    this.changeDetectorRef.detectChanges();
  }

  purchaseApproved = (p: IAPProduct) => {
    console.log(`${ p.id } approved`);
    p.verify();
  }

  purchaseVerified = (p: IAPProduct) => {
    console.log(`${ p.id } verified`);
    p.finish();
  }

  purchaseOwned = (p: IAPProduct) => {
    console.log(`${ p.id } owned`);
  }

  handleError = (error) => {
    console.log('Error event:', error);
  }

  purchase(id: string) {
    this.store.order(id);
  }

  ngOnDestroy() {
    this.subscriptions.unsubscribe();
    this.store.off(this.purchaseCancelled);
    this.store.off(this.purchaseYearlyUpdated);
    this.store.off(this.purchaseMonthlyUpdated);
    this.store.off(this.purchaseApproved);
    this.store.off(this.purchaseVerified);
    this.store.off(this.purchaseOwned);
    this.store.off(this.handleError);
  }

重现步骤:

  1. 从 Xcode 安装应用程序。
  2. 购买产品(用户点击购买按钮,该按钮触发 store.order)
  3. 退出应用
  4. 取消订阅,使其过期
  5. 订阅到期
  6. 打开应用,确认订阅确实过期(状态从已批准变为有效)
  7. 尝试通过单击购买按钮再次购买订阅(任何订阅)
  8. 什么都没发生。没有日志。没有错误。产品状态保持有效。
  9. 关闭应用程序然后再次运行无济于事。
  10. 卸载应用
  11. 从 Xcode 再次安装应用程序
  12. 再次购买作品

我看不出代码有什么问题,而且由于它在 Android 上运行良好,我们猜测可能是手机或 cordova-plugin-purchase 插件有问题。

我真的很感激任何建议,想法,意见,任何东西。非常感谢您提前。我越来越绝望了。

标签: iosionic-frameworkin-app-purchasecordova-pluginscapacitor

解决方案


推荐阅读