如何处理本机模式取消/错误事件(cordova-plugin-purchase)?

Posted

技术标签:

【中文标题】如何处理本机模式取消/错误事件(cordova-plugin-purchase)?【英文标题】:How to handle native modal cancel / error event (cordova-plugin-purchase)? 【发布时间】:2020-08-04 16:12:08 【问题描述】:

问题

当用户打开订阅页面时,会出现原生 iTunes 用户/密码模式。不管用户接下来做什么动作。输入密码或取消密码,我的代码不处理此事件。并且加载永远不会停止,购买按钮永远不会出现。

所以,应用程序每次都被拒绝,原因是:应用程序在订阅页面中无限期加载

任何想法如何解决这个问题?我无法得到它。 .cancelled() 不处理原生事件。

环境:

Ionic 5.1.1
Capacitor 2.3.0
Device: iPhone 6S ios 13.5.1
cordova-plugin-purchase: 10.2.0

应用初始化:

this.platform.ready().then(() => 
    this.registerProducts()
 )

registerProducts() 
    this.store.register([
        
            id: 'premium1',
            alias: 'premium',
            type: this.store.PAID_SUBSCRIPTION,
        ,
        
            id: 'product1',
            alias: 'product1',
            type: this.store.CONSUMABLE,
        ,
        
            id: 'product2',
            alias: 'product2',
            type: this.store.CONSUMABLE,
        ,
    ])
    this.store.refresh()

首页

this.platform.ready().then(() => 
    let m = this.store.get('premium')
        if (!m.owned) 
            this.setPremium(false)
            this.cdref.detectChanges() // Angular ChangeDetectorRef
        
)

然后订阅页面

this.platform.ready().then(() => 
    this.registerProducts()
    this.setupListeners()
    this.store.update()
 )

registerProducts() 
    let product = this.store.get('premium')
    
    if (!product) 
        this.loading = false
        this.productError = true
     else if (product.state === this.store.INVALID) 
        this.loading = false
        this.productError = true
     else 
        this.loading = false
        this.product = product
    

    this.cdref.detectChanges()


setupListeners() 
    this.store.when('premium')
        .error(e => 
            this.dissmissAlert()
            this.presentAlert(e.code, e.message)
        )
        .finished(() => 
            this.loading = false
            this.restoreLoading = false
        )
        .expired(() => 
            this.loading = false
            this.productError = true
        )
        .approved((p: IAPProduct) => 
            p.verify()
            this.cdref.detectChanges()
        )
        .verified((p: IAPProduct) => 
            this.setPremium(true)
            p.finish()
            this.cdref.detectChanges()
        )


purchase() 
    this.btnLoading = true
    
    try 
        this.store.order('premium').then(() => 
            this.btnLoading = false
        ).catch((err) => 
            this.presentAlert('', err)
        )
     catch (error) 
        this.presentAlert('', error)
    


restore() 
        this.restoreLoading = true
        this.store.refresh()
        this.cdref.detectChanges()

<ng-container *ngIf="productError">
    <div class="wait">
            <span class="text">Error with Subcription. Try again later.</span>
    </div>
</ng-container>

 <ng-container *ngIf="!productError">
    <ng-container *ngIf="loading">
        <div class="wait">
            <span class="text">Loading...</span>
            <ion-spinner class="spinner" name="crescent"></ion-spinner>
        </div>
    </ng-container>

    <ng-container *ngIf="!loading">
        <p class="act" *ngIf="product.owned">Subscribed</p>

        <button class="sub-btn" (click)="purchase()" *ngIf="!product.owned">
            <ion-spinner class="spinner" name="crescent" *ngIf="btnLoading"></ion-spinner>

            <ng-container *ngIf="!btnLoading">
                <span class="text">Subscribe  product.price  /  product.billingPeriod  мес.</span>
                <ion-icon class="icon" name="arrow-forward-circle" slot="end"></ion-icon>
            </ng-container>
        </button>
    </ng-container>
</ng-container>

【问题讨论】:

【参考方案1】:

registerProducts()setupListeners() 应在应用初始化时调用ONCE

【讨论】:

以上是关于如何处理本机模式取消/错误事件(cordova-plugin-purchase)?的主要内容,如果未能解决你的问题,请参考以下文章

如果用户取消 InApp 购买或只是另一个失败状态,如何处理

我可以/应该如何处理这个 git gc 错误? (rm:无法取消链接包权限被拒绝)

Node.js - 如何处理流错误事件

如何处理android中Listview中的点击事件?

如何处理 Twitter Bootstrap 中的模态关闭事件?

如何处理取消的定期付款