为 iOS 开发 Kanzi 应用程序

您可以使用 Kanzi application framework (appfw) 为 iOS 开发 Kanzi 应用程序。您使用 C++ 编写应用程序和插件代码,并使用 CMake 和 Xcode 构建应用程序。开始之前,请查看 要求。

当您使用以下模板之一创建工程时,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 特定的设置应用于可执行目标。其中包括:

    • XCODE_ATTRIBUTE_INSTALL_PATH 设置为 output。结合传递给 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 – 全屏 UIViewController,其根视图为 KanziView。您在此处将 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 是 UIKit UIView 的子类,用于在 iOS 视图层级中承载 Kanzi 渲染。您可以将 KanziView 放在 UIKit 视图层级中的任何位置,与原生 iOS 内容并存。

除了渲染之外,KanziView 还:

  • 驱动 Kanzi 应用程序的生命周期。将 KanziView 附加到窗口会启动 Kanzi 应用程序。将 KanziView 分离会关闭该应用程序。

  • 在 iOS 应用程序退出活动状态时暂停 Kanzi,并在该应用程序再次变为活动状态时恢复 Kanzi。

  • 将触摸事件转发给 Kanzi。

备注

一个进程中同一时间只能存在一个 KanziView。

应用程序工厂

KanziView 需要一个 C++ createApplication() 工厂函数,该函数返回要运行的 Application 实例,其签名与所有其他 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(),并在视图分离时删除返回的实例。

备注

在 iOS 上,Kanzi 不接收命令行参数——KanziAppFwKit 拥有应用程序入口点,并在不传入 argc/argv 的情况下调用 createApplication()。因此,SystemProperties 会以默认值初始化。要配置您的应用程序,请使用 application.cfg 或重写 Application::onConfigure。请参阅 应用程序配置参考。

在 UIKit 中添加 Kanzi 视图

要将 Kanzi 视图添加到 UIKit 应用程序,请导入 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
        }
    }
    
  • 通过 storyboard 或 XIB:

    1. 在 Interface Builder 中,将一个普通的 UIView 拖放到您的场景中。

    2. 在 Identity Inspector 中,将 Class 设置为 KanziView。

    3. 将 Module 设置为 KanziAppFwKit。

    KanziView 通过 initWithCoder: 进行初始化,因此从 storyboard 加载的视图与通过代码实例化的视图工作方式相同。

在 SwiftUI 中添加 Kanzi 视图

要在 SwiftUI 层级中嵌入 Kanzi 内容,请使用 KanziViewRepresentable,它是围绕 KanziView 的 UIViewRepresentable 包装器。您可以像放置任何其他 SwiftUI 视图一样放置它——您可以设置它的尺寸和位置,并将它与原生 SwiftUI 视图组合使用。

import KanziAppFwKit
import SwiftUI

struct ContentView: View {
    var body: some View {
        KanziViewRepresentable()
            .ignoresSafeArea()
    }
}

另请参阅

使用 kzb 文件

将 Kanzi 应用程序部署到 iOS