我使用Gdx-Pay跨平台化我的IAP。 一切都是从Libgdx的wiki中设置的:
if(PurchaseSystem.hasManager()){
config = new PurchaseManagerConfig();
config.addOffer(new Offer().setType(OfferType.ENTITLEMENT).setIdentifier(item1));
config.addOffer(new Offer().setType(OfferType.ENTITLEMENT).setIdentifier(item2));
config.addOffer(new Offer().setType(OfferType.ENTITLEMENT).setIdentifier(item3));
config.addOffer(new Offer().setType(OfferType.ENTITLEMENT).setIdentifier(item4));
//Stores
config.addStoreParam(PurchaseManagerConfig.STORE_NAME_ANDROID_GOOGLE, base64EncodedKey);
config.addStoreParam(PurchaseManagerConfig.STORE_NAME_IOS_APPLE, base64EncodedKey); // <-- CHANGE KEY
PurchaseSystem.install(new PurchaseObserver() {
@Override
public void handleInstall() {
message(" - purchase manager installed: " + PurchaseSystem.storeName() + ".\n");
// restore purchases
message(" - do a restore to check inventory\n");
//PurchaseSystem.purchaseRestore();
}
@Override
public void handleInstallError(Throwable e) {
message(" - error installing purchase manager: " + e + "\n");
// throw error
throw new GdxRuntimeException(e);
}
@Override
public void handleRestore(Transaction[] transactions) {
// keep note of our purchases
message(" - totally " + transactions.length + " purchased products\n");
for (int i = 0; i < transactions.length; i++) {
if(transactions[i].getIdentifier().equals(item1)) {
item1_purchased = true;
}
if(transactions[i].getIdentifier().equals(item2)) {
item2_purchased = true;
}
if(transactions[i].getIdentifier().equals(item3)) {
item3_purchased = true;
}
if(transactions[i].getIdentifier().equals(item4)) {
item4_purchased = true;
}
}
}
@Override
public void handleRestoreError(Throwable e) {
message(" - error during purchase manager restore: " + e + "\n");
// throw error
throw new GdxRuntimeException(e);
}
@Override
public void handlePurchase(Transaction transaction) {
message(" - purchased: " + transaction.getIdentifier() + "\n");
// dispose the purchase system
Gdx.app.postRunnable(new Runnable() {
@Override
public void run () {
message(" - disposing the purchase manager.\n");
PurchaseSystem.dispose();
message("Testing InApp System: COMPLETED\n");
}
});
}
@Override
public void handlePurchaseError(Throwable e) {
message(" - error purchasing: " + e + "\n");
// throw error
throw new GdxRuntimeException(e);
}
@Override
public void handlePurchaseCanceled() {
message(" - purchase cancelled.\n");
// dispose the purchase system
Gdx.app.postRunnable(new Runnable() {
@Override
public void run () {
message(" - user canceled! - disposing the purchase manager.\n");
PurchaseSystem.dispose();
message("Testing InApp System: COMPLETED\n");
}
});
}
},config);
} else {
utils.toast_error("Connection failure, check your internet's connection");
}
这是在我的&#34; create()&#34;核心课程中的方法。
我无法解决的问题是Android和Android之间的关系。 IOS IAP。 Apple有严格的规定购买只能恢复&#34;在一个按钮上。 但是我发现每次想要在我的应用程序中使用产品时强迫用户按下按钮都非常不方便。
我有一个产品表,每个产品都带有按钮,用于说明&#34;购买&#34; /&#34;使用&#34; ,取决于他们是否购买了产品。 所以我觉得非常讨人喜欢的方法是简单地检查&#34;如果用户在应用程序启动时拥有每个产品的所有权,并在迭代列表时应用标记(布尔值)。
我以为我可以使用&#34; handleRestore()&#34;为此,如我的代码所示。但显然(我不确定),遍历该列表以检查购买将使Apple拒绝我的应用程序,因为它将在没有用户请求的情况下发生。
那么我可以在不执行RESTORE请求的情况下以某种方式检查用户Google / Apple帐户的购买情况吗?
答案 0 :(得分:1)
另一种方法是将购买状态存储在首选项文件中,并在应用程序启动时从中读取。这适用于android和ios。
答案 1 :(得分:0)
在iOS上,您应该跟踪自己购买的内容。例如当用户购买东西时,写一个文件或一个偏好或一些其他持久的东西来跟踪。
使产品可用后,您的应用需要制作一个 持续的购买记录。您的应用使用该持久性 在发布时记录以继续使产品可用。它也是 使用该记录恢复购买,如恢复中所述 购买的产品。您的应用的持久性策略取决于类型 您销售的产品和iOS的版本。
在Android上,您也可以这样做,或者在Android上,您基本上可以在启动时调用“恢复购买”,让Android跟踪已购买的内容。