GeneXus 15 以降では、ネイティブモバイル用の拡張を容易に開発できるように、拡張ライブラリの概念が導入されています。
ライブラリとは、スマートデバイス用の拡張ポイント (
ユーザーコントロール、
外部オブジェクト、外部プロバイダーなど) の実装の詳細をグループ化する手段です。主に次の 2 つのコンポーネントで構成されます:
- *.library 拡張子を持つ、XML に似たファイル。開発者は、各プラットフォームの拡張コンポーネントとそれらの実装内容をこのファイルにリストします。
- 実装に必要なバイナリとその他の依存ファイル。
*.library ファイルでは、特別な意味を持つタグを定義します:
- <ExtensionLibrary>...</ExtensionLibrary>
ライブラリファイルの開始と終了を示すルートタグです。
- <DependsOn>...</DependsOn>
.library に必要な依存関係を宣言します。最初は、タイプ <ExtensionLibrary>
ExtensionLibraryName</ExtensionLibrary> のノードのみが許可されます (ここで、
ExtensionLibraryName は、依存する拡張ライブラリの名前を含む文字列です)。たとえば、FirebaseAnalytics 拡張ライブラリは Firebase 拡張ライブラリに依存する可能性があり、その場合、Firebase の初期化コードが追加されます。
- <Implements>...</Implements>
ライブラリで実装するコンポーネントをリストします。
各項目のタグは GeneXus のオブジェクト名と一致する必要があります。次に例を示します。
- <ExternalObject name="my_external_object" />
外部オブジェクトの実装を表します。
- <UserControl name="my_user_control" />
ユーザーコントロールの実装を表します。
- <NotificationProvider name="my_notification_provider" />
通知プロバイダーの実装を表します。
- <CacheProvider name="my_cache_provider" />
キャッシュプロバイダーの実装を表します。
- <StorageProvider name="my_storage_provider" />
ストレージプロバイダーの実装を表します。
- <Procedure name="my_procedure_name" />
Procedure オブジェクトの実装の完全修飾名を表します。GeneXus 16 Upgrade 11 以降で使用できます。
- <Android>...</Android>
Android ジェネレーターに対する実装の依存関係を示します。
また、特別なタグを定義します。
- <ModuleClass>...</ModuleClass>
エクステンションとそれを使用するコンポーネントをマッピングする目的で実行時にインスタンス化されるクラスです。オプション:
- <GroupId>...</GroupId>
ライブラリ (およびその一時的な依存関係) を実装する AAR ファイルが存在する Maven リポジトリのパッケージグループ識別子です。オプション*
- <Name>...</Name>
Maven リポジトリにおけるライブラリの名前です。オプション*
- <Version>...</Version>
Maven リポジトリにおけるライブラリのバージョンコードです。オプション*
- <GradleExtensionFile>...<GradleExtensionFile>
オプションです。ライブラリのビルドに使用される *.gradle ファイルです。このオプションは、外部ライブラリ参照を含める場合に使用します。
注:
拡張ライブラリの作成者は、Android 向けのライブラリ定義に標準の Maven リポジトリを追加する必要がなくなりました。標準の Maven リポジトリは既に含まれています。そのため、GeneXus 16 U5 以降ではこの拡張を含める必要がありません。
*
GeneXus 17 upgrade 4 以降、これらの値を追加する必要はなくなりました。build.gradle 依存関係なしで拡張ライブラリを作成できるようになりました。
<iOS>...</iOS>
iOS ジェネレーターに対する実装の依存関係を示します。
項目属性: プラットフォーム
オプションです。このエクステンションの対象とする予定の Apple プラットフォームを示します。コンマ区切りで記入します。
値: iOS、tvOS、watchOS。
たとえば、
*.library ファイルが次のように定義されているとします:
<ExtensionLibrary>
<Implements>
<UserControl name="MyUserControl"/>
<UserControl name="MyUserControlVariant"/>
<ExternalObject name="MyExternalObject"/>
</Implements>
<Android>
<GroupId>com.example</GroupId>
<Name>MyExtension</Name>
<Version>1.0</Version>
<ModuleClass>com.example.MyExtensionLibraryClassName</ModuleClass>
<GradleExtensionFile>mylibraryextension.gradle</GradleExtensionFile>
</Android>
<iOS>
<PodFile>MyExtension.Template.pod</Library>
<ModuleClass>MyExtensionLibraryClassName</ModuleClass>
<XCProjExtensionFile>MyExtension.XCExtensionTemplate.xml</XCProjExtensionFile>
<CopyListFile>MyExtension.CopyListTemplate.xml</CopyListFile>
</iOS>
</ExtensionLibrary>
前述のとおり、<ModuleClass> タグは、各コンポーネントが初期化されるクラスを参照しています。
mylibraryextension.gradle ファイルでは、次のようにパブリックリポジトリを参照し、必要なものすべてを追加できます:
repositories {
jcenter()
}
class com.mypackage.MyExtensionLibraryClassName {
@Override
public void initialize(Context context) {
UserControlDefinition ucDefinition = new UserControlDefinition("MyUserControl", MyUserControl.class);
UcFactory.addControl(ucDefinition);
UserControlDefinition ucDefinition = new UserControlDefinition("MyUserControlVariant", MyUserControlVariant.class);
UcFactory.addControl(ucDefinition);
ExternalApiDefinition apiDefinition = new ExternalApiDefinition("Module.Example.MyExternalObject", MyExternalObject.class);
ExternalApiFactory.addApi(apiDefinition);
// その他のコンポーネントの初期化}
}
ライブラリ自体では、実装対象のコンポーネントを詳細に定義します。外部オブジェクトでは、プラットフォーム固有のパラメーターを指定する必要はありません。
@objc(MyExtensionLibraryClassName)
public class MyExtensionLibraryClassName: NSObject, GXExtensionLibraryProtocol {
public func initializeExtensionLibrary(withContext context: GXExtensionLibraryContext) {
GXActionExternalObjectHandler.register(MyGXActionExternalObjectHandlerSubclass.self, forExternalObjectName: "Module.Example.MyExternalObject")
// その他のコンポーネントの初期化。ユーザーコントロールについては、その定義に基づいてマッピングが自動的に生成されるため除外}
}
実装には Swift 言語が使用されます。その場合、@objc(MyExtensionLibraryClassName) 表記を使用して、このクラスが実行時にリフレクションによってインスタンス化されるようにする必要があります。
(1) Android の場合、
GeneXus 15 Upgrade 3 以降で利用できます。
(2) iOS の場合、
GeneXus 15 Upgrade 6 以降で利用できます。