0

有些人可能会从以前的问题中记住我。我正在为 Android 构建一个应用程序,并且进展顺利。我想要的大多数功能都很好用。我自己学习了基础知识(在 StackOverflow 上一些慷慨的人的帮助下!),但我仍然认为自己是初学者(今天的问题将告诉你我是多么的初学者!)。

我的应用程序是一个动态地图,显示一个国家在特定时间点的历史。在 Google Play 上,用户可以免费下载基础应用程序(大部分是空的),然后他可以购买应用程序内计费的包(法国、美国、英国等)。这就是我卡住的地方。

我已经购买了 Milkman AndroidIAB ANE 并仔细阅读了文档(这个)。我已经设法将 ANE 添加到我的库中并更新了我的应用程序清单。我修改了示例文件以添加我的公钥和可购买包的 ID。(我不在这里发布代码,因为我不知道我是否被允许,因为 ANE 已获得许可。)

我的应用程序是这样工作的:

  1. 第一个屏幕:带有网站链接和“Enter”按钮的徽标。

  2. 当点击时,用户到达带有几个按钮的屏幕(每个包/国家一个)。

  3. 如果用户点击他拥有的包,他将被发送到所选国家的地图。

  4. 如果他不拥有它,系统会询问他是否愿意购买并发送购买。

问题:(警告:其中一些值得当月的菜鸟,但我是来学习的,对吗?)

  1. 改编自 Milkman 示例的代码位于用作 DocumentClass 的外部 .as 文件中。如何将屏幕 2 按钮与 .as 文件中的功能链接?我试过这个,但它不起作用:

    franceBtn.addEventListener(MouseEvent.CLICK, checkAndPurchase);
    function checkAndPurchase (e:MouseEvent):void{
        purchasePack1(); 
    //function from the example, it checks if the pack is owned 
    // and send the user to the store if not
    };
    

编辑1:这可能真的很容易做到,但我只是没有足够的经验来理解我需要做什么。我的应用中有一系列按钮(比如“franceBtn”、“usaBtn”和“ukBtn”)。单击这些按钮时,需要检查包(“francePack”、“usaPack”和“ukPack”)是否归用户所有,如果不是,则开始应用内购买。我试图向按钮添加一个 EventListener,但没有任何反应。不在屏幕上,不在日志中。

2.假设问题1已解决。我的应用程序旨在离线使用(购买额外包除外)。我理解我所读内容的方式是,应用内购买的包的“库存”是通过 Google Play 获得的,这意味着(如果我没记错的话)用户需要在线。有没有办法在存储此“库存”的设备内创建某种文件,以便可以离线访问?

编辑 2:我希望用户能够在任何地方使用该应用程序,而无需在线(显然购买包除外)。但我猜该应用程序会与 Google Play 核对,以了解已拥有哪个包。所以我正在寻找一种方法将拥有的包的“库存”直接存储在设备/应用程序中(这样它就可以离线访问并在每次互联网启动时更新。我希望它更清楚,并感谢您指出它不是。

我已经阅读了很多次文档,我真的很困惑,所以请,我真的很感激任何帮助。;)

在此先感谢,杰瑞尔

编辑 3:这是我与 IAB 相关的代码部分(按照本教程制作:here,但我并没有真正理解它。我愿意学习,但这是一个中级教程,我什么也没找到在 Internet 上解释了如何为真正的初学者做。如果你有我找不到的链接,我都听到了 :D )

import com.milkmangames.nativeextensions.android.*;
import com.milkmangames.nativeextensions.android.events.*;
import flash.events.MouseEvent;


if (AndroidIAB.isSupported()) {
    AndroidIAB.create();
}


// listeners for billing service startup
AndroidIAB.androidIAB.addEventListener(AndroidBillingEvent.SERVICE_READY, onReady);
AndroidIAB.androidIAB.addEventListener(AndroidBillingEvent.SERVICE_NOT_SUPPORTED, onUnsupported);

// start the service
AndroidIAB.androidIAB.startBillingService("my_key");

function onReady(e: AndroidBillingEvent): void {
    trace("service now ready- you can now make purchases.");

}

