0

以前の質問から私を覚えている人もいるかもしれません。Android用のアプリを作成していますが、うまくいっています。私が欲しかった機能のほとんどはうまく機能します。私は自分で基本を学びました (そしてここ StackOverflow の数人の寛大な人々の助けを借りて!) が、私はまだ自分自身を初心者だと考えています (今日の質問は、私がどれほどの初心者であるかを示します!)。

私のアプリは、特定の時点での国の歴史を示すダイナミック マップです。Google Play では、ユーザーは基本アプリ (ほとんどが空) を無料でダウンロードでき、アプリ内課金でパック (フランス、アメリカ、イギリスなど) を購入できます。それが私が立ち往生しているところです。

Milkman AndroidIAB ANE を購入し、ドキュメント ( this one ) を注意深く読みました。ライブラリに ANE を追加し、アプリケーション マニフェストを更新することができました。サンプル ファイルを変更して、公開鍵と購入可能なパックの ID を追加しました。(ANE がライセンスされているため、許可されているかどうかわからないため、ここにコードを投稿しません。)

私のアプリはそのように動作します:

  1. 最初の画面 : ウェブサイトへのリンクと「Enter」ボタンのあるロゴ。

  2. クリックすると、ユーザーはいくつかのボタン (パック/国ごとに 1 つ) のある画面に移動します。

  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
    };
    

EDIT 1:おそらく非常に簡単ですが、何をする必要があるかを理解するのに十分な経験がありません。アプリに一連のボタンがあります (「franceBtn」、「usaBtn」、「ukBtn」など)。これらのボタンをクリックすると、パック (「francePack」、「usaPack」、および「ukPack」) がユーザーによって所有されているかどうかを確認し、所有していない場合はアプリ内購入を開始する必要があります。ボタンに EventListener を追加しようとしましたが、何も起こりません。画面にもログにもありません。

2.問題1が修正されたとしましょう。私のアプリはオフラインで使用することを意図しています (追加のパックを購入する場合を除く)。私が読んだことを理解した方法は、アプリ内購入パックの「インベントリ」は Google Play を介して取得されるということです。つまり、ユーザーがオンラインである必要があることを意味します (私が間違っていなければ)。この「インベントリ」を保存するデバイス内に何らかのファイルを作成して、オフラインでアクセスできるようにする方法はありますか?

編集 2: ユーザーがオンラインでなくても、どこからでもアプリを使用できるようにしたい (明らかにパックを購入する場合を除く)。しかし、どのパックが既に所有されているかを知るために、アプリは Google Play をチェックしていると思います。そのため、所有しているパックの「インベントリ」をデバイス/アプリ内に直接保存する方法を探しています(オフラインでアクセスして、インターネットが開始するたびに更新できるようにします。より明確になることを願っています。指摘してくれてありがとうではなかった。

ドキュメントを何度も読みましたが、本当に行き詰まっています。助けていただければ幸いです。;)

前もって感謝します、ジェリル

編集 3: IAB に関連するコードの一部を次に示します (このチュートリアルに従って作成しました:ここですが、実際には理解できませんでした。学習したいと思っていますが、これは中級レベルのチュートリアルであり、何も見つかりませんでした本当の初心者のために何をすべきかを説明しているインターネット上. もし私が見つけられなかったリンクがあれば、私はすべて聞いています: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 セクションで製品が適切に設定されていることを前提としています。

最初の質問ですが、ボタンをクリックすると問題が発生するかどうかはわかりません。あなたのコードは次のようなものでなければなりません:

(2 つのパックがあり、その itemId が com.yourcomapny.packOnecom.yourcompany.packTwoであると仮定します)

franceBtn.addEventListener( MouseEvent.CLICK, onPackOneButtonClicked );

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

// Similarly for pack two

これは、あなたが書こうとしているコードとほぼ同じです。動作していないコードの一部を投稿していただければ、問題を解決できる可能性があります。

2 番目の部分で、「在庫」情報をオフラインで保存する場合は、次の方法で進めることができます。

1) 空のファイルを作成するとします。

2) ある人がcom.yourcompany.packTwoを購入し、あなたが購入成功イベントを受け取った場合、ファイルにcom.yourcompany.packTwoを追加して、購入済みとしてマークするだけです。

3) isPackOnePurchased または isPackTwoPurchased を呼び出すたびに、対応する itemId がファイルに存在するかどうかがチェックされ、このパッケージを購入する必要があるか、または既に購入されているかが判断されます。

これで始められます。ユーザー エクスペリエンスとセキュリティを強化するためのもう 1 つのことは、ユーザーがボタンをクリックしてパックを購入する (インターネットに接続している) ときはいつでも、そのパックがインベントリにあるかどうかを常に確認し、それに応じてフィードバックを表示することです。 . 矛盾がある場合は、常にローカルの状態をインベントリと同期してください。ユーザーがアプリケーション データを削除してからパックを開こうとすると、不整合が発生する可能性があります。このチェックにより、アプリケーションがサーバーの状態と同期されていることが保証されます。

次のレベルのセキュリティが必要な場合は、情報 (この場合はアイテム ID) を暗号化し、安全なデータベースに保存できます。

暗号化は、多数の暗号化方法を使用して行うことができます。そのような方法の 1 つがRijndael 暗号化です。このオンライン ツールを使用して、itemId の暗号化された文字列を生成できます。これにより、私が言おうとしていることを感じることができます。

AIR ベースのアプリケーションでローカル データベースに情報を保存する方法については、Adobe のこのリンクを参照してください。

于 2014-09-30T19:49:46.790 に答える