4

我正在使用 flashbuilder 4.6、Flex SDK 4.6 为 iOS 和 Android 创建一个移动应用程序。

我正在为 Google Cloud Messaging 使用 ANE,在为 iOS 编译时我想跳过它。flashbuilder 中是否有任何定义来检查它是为 iOS 还是 Android 编译,所以我可以跳过 GCM 导入。我不想在每次编译我的应用程序时更改我的编译器定义。

另一种方法是在编译器参数中使用 IF 语句:

if (compiling for ios)
    -define+=CONFIG::IOS,true
else
    -define+=CONFIG::IOS,false

是否可以做这样的事情,或者是否有任何内置编译器定义我可以在我的代码中使用?

编辑:包管理器有 3 个类:

  • NotificationManager.as
  • NotificationManagerIOS.as(适用于 iOS 的单例,使用来自 Air 的 RemoteNotification)
  • NotificationManagerAndroid.as (Singleton for Android,使用不支持 iOS 的 ANE)

为 android 编译很好,为 iOS 编译会在 ANE 的类上出现错误。

NotificationManager.as:

package managers {
    public class NotificationManager {
         public static function getInstance():NotificationManager {
              var ios:Boolean = (Capabilities.manufacturer.indexOf("iOS") != -1);
              if (ios) {
                   return NotificationManagerIOS.getInstance();
              } else {
                   return NotificationManagerAndroid.getInstance();
              }
         }
    }
}
4

1 回答 1

2

Flash Player AVM2 运行时是一个使用JIT编译器的虚拟机,因此您想要做的事情是不可能的。但是,有两种常见的方法可以解决此问题:

  1. 为每个部署目标单独编译,尤其是在嵌入式、特定于操作系统的支持文件很大的情况下。您可以将 IDE 项目设置为包含多个文件夹,以便为每个目标编译只需打开每个文件夹并编译内容。阅读 Christian Cantrell 的编写多屏 AIR 应用程序,了解如何为单独的部署目标设置项目。

  2. 如果嵌入式、特定于操作系统的支持文件很小,或者您只想管理一个项目文件夹,则可以通过使用flash.system.Capabilities确定其目标来指导运行时使用适当的文件:

    var isIOS:Boolean = (Capabilities.manufacturer.indexOf("iOS") != -1);

    var isAndroid:Boolean = (Capabilities.manufacturer.indexOf("Android") != -1)

于 2013-07-02T14:51:22.237 回答