0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙ArkUI-X跨平臺(tái)開發(fā):【bility開發(fā)說明(iOS端)】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-05-21 14:35 ? 次閱讀

通過Stage模型開發(fā)iOS端應(yīng)用指南

簡(jiǎn)介

本文介紹將ArkUI框架擴(kuò)展到iOS平臺(tái)所需要的必要類及其使用說明,開發(fā)者基于OpenHarmony,可復(fù)用大部分的應(yīng)用代碼(生命周期等)并可以部署到iOS平臺(tái),降低跨平臺(tái)應(yīng)用開發(fā)成本。

ArkUI-X和iOS平臺(tái)集成所用關(guān)鍵類

開發(fā)前請(qǐng)熟悉鴻蒙開發(fā)指導(dǎo)文檔:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

StageViewController

StageViewController是Stage模型iOS端視圖控制器基類,若要實(shí)現(xiàn)跨平臺(tái)基礎(chǔ)能力及觸發(fā)對(duì)應(yīng)ability生命周期,所有iOS端應(yīng)用級(jí)別的視圖控制器均要繼承于StageViewController。

公共屬性

  • instanceName:StageViewController唯一標(biāo)識(shí),拼接規(guī)則為 bundleName:moduleName:abilityName ,其中bundleName的值來自于OpenHarmony應(yīng)用中app.json5配置文件,moduleName、abilityName的值來自于OpenHarmony應(yīng)用中的module.json5配置文件。
@property (nonatomic, readonly) NSString *instanceName;
  • params:StageViewController外部屬性,用于startAbility時(shí)傳遞的want參數(shù)
@property (nonatomic, strong) NSString *params;

初始化方法

- (instancetype)initWithInstanceName:(NSString *_Nonnull)instanceName;

StageApplication

StageApplication本質(zhì)上是一個(gè)調(diào)度類,主要用于觸發(fā)內(nèi)部相關(guān)類實(shí)現(xiàn)路徑解析與配置、注冊(cè)應(yīng)用相關(guān)的configuration信息、觸發(fā)ability部分生命周期事件等。

公共方法

  • 配置本地hap包路徑。
+ (void)configModuleWithBundleDirectory:(NSString *_Nonnull)bundleDirectory;
  • iOS應(yīng)用觸發(fā)StartAbility、配置進(jìn)程id、本地化信息、configuration等。
+ (void)launchApplication;
  • 觸發(fā)ability進(jìn)入前臺(tái)生命周期事件。
+ (void)callCurrentAbilityOnForeground;
  • 觸發(fā)ability進(jìn)入后臺(tái)生命周期事件。
+ (void)callCurrentAbilityOnBackground;
  • 處理單/多實(shí)例ability。
+ (BOOL)handleSingleton:(NSString *)bundleName moduleName:(NSString *)moduleName abilityName:(NSString *)abilityName;
  • 釋放導(dǎo)航視圖棧內(nèi)的所有viewController,觸發(fā)OnDestory事件。
+ (void)releaseViewControllers;
  • 獲取導(dǎo)航視圖棧最頂層viewController。
+ (StageViewController *)getApplicationTopViewController;

AppDelegate內(nèi)關(guān)鍵實(shí)現(xiàn)參考

ArkUI應(yīng)用啟動(dòng)及初始化

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // 配置hap包路徑
    [StageApplication configModuleWithBundleDirectory:@"arkui-x"];
    // 啟動(dòng)ability
    [StageApplication launchApplication];
    
    // APP自啟動(dòng),初始化StageViewController子類VC,并設(shè)置為APP根視圖控制器
    if (!launchOptions.count) { 
        NSString *instanceName = [NSString stringWithFormat:@"%@:%@:%@",@"com.example.iosabilitystage", @"entry", @"MainAbility"];
        EntryMainViewController *mainView = [[EntryMainViewController alloc] initWithInstanceName:instanceName];
    UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:mainView];
        self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
        self.window.rootViewController = navi;
        [self.window makeKeyAndVisible];
    }
    return YES;
}

ArkUI應(yīng)用實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)

