1

Q / Aスタイルはすでに答えを知っているので、他の人も興味があるのではないかと思いました。明らかに、よりクリーンな実装と提案も大歓迎です。

Adobe Flexを使用すると、モバイルアプリケーションのクロスプラットフォーム開発が容易になりますが、プラットフォーム間で異なる機能が常にあり、それらを考慮する必要があります。

Flexはこれをネイティブ拡張機能を介して管理しますが、たとえばiOSのネイティブ拡張機能は、Androidアプリケーションにロードされるとプログラムを破壊します。

特に、各プラットフォームには独自のアプリ内購入APIがあります。このコードを含める決定は実行時ではなくコンパイル時に行う必要があるため(ParsleyやSwizなどが役立つ場合)、複数のストアAPIをクリーンに実装するにはどうすればよいですか?

4

1 に答える 1

0

条件付きコンパイルを使用して、コンパイル時に使用されている実際のストア実装クラスを交換しています。たとえば、iOSストアキットまたはAndroidストアのネイティブ拡張機能をデスクトップまたは他の種類の電話で実行しているときにロードしても機能しないため、コンパイル時に実行する必要があります。

私は多かれ少なかれシェルであるPurchaseServiceを作成しました。これは、ストア実装の1つを継承して実装するためだけに存在します。

CONFIG::AMAZON
{
import com.zo.comm.amazon.PurchaseServiceImpl;
}

CONFIG::DESKTOP
{ // used for testing without having to copy to a device
import com.zo.comm.desktop.PurchaseServiceImpl;
}

CONFIG::GOOGLE
{
import com.zo.comm.google.PurchaseServiceImpl;
}

CONFIG::IOS
{
import com.zo.comm.ios.PurchaseServiceImpl;
}

public class PurchaseService extends PurchaseServiceImpl
{...}

各PurchaseServiceImplは、PurchaseServiceクラスの外部インターフェースを定義する共有の汎用PurchaseServiceBaseから継承します。

このように、条件付きコンパイルコードはPurchaseServiceクラスにのみあります。さまざまなコンパイルフラグの管理は、Flash Builderでは少し面倒ですが、Antスクリプトでは、それらはmxmlcに簡単に渡されます。

Flash Builder:

-define=CONFIG::DESKTOP,false
-define=CONFIG::IOS,false
-define=CONFIG::ANDROID,true
-define=CONFIG::AMAZON,CONFIG::ANDROID&&false
-define=CONFIG::GOOGLE,CONFIG::ANDROID&&!CONFIG::AMAZON
-define=CONFIG::SANDBOX,false
-define=CONFIG::PRODUCTION,false
-define=CONFIG::STAGING,false
-define=CONFIG::LOCAL,true

条件付きコンパイルを他にどのように使用できるかを確認できるように、他にもいくつか残っていることに注意してください。私の設定フラグのほとんどは3つのグループなので、それらを綴ります。単純な「ANDROIDでない場合はIOS」の場合、AMAZONとGOOGLEで見られるように、IOSをtrueまたはfalseに設定し、ANDROIDを!CONFIG :: IOSに設定します(ただし、変更する必要があります)それは私がNookサポートを追加するとき...:-)。

Antの場合:

  <define name="CONFIG::DESKTOP" value="${output.config.environment.desktop}"/>
  <define name="CONFIG::IOS" value="${output.config.environment.ios}"/>
  <define name="CONFIG::ANDROID" value="${output.config.environment.ios}"/>
  <define name="CONFIG::AMAZON" value="${output.config.environment.amazon}"/>
  <define name="CONFIG::GOOGLE" value="${output.config.environment.google}"/>
  <define name="CONFIG::PRODUCTION" value="${output.config.environment.production}"/>
  <define name="CONFIG::STAGING" value="${output.config.environment.staging}"/>
  <define name="CONFIG::LOCAL" value="${output.config.environment.local}"/>
  <define name="CONFIG::SANDBOX" value="${output.config.environment.sandbox}"/>

インポートに条件付きコンパイルを使用する場合の注意:上記のように中括弧を使用する必要があります。以下は機能せず、最後のインポートが常に優先されます。

CONFIG::AMAZON
import com.zo.comm.amazon.PurchaseServiceImpl;

CONFIG::DESKTOP
import com.zo.comm.desktop.PurchaseServiceImpl;

CONFIG::GOOGLE
import com.zo.comm.google.PurchaseServiceImpl;

CONFIG::IOS
import com.zo.comm.ios.PurchaseServiceImpl;

Flash Builderでは、どのプラットフォームのビルドにどの拡張機能が含まれているかを管理する必要もあります。

于 2012-07-19T23:17:20.887 に答える