当用户购买订阅时,我们运行调用purchase()的代码。订阅成功后,应用程序正确运行,导航到登录页面,用户登录后,进入我们的主视图。
然后,如果我退出应用程序并返回,付费墙会再次出现。 相反,它应该进入主视图。
我想通过检查
Purchases.getCustomerInfo()
我可以从 RevenueCat 获得更新的状态
const [isActive = false, setIsActive] = useMMKVBoolean(
storageKeys.purchases.isActive
); //to store on device
const [userId, setUserId] = useMMKVString(storageKeys.user.id); //to store on device
const [isReady, setIsReady] = useState(false);
const [sawPaywall, setSawPaywall] = useState(false);
const [isLoadingRestoreData, setIsLoadingRestoreData] = useState(false);
// initial configuration
useMySWR({
key: 'init_purchases',
fetcher: async () => {
try {
if (!APIKEY) {
throw new Error('Missing API Key for purchases');
}
if (isReady) return;
await Purchases.setLogLevel(Purchases.LOG_LEVEL.DEBUG);
Purchases.configure({ apiKey: APIKEY, appUserID: userId });
await getInfo();
} catch (e) {
console.error((e as Error).message);
!__DEV__ &&
Bugsnag.notify({
name: 'initPurchaseConfig Error',
message: (e as Error).message,
});
Bugsnag.leaveBreadcrumb('initPurchaseConfig Error', {
country: JSON.stringify(getLocales()?.[0]),
});
setMessage(['error', (e as Error).message]);
} finally {
setIsReady(true);
}
},
});
const getInfo = useCallback(async () => {
try {
const info = await Purchases.getCustomerInfo();
packageRef.current =
info?.entitlements?.active?.[entitlementName]?.productIdentifier;
const { isActive: isEntitled } =
info?.entitlements?.active?.[entitlementName] || {};
setIsActive(!!isEntitled);
if (isEntitled) {
setSawPaywall(true);
}
return info;
} catch (e) {
throw new Error((e as Error).message);
}
}, [setIsActive]);
const purchase = async (purchasePackage: PurchasesPackage) => {
try {
await Purchases.purchasePackage(purchasePackage);
await getInfo();
} catch (e) {
if ((e as Error).message !== 'Purchase was cancelled.') {
throw new Error((e as Error).message);
}
}
};
我已将此问题追溯到
info?.entitlements?.active?.[entitlementName].isActive
响应的 getCustomerInfo
部分的问题:它返回 false。
如果我按“恢复购买”,应用程序将正常运行。
是什么导致
isActive
为假,但恢复购买更新。 我知道getCustomerInfo
上有缓存,但感觉我做的事情好像是错误的?
如何初始化和检查购买权利?
编辑:我认为这是 RevenueCat
getCustomerInfo
的缓存问题,因为如果我让我的应用程序等待 5 分钟以上并刷新,它似乎会按预期工作。 那么我该如何解决这个问题呢?
这可能是识别/同步登录客户时出现的问题。 用户登录后添加
Purchases.syncPurchase
即可解决问题。