當(dāng)在iOS平臺(tái)上使用[startability]接口實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)時(shí),需要參考下述示例進(jìn)行開發(fā)。

  • 通過路由模式(openURL:)實(shí)現(xiàn)的iOS應(yīng)用頁(yè)面跳轉(zhuǎn)回調(diào),獲取傳遞參數(shù)
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary< NSString *,id > *)options {

    // 根據(jù)規(guī)則截取URL相應(yīng)參數(shù)
    NSString *bundleName = url.scheme;
    NSString *moduleName = url.host;
    NSString *abilityName, *params;

    NSURLComponents *urlComponents = [NSURLComponents componentsWithString:url.absoluteString];
    NSArray < NSURLQueryItem * > *array = urlComponents.queryItems;
    for (NSURLQueryItem * item in array) {
        if ([item.name isEqualToString:@"abilityName"]) {
            abilityName = item.value;
        } else if ([item.name isEqualToString:@"params"]) {
            params = item.value;
        }
    }
    // 單實(shí)例ability處理
    if ([StageApplication handleSingleton:bundleName moduleName:moduleName abilityName:abilityName] == YES) {
        return YES;
    }
    [self handleOpenUrlWithBundleName:bundleName
                           moduleName:moduleName
                          abilityName:abilityName
                               params:params, nil];
    return YES;
}
  • 通過解析url得到的參數(shù),映射ability對(duì)應(yīng)的viewController
- (BOOL)handleOpenUrlWithBundleName:(NSString *)bundleName
                         moduleName:(NSString *)moduleName
                        abilityName:(NSString *)abilityName
                             params:(NSString *)params, ...NS_REQUIRES_NIL_TERMINATION {
                                               
    NSString *instanceName = [NSString stringWithFormat:@"%@:%@:%@",bundleName, moduleName, abilityName];
    
    // 根據(jù)moduleName和abilityName映射對(duì)應(yīng)的viewController
    // 注意:傳入的moduleName或者abilityName錯(cuò)誤,則無(wú)法找到對(duì)應(yīng)的viewController,此時(shí)無(wú)法打開頁(yè)面。
    if ([moduleName isEqualToString:@"entry"] && [abilityName isEqualToString:@"MainAbility"]) {
        EntryMainAbilityViewController *entryMainVC = [[EntryMainAbilityViewController alloc] initWithInstanceName:instanceName];
        entryMainVC.params = params;
    } else if ([moduleName isEqualToString:@"entry"] && [abilityName isEqualToString:@"Other"]) {
        EntryOtherViewController *entryOtherVC = [[EntryOtherViewController alloc] initWithInstanceName:instanceName];
        entryOtherVC.params = params;
    }

    return YES;
}

ArkUI應(yīng)用生命周期回調(diào)相應(yīng)處理

  • ArkUI應(yīng)用進(jìn)入后臺(tái),觸發(fā)對(duì)應(yīng)生命周期事件。
- (void)applicationDidEnterBackground:(UIApplication *)application {
    [StageApplication callCurrentAbilityOnBackground];
}
  • ArkUI應(yīng)用進(jìn)入前臺(tái),觸發(fā)對(duì)應(yīng)生命周期事件。
- (void)applicationWillEnterForeground:(UIApplication *)application {
    [StageApplication callCurrentAbilityOnForeground];
}
  • 終止ArkUI應(yīng)用程序進(jìn)程。
- (void)applicationWillTerminate:(UIApplication *)application {
    [StageApplication releaseViewControllers];
}

具體方法使用參考samples示例

Ability與ViewController對(duì)應(yīng)規(guī)則

iOS端應(yīng)用info配置里的bundleName需要與Ability的bundleName一致。

iOS端應(yīng)用內(nèi)的viewController的viewControllerName組成規(guī)則:Ability的moduleName + Ability的abilityName + “viewController”。

stage_iOS

StageApplication初始化支持以下兩種方式

在didFinishLaunchingWithOptions函數(shù)中進(jìn)行初始化

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // 配置hap包路徑
    [StageApplication configModuleWithBundleDirectory:@"arkui-x"];
    // 啟動(dòng)ability
    [StageApplication launchApplication];

    // APP自啟動(dòng),初始化StageViewController子類VC,并設(shè)置為APP根視圖控制器
    if (!launchOptions.count) { 
        NSString *instanceName = [NSString stringWithFormat:@"%@:%@:%@",@"com.example.iosabilitystage", @"entry", @"MainAbility"];
        EntryMainViewController *mainView = [[EntryMainViewController alloc] initWithInstanceName:instanceName];
        UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:mainView];
        self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
        self.window.rootViewController = navi;
        [self.window makeKeyAndVisible];
    }
    return YES;
}

`HarmonyOS與OpenHarmony鴻蒙文檔籽料:mau123789是v直接拿`

搜狗高速瀏覽器截圖20240326151547.png

