1

Q/A 风格,因为我已经知道答案,但我认为其他人可能也会感兴趣。显然,更清洁的实现和建议也非常受欢迎。

Adobe Flex 允许对移动应用程序进行轻松的跨平台开发,但必须考虑到平台之间的某些功能不同。

Flex 通过本机扩展来管理这一点,但如果将 iOS 的本机扩展加载到 Android 应用程序中,则会破坏您的程序。

特别是,每个平台都有自己的应用内购买 API。一个人如何干净地实现多个商店 API,因为这个代码包含决定需要在编译时而不是运行时做出(像 Parsley 或 Swiz 这样的东西会很有用)?

4

1 回答 1

0

我正在使用条件编译来换出编译时使用的实际存储实现类。它必须在编译时完成,因为在桌面或其他类型的手机上运行时加载 iOS Storekit 或 Android 存储本机扩展将不起作用。

我创建了一个或多或少是一个外壳的 PurchaseService,它的存在只是为了继承并因此实现其中一个商店实现:

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 都继承自一个共享的通用 PurchaseServiceBase,它定义了 PurchaseService 类的外部接口。

以这种方式,唯一的条件编译代码位于 PurchaseService 类中。在 Flash Builder 中管理各种编译标志有点麻烦,但在 Ant 脚本中,它们很容易传递给 mxmlc:

闪存生成器:

-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

请注意,我在其中留下了一些其他东西,以便您可以查看可能使用条件编译的其他东西。由于我的大多数配置标志都是三个一组,我只是把它们拼出来。如果它是一个简单的“如果不是 ANDROID,那就是 IOS”,我只需将 IOS 设置为 true 或 false 并将 ANDROID 设置为 !CONFIG::IOS,正如在亚马逊与谷歌中所见的那样(尽管我必须改变当我添加 Nook 支持时... :-)。

在蚂蚁中:

  <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 回答