H5+ 插件開發(fā)(iOS)

工作中遇到了為H5項目開發(fā)iOS插件的功能,就去啃了啃HBuilder得H5+文檔,發(fā)現(xiàn)文檔寫的很晦澀..,現(xiàn)已實現(xiàn),遂來分享下經(jīng)驗,以供大家參考。當(dāng)然也是因為看到HBuilder的寫文章有獎的活動了??..快來吧,我的32寸曲面顯示器??
好啦,言歸正傳,用到的IDE -- Xcode7.3,HBuilder。

HBuilder用來寫H5項目,Xcode用來寫iOS原生的插件,我所需實現(xiàn)的是,在H5頁面點擊打印,運行iOS原生插件來實現(xiàn)連接藍牙打印機并打印出獲取的內(nèi)容。

首先去HBuilder文檔上,下載HBuilder離線打包iOS版SDK,運行HBuilder-Hello,在HBuilder-Hello項目基礎(chǔ)上開始進行原生插件開發(fā)。

HTML5+ 基座擴展采用三層結(jié)構(gòu),JS層、PluginBridge層和Native層。 三層功能分別是:
JS層: 在Webview頁面調(diào)用,觸發(fā)Native層代碼,獲取執(zhí)行結(jié)果。 PluginBridge層: 將JS層請求進行處理,觸發(fā)Native層擴展插件代碼。
Native層: 插件擴展的平臺原生代碼,負(fù)責(zé)執(zhí)行業(yè)務(wù)邏輯并執(zhí)行結(jié)果返回到請求頁面。

先來注冊下對應(yīng)關(guān)系
修改PandoraAPI.bundle中feature.plist文件,在其中添加JS插件別名和Native插件類的對應(yīng)關(guān)系,SDK基座會根據(jù)對應(yīng)關(guān)系查找并生成相應(yīng)的Native對象并執(zhí)行對應(yīng)的方法。

屏幕快照 2016-11-07 上午10.41.02.png

然后在HBuilder中你的H5項目里面的manifest.json中

屏幕快照 2016-11-07 上午10.40.38.png

plugintest為你所要擴展的插件類的類名,在iOS中創(chuàng)建plugintest類,并繼承于PGPlugin,在.h中導(dǎo)入PGPlugin.h,PGMethod.h
#include "PGPlugin.h"
#include "PGMethod.h"

若需要靜態(tài)庫的話直接吧.a和.h文件拖到項目中就可以了,native中的方法分同步和異步方法,我在這里只介紹異步方法

- (void)PluginTestFunctionArrayArgu:(PGMethod *)msg
{
    NSArray *pArray = [NSArray array];
    
    if (msg)
    {
        //CallBackid 異步方法的回調(diào)id,H5+ 會根據(jù)回調(diào)ID通知JS層運行結(jié)果成功或者失敗
        
        NSString *cdId = [msg.arguments objectAtIndex:0];
        
        //用戶的參數(shù)會在第二個參數(shù)傳回,可以按照Array方式傳入
        pArray = [msg.arguments objectAtIndex:1];
        
        NSLog(@"cdId: %@    pArray: %@",cdId,pArray);
        
        // 如果使用Array方式傳遞參數(shù)
        NSString *pResultString = [NSString stringWithFormat:@"%@ %@ %@ %@ %@ %@ %@",[pArray objectAtIndex:0],[pArray objectAtIndex:1], [pArray objectAtIndex:2],[pArray objectAtIndex:3],[pArray objectAtIndex:4], [pArray objectAtIndex:5],[pArray objectAtIndex:6]];
        
        NSLog(@"pResultString: %@",pResultString);
        
        //可以直接調(diào)用所導(dǎo)入的靜態(tài)庫里面的方法
        NSString *UUID = [ZQDeviceSDK Prn_GetPortList:1];
        
        NSString *port = [UUID stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        
        [self startPrintText:pArray andUUID:port];
        
        // 運行Native代碼結(jié)果和預(yù)期相同,調(diào)用回調(diào)通知JS層運行成功并返回結(jié)果
         PDRPluginResult *result = [PDRPluginResult resultWithStatus:PDRCommandStatusOK messageAsString:pResultString];
        
        // 如果Native代碼運行結(jié)果和預(yù)期不同,需要通過回調(diào)通知JS層出現(xiàn)錯誤,并返回錯誤提示
//        PDRPluginResult *resultError = [PDRPluginResult resultWithStatus:PDRCommandStatusError messageAsString:@"出錯了!"];
        
        //通知JS層Native層運行結(jié)果,JS Pluginbridge會根據(jù)cbid找到對應(yīng)的回調(diào)方法并觸發(fā)
       [self toCallback:cdId withReslut:[result toJSONString]];
        
    }

}

在js中的函數(shù)

document.addEventListener( "plusready",  function(){

  // 聲明的JS“擴展插件別名”
     var _BARCODE = 'plugintest',B = window.plus.bridge;
     var plugintest ={
         // 聲明異步返回方法
         // 通知Native層plugintest擴展插件運行”PluginTestFunction”方法
        //參數(shù)為所需傳入原生的參數(shù)
         PluginTestFunctionArrayArgu : function (Argus, successCallback, errorCallback ){
             var success = typeof successCallback !== 'function' ? null : function(args) 
              {
                  successCallback(args);
              },
              fail = typeof errorCallback !== 'function' ? null : function(code) 
              {
                  errorCallback(code);
              };
              callbackID = B.callbackId(success, fail);
              //這里寫上原生中的異步方法名
              return B.exec(_BARCODE, "PluginTestFunctionArrayArgu", [callbackID, Argus]);
         }   
      window.plus.plugintest = plugintest;
 }, true );

在H5中調(diào)用的代碼

 plus.plugintest.PluginTestFunctionArrayArgu( printData, function( result ) {
                 mui.alert( result );
                },function(result){
                 mui.alert(result)
                 });

大致的開發(fā)流程就值這個樣子,其實真正麻煩的并是不代碼而是IDE的各種調(diào)試..
下面就是把H5項目導(dǎo)入Xcode來實現(xiàn)離線打包了,在項目的manifest.json中,修改appid,使其與Xcode中的appid一致,Version和Build對應(yīng)version下的name和code

屏幕快照 2016-11-07 上午11.15.27副本.png
屏幕快照 2016-11-07 上午11.15.45.png

將manifest.json中的中文注釋全部刪除,然后把H5項目導(dǎo)入到Pandora下的www目錄中,記住,把項目下的所有文件導(dǎo)入到www下,而不是項目文件夾直接導(dǎo)入到www下,那樣運行會打不開App。

把www上一級的文件夾名稱改為Appid一致的名稱,修改圖標(biāo)可以把圖標(biāo)放入HBuilder中可以生成相應(yīng)尺寸的圖標(biāo)..這點兒用著非常親民..之前iOS開發(fā)都是去找美工要的..接著修改項目名稱等我就不再一一說了。

之前一直在做的是iOS原生項目,才開始做webApp項目,使用HBuilder確實感覺很便捷,也認(rèn)識到了H5+的發(fā)展,希望自己能做到前端全棧吧!??
共勉!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容