iOS 外掛程式

iOS 外掛程式

外掛程式是一個擴展的目標 C 類 CDVPlugin 類。

每個外掛程式類必須註冊為 <feature> 中標籤的 config.xml 。 正是通過這一機制的 JavaScript exec 方法的 service 參數將映射到目標 C 類。

外掛程式類映射

一個外掛程式的 JavaScript 部分始終使用 cordova.exec 方法,如下所示:

exec(<successFunction>, <failFunction>, <service>, <action>, [<args>]);

這封送一個請求從 UIWebView 到 iOS 本機側,更或較不沸騰到調用 action 方法 service 類,傳入的參數中的 args 陣列。

指定外掛程式作為 <feature> 在科爾多瓦 iOS 應用程式專案中的標記 config.xml

<feature name="LocalStorage">
    <param name="ios-package" value="CDVLocalStorage" />
</feature>

功能 name 屬性應匹配您在 JavaScript 中使用 exec 調用的 service 參數,和 value 屬性應與外掛程式的目標 C 類的名稱相匹配。 <param name>應始終是我 "ios-package" 。 如果不遵循此安裝程式,該外掛程式可能編譯,但不是會到達科爾多瓦。

外掛程式初始化和存留期

外掛程式物件的一個實例創建為生活的每個 UIWebView 。 外掛程式不會具現化之前他們第一次引用通過調用從 JavaScript,除非 <param>onload name 屬性設置為 "true"config.xml 。 例如:

<feature name="Echo">
    <param name="ios-package" value="Echo" />
    <param name="onload" value="true" />
</feature>

沒有指定外掛程式的初始值設定項。相反,應使用外掛程式 pluginInitialize 他們開辦的邏輯方法。

長時間運行的請求,外掛程式背景活動 (例如,播放的媒體),聽眾或內部狀態應執行 onReset 方法和停止或清理這些活動。 這種方法運行時 UIWebView 定位到新的一頁或刷新,重新載入 JavaScript。

寫作 iOS 科爾多瓦外掛程式

我們有外掛程式請求到本機端 JavaScript 起火燃燒。 我們有通過正確映射的目標 C 的 iOS 外掛程式 config.xml 。 所以最後的 iOS 目標 C 外掛程式類長什麼樣子?

什麼獲取調度到該外掛程式通過 JavaScript 的 exec 函數獲取傳遞到相應的外掛程式類的 action 方法。外掛程式的方法有此簽名:

- (void)myMethod:(CDVInvokedUrlCommand*)command
{
    CDVPluginResult* pluginResult = nil;
    NSString* myarg = [command.arguments objectAtIndex:0];

    if (myarg != nil) {
        pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
    } else {
        pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"Arg was null"];
    }
    [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
  1. CDVInvokedUrlCommand.h

  2. CDVPluginResult.h

  3. CDVCommandDelegate.h

iOS CDVPluginResult 訊息類型

使用 CDVPluginResult 可以返回結果類型的各種回您的 JavaScript 回呼函數,使用看起來像的類方法:

+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAs...

您可以創建 StringIntDoubleBoolArrayDictionaryArrayBuffer ,和 Multipart 類型。 或者,不附加任何參數 (只是發送狀態)。 或者,返回一個錯誤。 你甚至可以選擇不發送任何外掛程式的結果,在這種情況下不會觸發回

備註

Echo 外掛程式 iOS 外掛程式

我們會將以下內容添加到該專案的 config.xml

<feature name="Echo">
    <param name="ios-package" value="Echo" />
</feature>

然後我們將添加下列Echo.hEcho.m ) 到我們科爾多瓦 iOS 應用程式目錄裡面的外掛程式目錄:

/********* Echo.h Cordova Plugin Header *******/

#import <Cordova/CDV.h>

@interface Echo : CDVPlugin

- (void)echo:(CDVInvokedUrlCommand*)command;

@end

/********* Echo.m Cordova Plugin Implementation *******/

#import "Echo.h"
#import <Cordova/CDV.h>

@implementation Echo

- (void)echo:(CDVInvokedUrlCommand*)command
{
    CDVPluginResult* pluginResult = nil;
    NSString* echo = [command.arguments objectAtIndex:0];

    if (echo != nil && [echo length] > 0) {
        pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:echo];
    } else {
        pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
    }

    [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}

@end

讓我們看看代碼。在頂部,我們有所有必要的科爾多瓦進口。我們班延伸從 CDVPlugin (非常重要)。

此外掛程式只支援一個操作, echo 的行動。 第一,我們抓住 echo 字串使用 objectAtIndex 方法上的我們 args ,告訴它我們想要獲取的參數陣列中的第十的參數。 我們做一些參數檢查: 請確保它不是 nil ,並確保它不是一個零長度的字串。

如果是,我們返回 PluginResultERROR 狀態。 如果所有這些檢查通過,然後我們將返回 PluginResultOK 狀態,並通過在 echo 我們收到了在第一位作為參數的字串。

最後,我們發送結果到 self.commandDelegate ,其中執行 exec 方法的成功或失敗回 JavaScript 一邊。 如果成功回被調用,它將通過在 echo 參數。

執行緒

在相同的 UI 執行緒中執行的外掛程式方法。如果你的外掛程式需要大量的處理,或者需要一個阻塞調用,則應使用後臺執行緒。例如:

- (void)myPluginMethod:(CDVInvokedUrlCommand*)command
{
    // Check command.arguments here.
    [self.commandDelegate runInBackground:^{
        NSString* payload = nil;
        // Some blocking logic...
        CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:payload];
        // The sendPluginResult method is thread-safe.
        [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
    }];
}

高級的外掛程式功能

請參閱其他方法時,您可以在重寫:

例如,你可以掛接到 pauseresume ,應用程式終止和 handleOpenURL 事件

調試外掛程式

若要調試的目標 C 側,您將使用 Xcode 的內置調試器。 對於 JavaScript,在 iOS 5.0 可以使用Weinre、 Apache 科爾多瓦專案iWebInspector、 一個協力廠商實用程式

Ios 6,您將使用 Safari 6.0 將簡單地附加到您的應用程式運行在 iOS 6 模擬器。

常見的陷阱