function onUnsupported(e: AndroidBillingEvent): void {
    trace("sorry, in app billing won't work on this phone!");

}

// listen for inventory events

AndroidIAB.androidIAB.addEventListener(AndroidBillingEvent.INVENTORY_LOADED, onInventoryLoaded);
AndroidIAB.androidIAB.addEventListener(AndroidBillingErrorEvent.LOAD_INVENTORY_FAILED, onInventoryFailed);

function onInventoryLoaded(e: AndroidBillingEvent): void {
    for each(var purchase: AndroidPurchase in e.purchases) {
        trace("You own the item:" + purchase.itemId);
    }
}

function onInventoryFailed(e: AndroidBillingErrorEvent): void {
    trace("Something went wrong loading inventory: " + e.text);
}

// load the player's current inventory
AndroidIAB.androidIAB.loadPlayerInventory();

// listen for purchase events
AndroidIAB.androidIAB.addEventListener(AndroidBillingEvent.PURCHASE_SUCCEEDED, onPurchaseSuccess);
AndroidIAB.androidIAB.addEventListener(AndroidBillingErrorEvent.PURCHASE_FAILED, onPurchaseFailed);

function onPurchaseSuccess(e: AndroidBillingEvent): void {
    var purchase: AndroidPurchase = e.purchases[0];
    trace("you purchased the item " + purchase.itemId);
    AndroidIAB.androidIAB.loadPlayerInventory();
}

function onPurchaseFailed(e: AndroidBillingErrorEvent): void {
    trace("Something went wrong with the purchase of " + e.itemId + ": " + e.text);
}

franceBtn.addEventListener(MouseEvent.CLICK, onPackOneButtonClicked);

function onPackOneButtonClicked(e: MouseEvent) {
    if (purchase.itemId == "packone") {
        franceMap.visible = true;
    } else {
        AndroidIAB.androidIAB.purchaseItem("packone");
    }
}

谢谢你的耐心!杰瑞尔

4

1 回答 1

0

在继续之前,我假设您已在 Google Play 的 IAP 部分中正确设置了产品。

现在对于您的第一个问题,我不确定该问题是否存在,因为单击按钮并且对该事件要做的事情应该开箱即用。你的代码应该是这样的:

(假设你有两个包,它们的 itemId 是 com.yourcomapny.packOnecom.yourcompany.packTwo

franceBtn.addEventListener( MouseEvent.CLICK, onPackOneButtonClicked );

function onPackOneButtonClicked( event:MouseEvent )
{
  if( !isPackOnePurchased() )
  {
    purchasePackOne();
  }
}

// Similarly for pack two

这几乎是相同的代码,您正在尝试编写。如果您可以发布部分不起作用的代码,也许我们可以为您提供更多帮助。

对于您的第二部分,如果您想离线存储“库存”信息,您可以按照以下方式进行:

1)假设您创建了一个空文件。

2) 假设有人购买了com.yourcompany.packTwo并且您收到了购买成功事件,您只需将com.yourcompany.packTwo添加到文件中,从而将其标记为已购买。

3) 每当你调用 isPackOnePurchased 或 isPackTwoPurchased 时,它会检查文件中是否存在相应的 itemId 并决定该包是需要购买还是已经购买。

这会让你开始。增强用户体验和安全性的另一件事是,每当用户单击按钮购买包(并且他/她已连接到互联网)时,始终检查该包是否在库存中并根据该包显示反馈. 如果有任何不一致,请始终将您的本地状态与库存同步。如果用户删除他们的应用程序数据然后尝试打开包,则可能会出现不一致。此检查将确保您的应用程序与服务器状态同步。

如果您想要更高级别的安全性,您可以加密信息(在这种情况下为项目 ID)并将其存储在安全数据库中。

可以使用多种加密方法进行加密。一种这样的方法是Rijndael 加密。您可以使用这个在线工具为您的 itemIds 生成加密字符串。这会让你感觉到我想说什么。

有关如何在基于 AIR 的应用程序中将信息存储在本地数据库中,请参阅Adob​​e 的此链接

于 2014-09-30T19:49:46.790 回答