如何处理本机模态取消/错误事件(cordova-plugin-purchase)?
How to handle native modal cancel / error event (cordova-plugin-purchase)?
问题
当用户打开订阅页面时,会出现本机 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>
registerProducts()
和 setupListeners()
应在应用程序初始化时被调用 ONCE。
问题
当用户打开订阅页面时,会出现本机 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>
registerProducts()
和 setupListeners()
应在应用程序初始化时被调用 ONCE。