Kanzi アプリケーションを iOS 向けに開発する¶
Kanzi application framework (appfw) を使用して、iOS 向けの Kanzi アプリケーションを開発できます。アプリケーションとプラグインのコードは C++ で記述し、CMake と Xcode を使用してアプリケーションをビルドします。始める前に、Kanzi を使用した iOS アプリケーション開発の要件 を確認してください。
以下のいずれかのテンプレートを使用してプロジェクトを作成すると、Kanzi Studio は、すぐに使用できる iOS 用の CMake 構成と、Xcode プロジェクトを生成するためのヘルパースクリプトを生成します。
Application
Application with data source plugin
Application with Kanzi Engine plugin
iOS プロジェクト構造¶
<ProjectName>/Application/configs/platforms/ios/ ディレクトリには以下が含まれています。
CMakeLists.txt-- iOS および Xcode 固有の設定を実行可能ファイルのターゲットに適用します。これには以下が含まれます。outputに設定されたXCODE_ATTRIBUTE_INSTALL_PATH。xcodebuild installに渡されるDSTROOT=$(PROJECT_DIR)と組み合わせることで、ビルドされたアプリケーションが<Application>/output/に配置されます。XCODE_EMBED_FRAMEWORKS-- Vulkan および MoltenVK フレームワークをアプリケーションバンドルに埋め込みます。XCODE_EMBED_RESOURCES-- Kanzi Studio からエクスポートした kzb バイナリファイルを埋め込みます。
Info.plist-- 起動スクリーン、サポートされる画面の向き、およびアプリケーションを iOS アプリケーションシェルが提供するSceneDelegateに接続するUIApplicationSceneManifestを定義します。Assets.xcassets-- アプリケーションアイコンが含まれています。src/--KanziViewをホストする iOS アプリケーションシェルです。main.m--UIApplicationMainエントリーポイントです。app_delegate.h,m-- デフォルトのシーン構成を選択するUIApplicationDelegateです。scene_delegate.h,m--UIWindowを作成し、ルートのViewControllerをインストールするUIWindowSceneDelegateです。view_controller.h,m-- ルートビューがKanziViewであるフルスクリーンのUIViewControllerです。ここで Kanzi ビューを iOS のビュー階層内に埋め込みます。
Application フォルダには generate_cmake_xcode_ios_project.sh も含まれています。このスクリプトは、CMake Xcode ジェネレーターと Kanzi iOS ツールチェーンを使用して Xcode プロジェクトを生成します。
iOS プラットフォームパッケージは、KanziAppFwKit XCFramework に含まれる KanziView と KanziViewRepresentable を提供します。生成された CMake 構成は、アプリケーションのターゲットを KanziAppFwKit にリンクし、XCFramework をアプリケーションバンドルに埋め込みます。
アプリケーションをビルドして iOS デバイスにデプロイする方法については、Kanzi アプリケーションを iOS にデプロイする を参照してください。
KanziView¶
KanziView は、iOS のビュー階層内で Kanzi のレンダリングをホストする UIKit の UIView サブクラスです。KanziView は、UIKit のビュー階層内の任意の場所に、ネイティブの iOS コンテンツと並べて配置できます。
KanziView はレンダリングに加えて、以下を行います。
Kanzi アプリケーションのライフサイクルを制御します。
KanziViewをウィンドウにアタッチすると Kanzi アプリケーションが起動します。KanziViewをデタッチするとアプリケーションがシャットダウンします。iOS アプリケーションがアクティブ状態を解除すると Kanzi を一時停止し、アプリケーションが再びアクティブになると Kanzi を再開します。
タッチイベントを Kanzi に転送します。
注釈
1つのプロセス内に同時に存在できる KanziView は1つだけです。
アプリケーションファクトリー¶
KanziView には、実行する Application インスタンスを返す C++ の createApplication() ファクトリー関数が必要です。このシグネチャは他のすべての Kanzi プラットフォームと同じです。例:
#include <kanzi/core.ui/application/application.hpp>
class MyApplication : public kanzi::Application
{
// Override onProjectLoaded, onConfigure, and so on.
};
kanzi::Application* createApplication()
{
return new MyApplication();
}
この翻訳単位を KanziAppFwKit とともにアプリケーションターゲットにリンクします。KanziAppFwKit は、ビューがアタッチされるたびに createApplication() を 1 回呼び出し、ビューがデタッチされると返されたインスタンスを削除します。
注釈
iOS では、Kanzi はコマンドラインアーギュメントを受け取りません。KanziAppFwKit がアプリケーションのエントリーポイントを所有し、argc/argv なしで createApplication() を呼び出すためです。その結果、SystemProperties はデフォルトで初期化されます。アプリケーションを構成するには、application.cfg を使用するか、Application::onConfigure をオーバーライドします。アプリケーション構成リファレンス を参照してください。
UIKit で Kanzi ビューを追加する¶
UIKit アプリケーションに Kanzi ビューを追加するには、KanziAppFwKit をインポートし、ビュー階層に KanziView を配置します。KanziView は以下の方法でインスタンス化できます。
コードから:
UIViewControllerでloadView(またはviewDidLoad)をオーバーライドします。KanziViewインスタンスを割り当てます。
#import <kanzi_view.h> @implementation ViewController - (void)loadView { KanziView* kanziView = [[KanziView alloc] initWithFrame:CGRectZero]; kanziView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; self.view = kanziView; } @end
import KanziAppFwKit import UIKit class ViewController: UIViewController { override func loadView() { let kanziView = KanziView(frame: .zero) kanziView.autoresizingMask = [.flexibleWidth, .flexibleHeight] view = kanziView } }
ストーリーボードまたは XIB から:
Interface Builder で、通常の
UIViewをシーンにドロップします。Identity Inspector で、Class を
KanziViewに設定します。Module を
KanziAppFwKitに設定します。
KanziViewはinitWithCoder:から初期化されるため、ストーリーボードから読み込まれたビューも、コードでインスタンス化したビューと同じように動作します。
SwiftUI で Kanzi ビューを追加する¶
SwiftUI の階層に Kanzi コンテンツを埋め込むには、KanziView をラップする UIViewRepresentable である KanziViewRepresentable を使用します。他の SwiftUI ビューと同じように配置できます。サイズや位置を設定したり、ネイティブの SwiftUI ビューと組み合わせたりできます。
import KanziAppFwKit
import SwiftUI
struct ContentView: View {
var body: some View {
KanziViewRepresentable()
.ignoresSafeArea()
}
}