ここでは、iOS ジェネレーターで
拡張ライブラリを作成する際にサポートされる実装について説明します。
iOS ジェネレーターに対する実装の依存関係を示します。
項目属性: プラットフォーム
オプションです。このエクステンションの対象とする予定の Apple プラットフォームを示します。コンマ区切りで記入します。たとえば、エクステンションが watchOS のみでサポートされるようにするには、次のように設定します:
<iOS platforms="watchOS">
...
</iOS>
watchOS と tvOS でサポートされ、iOS でサポートされないようにするには、次のように設定します:
<iOS platforms="watchOS, tvOS">
...
</iOS>
この項目属性が含まれていない場合、エクステンションはすべてのプラットフォームでサポートされます。
値: iOS、tvOS、watchOS。
このセクションでは、拡張ポイントとしてサポートされているノードについて説明します。
オプションです。拡張の実装を要件に応じて初期化するクラス名です。GXExtensionLibraryProtocol を実装する必要があります。
この拡張ポイントの値は、ユーザーコントロールなど、登録対象がない場合があることからオプションとなっています。
@objc(MyExtensionLibraryClassName)
public class MyExtensionLibraryClassName: NSObject, GXExtensionLibraryProtocol {
public func initializeExtensionLibrary(withContext context: GXExtensionLibraryContext) {
GXActionExternalObjectHandler.register(MyGXActionExternalObjectHandlerSubclass.self, forExternalObjectName: "Module.Path.To.MyExternalObject")
//その他のコンポーネントの初期化。ユーザーコントロールについては、その定義に基づいてマッピングが自動的に生成されるため除外
}
}
実装には Swift 言語が使用されます。その場合、@objc(MyExtensionLibraryClassName) 表記を使用して、このクラスが実行時にリフレクションによってインスタンス化されるようにする必要があります。
オプションです。
CocoaPods 拡張の依存関係をサポートします。このノードでは、
PodFile テンプレートの相対パスを指定できます (下の例を参照)。この機能を使用する場合は、デプロイ環境の Mac に CocoaPods コマンド ライン ツールがインストールされている必要があります (
コマンド ライン ツールに関するサブセクションを参照)。
CocoaPods グローバルリポジトリにおけるパブリックな依存関係だけでなく、Mac 上のローカルリポジトリにおけるプライベートな依存関係も扱うことができます。後者の場合、CocoaPods を使用する拡張ライブラリが検出されたときに、デプロイ環境の Mac コンピューターに GXLocal というローカルリポジトリが自動的に作成されます。また、ローカルリポジトリの使用は、Mac でのインターネットアクセスが制限されている場合に役立ちます。
CocoaPods コマンド ライン ツールをインストールするには、デプロイ環境の Mac で次のコマンドを実行します。
> sudo gem install cocoapods
ダウンロードプロセスが失敗し、次のエラーが表示される場合があります:
error: RPC failed; curl 56 SSLRead() return error -9806
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
その場合、コマンドを再度実行してください。
警告: 生成されたアプリケーションを Mac コンピューターでテストする場合は、*.xcodeproj ではなく *.xcworkspace ファイルを開いてください。
$if(Main.AppleDevice_iOS)$
target '$Main.iOSXcodeProjectName$' do
pod 'MyExtension', '> 2.5.4'
end
target 'MyServiceExtension' do
platform :ios, '$Main.iOSDeploymentTarget_iOS$'
pod 'MyExtension', '> 2.5.4'
end
$endif$
オプションです。例に示す形式を持つ XML を生成する必要がある文字列テンプレートを参照します。このメカニズムを使用すると、生成された Xcode プロジェクトを拡張できます。
<?xml version="1.0" encoding="utf-8"?>
<XCExtension>
<ProjectSections>
<Extends>
<NodeToBeExtended>
<! [ CDATA [ Content to be added to NodeToBeExtended ] ] >
<NodeToBeExtended/>
...
</Extends>
</ProjectSections>
</XCExtension>
各 NodeToBeExtended は、Xcode プロジェクト内のテンプレートプレースホルダー (<<<NodeToBeExtended>>> 形式) に対応している必要があります (たとえば、プロジェクトに参照を追加する場合、<<<PBXFileReference>>>)。
注:
GeneXus 16 Upgrade 3 以降では、
<<< PLACEHOLDER_NAME :: TARGET_NAME :: >>> というフォーマットがあるノードを拡張する場合、Target 項目属性を使用します。 その場合、次のようになります:
<PLACEHOLDER_NAME target = "TARGET_NAME" ></ PLACEHOLDER_NAME>.
例:
<<<PBXSourcesBuildPhase::WatchExtension::>>>
以下のようになります。
<PBXSourcesBuildPhase target=‘WatchExtension’>
ヒント
プロジェクトに何を追加すればよいかを調べる最も簡単な方法は、生成された Xcode プロジェクトを分割することです。複製プロジェクトに Xcode を使用して目的の変更を加えた後、元のプロジェクトとの差分を取ります。このメカニズムを使用すると、プロジェクトを手動で作成した場合にどのような変更を加える必要があるかを簡単に把握できます。
GeneXus インストール環境の
Libraries フォルダを確認してください。このフォルダに既存のライブラリが格納されているので、設定ファイルを確認して独自の拡張を作成できます。
使用可能なタグの完全な一覧については、
GeneXusInstallFolder > iOS > Templates > iOS_Genexus > MainName.xcodeproj > project.pbxproj ファイルで
<<<SampleName>>> パターンを調べてください。いくつかのノードを次に示します:
- PBXBuildFile
- PBXFileReference
- PBXFrameworksBuildPhase
- PBXSourcesBuildPhase
- PBXResourcesBuildPhase
- PBXGroup_Shared
- PBXGroup_Frameworks
- PBXLibrarySearchPath_Release および PBXLibrarySearchPath_Debug (1)
- PBXFrameworkSearchPath_Release および PBXFrameworkSearchPath_Debug (1)
オプションです。生成された Xcode プロジェクトにコピーするファイル、ディレクトリー、およびテンプレートをリストした XML (下の例を参照) を生成する必要がある文字列テンプレートを参照します。
XML ファイルは、次のように XSD にします:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="ExtensionCopyFile"
targetNamespace="http://schemas.genexus.com/ExtensionCopyFile.xsd"
elementFormDefault="qualified"
xmlns="http://schemas.genexus.com/ExtensionCopyFile.xsd"
xmlns:mstns="http://schemas.genexus.com/ExtensionCopyFile.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:pd="http://schemas.genexus.com/ExtensionCopyFile.xsd"
>
<xs:element name="CopyList">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="Template">
<xs:complexType>
<xs:attribute name="Id" use="required"/>
<xs:attribute name="Name" use="optional"/>
<xs:attribute name="InputPath" default="" use="optional"/>
<xs:attribute name="Recursive" type="xs:boolean" default="true"/>
<xs:attribute name="Pattern" default=""/>
<xs:attribute name="Output" />
<xs:attribute name="Delimiter" use="optional" default="$"/>
<xs:attribute name="TemplateEncoding" type="TEncoding" use="optional" />
</xs:complexType>
</xs:element>
<xs:element name="CopyFile">
<xs:complexType>
<xs:attribute name="Name" use="required"/>
<xs:attribute name="Output"/>
</xs:complexType>
</xs:element>
<xs:element name="CopyDirectory">
<xs:complexType>
<xs:attribute name="Name" use="required"/>
<xs:attribute name="Output"/>
<xs:attribute name="Recursive" type="xs:boolean" default="true"/>
<xs:attribute name="Force" type="xs:boolean" default="true"/>
</xs:complexType>
</xs:element>
<xs:element name="Variable">
<xs:complexType>
<xs:attribute name="Name" type="xs:string" use="required"/>
<xs:attribute name="Class" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="CopyKBFile">
<xs:complexType>
<xs:attribute name="Name" use="optional"/>
<xs:attribute name="PropertyId" use="optional"/>
<xs:attribute name="PropertySource" type="TPropertySource" use="optional" default="Main"/>
<xs:attribute name="Output" use="required"/>
<xs:attribute name="Required" type="xs:boolean" default="true"/>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:simpleType name="TEncoding">
<xs:restriction base="xs:string">
<xs:enumeration value="Machine Default" />
<xs:enumeration value="UTF8 (no BOM)" />
<xs:enumeration value="UTF8 (including BOM)" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TPropertySource">
<xs:restriction base="xs:string">
<xs:enumeration value="Main" />
<xs:enumeration value="WatchMain" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
オプションです。アプリケーションで処理できる URL を表す文字列値です (デバイスで
myapp.com.artech.myapp://vdir/resource?parameters がトリガーされた場合など)。
<CustomURLScheme>myapp.$Main.IOSBundleIdentifier$</CustomURLScheme>
アプリケーションを識別し、同じスキームを使用する他のアプリケーションとの競合を回避するため、接尾語として
$Main.IOSBundleIdentifier$ プレースホルダーを使用することを強くお勧めします。
オプションです。
ブリッジングヘッダーを追加できます (Objective-C モジュールを Swift にインポートでき、API の統合に役立ちます)。
<MainBridgingHeaderImports>#import "SomeModuleInObjC.h"</MainBridgingHeaderImports>
GeneXus 16 Upgrade 6 以降では、生成されたアプリケーションで
Bitcode オプションが有効になっています (
SAC #46100 を参照)。Bitcode オプションと互換性がないライブラリを必要とするエクステンションを使用するアプリケーションがある場合、このノードに True の値を設定すると、生成されるプロジェクトで Bitcode オプションが無効になります。
<iOS>
...
<DisableBitcode>true</DisableBitcode>
...
</iOS>
エクステンションを開発する際に、アプリケーションの Info.plist ファイルへの特別なキーの追加を必要とするライブラリを使用する場合があります。AdMob や Facebook SDK などのライブラリがこれに該当します。
Info.plist ファイルに特別なキーを追加するためには、キーと値のペアを含む新しいファイルを追加し、拡張ライブラリの定義ファイルに次の記述を追加する必要があります:
<iOS>
...
<InfoPlistFile>FileName.plist</InfoPlistFile>
...
</iOS>
ここで「FileName」は、iOS の Libraries フォルダの下に作成する必要がある
.plist ファイルの名前です。そのファイルには、キーと値のペアを追加する必要があります (PList 拡張子に適した形式である必要があります)。ファイル内には、エクステンションのために必要なすべてのキーと値のペアを追加できます。次に例を示します:
<key>GADApplicationIdentifier</key>
<string>$Main.Dynamic.AdMob_AppID$</string>
値はテンプレート変数にすることができます。特に、拡張ライブラリで定義したプロパティは、「Main.Dynamic」という接頭語を付けて使用できます。
オプションです。
<MainName>.entitlements ファイルに追加される PList 形式の XML を生成する必要がある文字列テンプレートを参照します。
Health Kit のエンタイトルメントを追加するために、iOS ノード内の EntitlementsExtensionFile エレメントを .library ファイルに追加します:
<iOS platforms="iOS">
...
<EntitlementsExtensionFile>MyExtensionLibrary.entitlements</EntitlementsExtensionFile>
...
</iOS>
それから
iOS > MyExtensionLibrary.entitlements ファイル内に次の内容を追加します:
<key>com.apple.developer.healthkit</key>
<true/>
<key>com.apple.developer.healthkit.access</key>
<array>
<string>health-records</string>
</array>
オプションです。iOS、watchOS、tvOS デプロイターゲットの必須および推奨バージョンを含む XML ファイルの名前を指定できます。
このファイルは、拡張ライブラリの iOS フォルダに格納し、以下の形式になっている必要があります:
<DeploymentTargets>
<Recommended warning="WARNING_MESSAGE">
<iOS>VERSION_NUMBER</iOS>
<tvOS>VERSION_NUMBER</tvOS>
<watchOS>VERSION_NUMBER</watchOS>
</Recommended>
<Required error="ERROR_MESSAGE">
<iOS>VERSION_NUMBER</iOS>
<tvOS>VERSION_NUMBER</tvOS>
<watchOS>VERSION_NUMBER</watchOS>
</Required>
</DeploymentTargets>
メインオブジェクトのプラットフォームとデプロイターゲットに応じて、ビルドプロセス中に表示されるエラーメッセージや警告メッセージをカスタマイズするために、複数の Required ノードと Recommended ノードを使用できることに注意してください。
バージョン文字列には、ドット文字 (".") をバージョン番号の区切り文字として使用します。2 桁のバージョン文字列のみがサポートされています。
拡張ライブラリの実装は、
GeneXus 15 Upgrade 6 以降でサポートされています。
(1) -
GeneXus 15 Upgrade 12 以降で利用できます。
スマートデバイスのエクステンションリポジトリのサンプル
SDExtensionsSample