在openURL回調(diào)函數(shù)中進(jìn)行初始化

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 不在此處進(jìn)行初始化

    ExampleViewController *mainView = [[ExampleViewController alloc] init];
    UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:mainView];
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.rootViewController = navi;
    [self.window makeKeyAndVisible];
    return YES;
}

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary< NSString *,id > *)options {

    // 初始化StageApplication
    [StageApplication configModuleWithBundleDirectory:@"arkui-x"];
    [StageApplication launchApplication];
    
    /*
    other code
    */
    return YES;
}

sf

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 控制器
    +關(guān)注

    關(guān)注

    112

    文章

    16033

    瀏覽量

    176656
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2291

    瀏覽量

    42631
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3611

    瀏覽量

    15960
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Android、iOS、鴻蒙平臺(tái)框架ArkUI-X

    在Android、iOS鴻蒙多個(gè)平臺(tái)上提供生動(dòng)而流暢的用戶界面體驗(yàn)。 一、配套關(guān)系 表1 版本軟件和平臺(tái)配套關(guān)系 目標(biāo)平臺(tái) 項(xiàng)目編譯使用O
    的頭像 發(fā)表于 01-31 14:52 ?1649次閱讀
    <b class='flag-5'>跨</b>Android、<b class='flag-5'>iOS</b>、<b class='flag-5'>鴻蒙</b>多<b class='flag-5'>平臺(tái)</b>框架<b class='flag-5'>ArkUI-X</b>

    鴻蒙開發(fā)學(xué)習(xí):初探【ArkUI-X

    **簡(jiǎn)單來說,ArkTS + ArkUI-X 對(duì)標(biāo)的框架為 flutter,一次代碼,編譯為 native 全平臺(tái)運(yùn)行**
    的頭像 發(fā)表于 05-13 15:58 ?914次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b>學(xué)習(xí):初探【<b class='flag-5'>ArkUI-X</b>】

    鴻蒙ArkUI-X平臺(tái)開發(fā):【命令行工具(ACE Tools)】

    ACE Tools是一套為ArkUI-X項(xiàng)目平臺(tái)應(yīng)用開發(fā)者提供的命令行工具,支持在Windows/Ubuntu/macOS平臺(tái)運(yùn)行,用于構(gòu)
    的頭像 發(fā)表于 05-21 17:39 ?1427次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI-X</b><b class='flag-5'>跨</b><b class='flag-5'>平臺(tái)</b><b class='flag-5'>開發(fā)</b>:【命令行工具(ACE Tools)】

    鴻蒙ArkUI-X平臺(tái)開發(fā):【SDK目錄結(jié)構(gòu)介紹】

    本文檔配套ArkUI-X,將OpenHarmony ArkUI開發(fā)框架擴(kuò)展到不同的OS平臺(tái),比如Android和iOS
    的頭像 發(fā)表于 05-20 16:28 ?728次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI-X</b><b class='flag-5'>跨</b><b class='flag-5'>平臺(tái)</b><b class='flag-5'>開發(fā)</b>:【SDK目錄結(jié)構(gòu)介紹】

    鴻蒙ArkUI-X平臺(tái)開發(fā):【bility開發(fā)說明(Android平臺(tái))】

    本文介紹將ArkUI框架擴(kuò)展到Android平臺(tái)所需要的必要的類及其使用說明,開發(fā)者基于OpenHarmony,可復(fù)用大部分的應(yīng)用代碼(生命周期等)并可以部署到Android
    的頭像 發(fā)表于 05-21 10:54 ?824次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI-X</b><b class='flag-5'>跨</b><b class='flag-5'>平臺(tái)</b><b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>bility</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>說明</b>(Android<b class='flag-5'>平臺(tái)</b>)】

    鴻蒙開發(fā)ArkUI-X基礎(chǔ)知識(shí):【ArkUI平臺(tái)設(shè)計(jì)總體說明

    本文檔描述ArkUI開發(fā)框架平臺(tái)運(yùn)行能力相關(guān)的總體技術(shù)方案。
    的頭像 發(fā)表于 05-24 15:41 ?1374次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>ArkUI-X</b>基礎(chǔ)知識(shí):【<b class='flag-5'>ArkUI</b><b class='flag-5'>跨</b><b class='flag-5'>平臺(tái)</b>設(shè)計(jì)總體<b class='flag-5'>說明</b>】

    ArkUI-X開發(fā)指南:【SDK配置和構(gòu)建說明

    ArkUI-X SDK是ArkUI-X開源項(xiàng)目的編譯產(chǎn)物,可將ArkUI-X SDK集成到現(xiàn)有Android和iOS應(yīng)用工程中,使開發(fā)者基于
    的頭像 發(fā)表于 05-25 16:48 ?2365次閱讀
    <b class='flag-5'>ArkUI-X</b><b class='flag-5'>開發(fā)</b>指南:【SDK配置和構(gòu)建<b class='flag-5'>說明</b>】

    資訊速遞 | ArkUI-X 預(yù)覽版已正式開源!

    OpenHarmony項(xiàng)目群技術(shù)指導(dǎo)委員會(huì)(以下簡(jiǎn)稱“TSC”)-平臺(tái)應(yīng)用開發(fā)框架TSG所孵化項(xiàng)目 —— ArkUI-X,近期已正式開源 ,開發(fā)
    發(fā)表于 08-11 16:10

    資訊速遞 | ArkUI-X 預(yù)覽版已正式開源!

    OpenHarmony項(xiàng)目群技術(shù)指導(dǎo)委員會(huì)(以下簡(jiǎn)稱“TSC”)-平臺(tái)應(yīng)用開發(fā)框架TSG所孵化項(xiàng)目 —— ArkUI-X,近期已正式開源 ,開發(fā)
    的頭像 發(fā)表于 08-22 22:19 ?763次閱讀
    資訊速遞 | <b class='flag-5'>ArkUI-X</b> 預(yù)覽版已正式開源!

    鴻蒙平臺(tái)框架:【ArkUi-X】創(chuàng)建工程

    鴻蒙推出了鴻ArkUi-X 框架所以就寫個(gè)文章分享一下
    的頭像 發(fā)表于 05-13 17:48 ?766次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>跨</b><b class='flag-5'>平臺(tái)</b>框架:【<b class='flag-5'>ArkUi-X</b>】創(chuàng)建工程

    鴻蒙ArkUI-X平臺(tái)技術(shù):【開發(fā)準(zhǔn)備】

    本文檔適用于ArkUI平臺(tái)應(yīng)用開發(fā)的初學(xué)者。通過開發(fā)環(huán)境搭建、應(yīng)用工程創(chuàng)建、編譯和運(yùn)行,熟悉ArkUI
    的頭像 發(fā)表于 05-24 10:40 ?366次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI-X</b><b class='flag-5'>跨</b><b class='flag-5'>平臺(tái)</b>技術(shù):【<b class='flag-5'>開發(fā)</b>準(zhǔn)備】

    鴻蒙ArkUI-X平臺(tái)技術(shù):【開發(fā)初體驗(yàn)】

    在DevEco Studio中導(dǎo)入ArkUI-X Sample,快速創(chuàng)建平臺(tái)工程。
    的頭像 發(fā)表于 05-17 15:54 ?484次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI-X</b><b class='flag-5'>跨</b><b class='flag-5'>平臺(tái)</b>技術(shù):【<b class='flag-5'>開發(fā)</b>初體驗(yàn)】

    鴻蒙ArkUI-X平臺(tái)開發(fā):【 應(yīng)用工程結(jié)構(gòu)說明

    本文檔配套ArkUI-X,將OpenHarmony ArkUI開發(fā)框架擴(kuò)展到不同的OS平臺(tái),比如Android和iOS
    的頭像 發(fā)表于 05-19 21:05 ?461次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI-X</b><b class='flag-5'>跨</b><b class='flag-5'>平臺(tái)</b><b class='flag-5'>開發(fā)</b>:【 應(yīng)用工程結(jié)構(gòu)<b class='flag-5'>說明</b>】

    鴻蒙ArkUI-X語(yǔ)言調(diào)用說明平臺(tái)差異化【Android、ios動(dòng)態(tài)化】

    ArkUI-X支持動(dòng)態(tài)化,使用者可以根據(jù)自己需要?jiǎng)討B(tài)發(fā)布平臺(tái)內(nèi)容,從而使平臺(tái)部分和宿主應(yīng)用進(jìn)行解耦。
    的頭像 發(fā)表于 05-23 14:38 ?632次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI-X</b><b class='flag-5'>跨</b>語(yǔ)言調(diào)用<b class='flag-5'>說明</b>:<b class='flag-5'>平臺(tái)</b>差異化【Android、<b class='flag-5'>ios</b>動(dòng)態(tài)化】

    鴻蒙ArkUI-X框架開發(fā):【開發(fā)準(zhǔn)備】

    本文檔適用于ArkUI-X框架開發(fā)的初學(xué)者。通過環(huán)境搭建、代碼下載、代碼編譯、API擴(kuò)展和使用,快速了解平臺(tái)項(xiàng)目開發(fā)流程。
    的頭像 發(fā)表于 05-23 21:02 ?367次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI-X</b>框架<b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>開發(fā)</b>準(zhǔn)備】