Как реализовать несколько API мобильных магазинов в одной базе кодов Flash / Flex?

1

Q/A, так как я уже знаю ответ, но я подумал, что другие люди могут быть заинтересованы. Очевидно, что более чистые реализации и предложения более чем приветствуются.

Adobe Flex обеспечивает легкую кросс-платформенную разработку для мобильных приложений, но всегда есть функциональность, которая отличается между платформами, которые должны учитываться.

Flex управляет этим с помощью собственных расширений, но родное расширение, скажем, iOS, сломает вашу программу, если будет загружено в приложение для Android.

В частности, каждая платформа имеет свой собственный API для покупки приложений. Как можно чисто реализовать несколько API-интерфейсов хранилища, так как это решение о включении кода должно быть сделано во время компиляции, а не во время выполнения (где-то вроде Parsley или Swiz было бы полезно)?

Теги:
mobile
flex
flash

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:

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

Заметьте, что у меня есть несколько других вещей, которые я оставил там, чтобы вы могли видеть, какие другие вещи вы можете использовать для условной компиляции. Поскольку большинство моих конфигурационных флагов представляют собой группы из трех, я просто извожу их. Если бы это было просто "это IOS, если это не ANDROID", я бы просто установил IOS в true или false, а ANDROID - в CONFIG :: IOS, как это видно в AMAZON против GOOGLE (хотя мне придется изменить что, когда я добавляю поддержку 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 вам также нужно будет управлять тем, какие расширения включены в рамки сборки платформы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню