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 は以下の方法でインスタンス化できます。

  • コードから:

    1. UIViewController で loadView (または viewDidLoad)をオーバーライドします。

    2. 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 から:

    1. Interface Builder で、通常の UIView をシーンにドロップします。

    2. Identity Inspector で、Class を KanziView に設定します。

    3. 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()
    }
}

関連項目

kzbファイルの使用

Kanzi アプリケーションを iOS にデプロイする