RN內購GitHub上也有很多封裝好的模塊,不過基本上都是國外的,包含Google的Android iap,對國內來說不需要,而且也沒有丟單的處理,于是根據自己需要封裝了一個,就兩個文件,沒必要用npm了,直接拖到Xcode中使用。
GitHub地址:https://github.com/vincent-cihan/RNInAppPurchaseModule
一、調用API一覽
// 1.獲取與服務器交互驗證失敗,緩存下來的漏單數組
const iapUnverifyOrdersArray = RNInAppPurchaseModule.iapUnverifyOrdersArray;
// 2.注冊iap,監聽并處理因App意外退出產生的漏單
RNInAppPurchaseModule.addTransactionObserverWithCallback((error, purchase) => {
});
// 3.與服務器驗證成功,刪除緩存的憑證
RNInAppPurchaseModule.removePurchase(purchase);
// 4.與蘋果服務器交互,加載可賣的內購商品
RNInAppPurchaseModule.loadProducts(iapProductIds, (error, products) => {
});
// 5.購買某個商品 ProductId:蘋果內購商品ID,myProductId:自己服務器商品ID(用來傳回給服務器,字段名可以自己去文件里修改)
RNInAppPurchaseModule.purchaseProduct(ProductId, myProductId, (error, purchase) => {
});
// 6.恢復購買
RNInAppPurchaseModule.restorePurchases((error, products) => {
});
二、兩種漏單內購情況
1.App已經監聽到蘋果的購買成功回調,并且獲得了內購憑證,再與服務器交互的過程中,驗證失敗(網絡問題、或者服務器與蘋果驗證時產生問題)。這時需要緩存內購憑證,在適當的時候重新與服務器驗證。
2.用戶購買過程中,App尚未接收到蘋果購買成功回調,App意外閃退(沒電、異常關機)。這時需要在App下次啟動時,重新監聽蘋果購買回調并處理。
三、內購邏輯
以下是在我自己項目中的邏輯,可以根據自己項目需要調整:
1.在App啟動時,注冊iap并檢查有無漏單內購,如有,向服務器驗證漏單內購
// 注冊通知并檢查漏單內購
async registAndCheckIap() {
// 處理與服務器交互失敗,緩存下來的漏單
const iapUnverifyOrdersArray = RNInAppPurchaseModule.iapUnverifyOrdersArray;
for (let purchase of iapUnverifyOrdersArray) {
// TODO: 與服務器交互驗證購買憑證
console.log(purchase);
......
// 驗證成功,刪除緩存的憑證
RNInAppPurchaseModule.removePurchase(purchase);
}
// 注冊iap,監聽并處理因App意外推出產生的漏單
RNInAppPurchaseModule.addTransactionObserverWithCallback((error, purchase) => {
// TODO: 與服務器交互驗證購買憑證
console.log(purchase);
......
// 驗證成功,刪除緩存的憑證
RNInAppPurchaseModule.removePurchase(purchase);
});
}
2.進入商品列表頁面,請求所有可賣iap商品
// 加載iOS內購商品
if (iOS) {
RNInAppPurchaseModule.loadProducts(this.state.iapProductIds, (error, products) => {
});
}
3.購買商品并驗證
if (iOS) {
RNInAppPurchaseModule.purchaseProduct(produceId, myProductId, (error, result) => {
if (error) {
BXAlert.showTipAlert('提示', error || '購買失敗');
} else {
// TODO: 與服務器交互購買憑證
console.log(result);
......
// 驗證成功,刪除緩存的憑證
RNInAppPurchaseModule.removePurchase(result);
}
});
}