iOS 環境に新しい機能を追加して、ユーザーの「負担にならない」メッセージを表示したいとします。
GeneXus 内でネイティブ外部オブジェクトを作成し、呼び出すメソッドおよびプロパティを公開し、iOS プラットフォームと統合するための実装を行います。
ここでは、iOS プラットフォーム用の外部オブジェクトを作成する手順について見ていきます。
Toast-Swift などの外部実装を使用することも、独自の実装を作成することもできます。この例では、独自の実装を作成し、ラベルとアニメーションを使用して Toast メッセージを表示します。
BasicExternalObject という名前の新しいネイティブオブジェクトを作成します。
Hello と呼ばれる新しいメソッドを、次の値とともに追加します:
Is Static: True
文字引数を持つ Message という別のメソッドを追加します。
外部オブジェクトを保存したら、次の構文で使用できます:
BasicExternalObject.Hello()
BasicExternalObject.Message(&text)
ここで、実際にこれを動作させるために、いくつかの実装を行う必要があります。
実装の詳細、依存関係などを宣言する拡張ライブラリを作成する必要があります。
Xcode プロジェクトを作成するには、このドキュメントに従ってください。
実行中、GeneXus iOS アプリケーションは、単に引数とともに実行された外部オブジェクトメソッドの外部オブジェクト実装クラスを認識しません。
iOS 外部オブジェクト開発者は、メソッドの実行を実際に解決するクラスのバインディングを提供する必要があります。
次のコードで、SampleExtensionLibrary という Swift クラスを作成し、外部オブジェクトを登録します。
import GXCoreBL
@objc(SampleExtensionLibrary)
public class SampleExtensionLibrary: NSObject, GXExtensionLibraryProtocol {
public func initializeExtensionLibrary(withContext context: GXExtensionLibraryContext) {
GXActionExternalObjectHandler.register(BasicExternalObject.self, forExternalObjectName:BasicExternalObject.classIdentifier)
}
}
次に、外部オブジェクトのメソッドやプロパティを実際に実装するために、Swift クラス BasicExternalObject を作成します。
クラスは GXActionExternalObjectHandler から継承し、次のメソッドを実装する必要があります。
override public class func handleActionExecutionUsingMethodHandlerSelectorNamePrefix() -> Bool {}
@objc public func gxActionExObjMethodHandler_Message(_ parameters: [ Any ] )
@objc public func gxActionExObjMethodHandler_Hello()
実装メソッドは、外部オブジェクトに関連付けられているメソッド名によって異なります。Message と Hello はこの外部オブジェクトの定義に関係しています。ルールとして、対応するメソッドを実装するために従う必要があるパターンは次のとおりです。
@objc <ClassVisibiliy> func gxActionExObjMethodHandler_<ExternalObjectMethodName>(_ parameters: [ Any ] )
入力値の説明:
- ClassVisibiliy: クラスに割り当てられている可視性に関連します。
- ExternalObjectMethodName: 外部オブジェクトの定義と一致している必要があるメソッド名です。
- このメソッドのパラメーターはオプションです。メソッドにパラメーターが存在する場合にのみ追加する必要があります (この外部オブジェクトの Hello メソッドにはパラメーターがない点に注意してください)。
クラスの最小実装は次のとおりです。
public static let classIdentifier = "BasicExternalObject"
override public class func handleActionExecutionUsingMethodHandlerSelectorNamePrefix() -> Bool {
return true
}
@objc public func gxActionExObjMethodHandler_Message(_ parameters: [ Any ] ) {
if let error = self.validateNumber(ofParametersReceived: UInt(parameters.count), expected: 1) {
self.onFinishedExecutingWithError(error)
return
}
guard let message = self.stringParameter(self.actionDescParametersArray! [ 0 ] , fromValue: parameters [ 0 ] ) else {
self.onFinishedExecutingWithDefaultError()
return
}
self.showToast(message: message)
self.onFinishedExecutingWithSuccess()
}
@objc public func gxActionExObjMethodHandler_Hello() {
let hello = "Hello World!"
self.showToast(message: hello)
self.onFinishedExecutingWithSuccess()
}
Toast メッセージを表示するメソッドは次のとおりです。
private func showToast(message : String) {
//参考にしたサイト https://stackoverflow.com/questions/31540375/how-to-toast-message-in-swift
//最初にコントローラーとそのビューを取得
if let rootController = GXExecutionEnvironmentHelper.keyWindow?.rootViewController {
//Toast のサンプルをビルド
let size = rootController.view.frame.size
let toastLabel = UILabel(frame: CGRect(x: (size.width)/2 - 75, y: (size.height) - 100, width: 150, height: 35))
toastLabel.backgroundColor = UIColor.black.withAlphaComponent(0.6)
toastLabel.textColor = UIColor.white
toastLabel.textAlignment = .center;
toastLabel.font = UIFont(name: "Montserrat-Light", size: 12.0)
toastLabel.text = message
toastLabel.alpha = 1.0
toastLabel.layer.cornerRadius = 10;
toastLabel.clipsToBounds = true
rootController.view.addSubview(toastLabel)
UIView.animate(withDuration: 4.0, delay: 0.1, options: .curveEaseOut, animations: {
toastLabel.alpha = 0.0
}, completion: {(isCompleted) in
toastLabel.removeFromSuperview()
})
}
}
GeneXus iOS アプリケーションは、外部オブジェクトを呼び出すアクションを見つけるたびに handleActionExecutionUsingMethodHandlerSelectorNamePrefix メソッドを呼び出し、アクションを処理できるかどうかを確認します。その後、実行されるメソッドに応じて、実装に自動的にバインドします。
gxActionExObjMethodHandler_<ExternalObjectMethodName>()
メソッドにパラメーターがある場合は次のようになります:
gxActionExObjMethodHandler_<ExternalObjectMethodName>(_ parameters: [ Any ] )
メソッドの実装の最初の部分でパラメーターの数が想定どおりであることを確認し、それからパラメーターの値を読み取ろうとします。
その後、実際の実装が行われます。Toast のサンプルに関連して、実際の実装は showToast 関数で行われます。
これで完了です。2 つのメソッドを持つ iOS BasicExternalObject 外部オブジェクトをテストする準備ができました。
上の例では外部オブジェクトにプロパティを実装しませんでしたが、プロパティがある場合はメソッドと同様に処理されます。このプロパティの getter は次のように呼び出されます:
gxActionExObjMethodHandler_<ExternalObjectPropertyName>()
プロパティの setter には、関数定義のプロパティ名の前に「set」という接頭語が必要です (この接頭語は小文字である必要があります)。設定する値を持つパラメーターを setter が受け取ります。
gxActionExObjMethodHandler_set<ExternalObjectPropertyName>(_ parameters: [ Any ] )
外部オブジェクトのメソッドが onFinishedExecutingWithSuccess を呼び出すことを確認し、ベースクラスがその他のオブジェクトを呼び出してメソッドの実行を完了できるようにします。エラーには onFinishedExecutingWithError 関数を使用します。
Xcode を使用して、アプリケーションの外部オブジェクトメソッドの呼び出しをデバッグします。
|