Привязать нативное событие iOS к веб-представлению, используя собственный плагин Cordova
Мне нужно создать плагин для перехвата событий, происходящих в веб-представлении Cordova моего iOS-приложения, и запуска действий в нативной части приложения, и наоборот.
Я следовал этому уроку, и он отлично работает.
Когда я пытаюсь адаптировать его к другому приложению (я хотел, чтобы оно было более общим, чем учебное пособие), оно работает от webView до нативной части, но никак не иначе.
Я просто пытаюсь нажать кнопку на панели навигации, чтобы изменить цвет фона моего веб-вида. На данный момент, похоже, что код JavaScript плагина не получает событие, потому что отображаются только журналы iOS.
Весь мой код в XCode, поэтому я не вижу никаких предупреждений / ошибок из веб-части.
Вот часть плагина для iOS:
@interface HybridBridge()
@property (nonatomic, retain) NSString *listenerCallbackId;
@end
@implementation HybridBridge
-(void)bindAction:(CDVInvokedUrlCommand*) command{
self.listenerCallbackId = command.callbackId;
CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
[pluginResult setKeepCallbackAsBool:true];
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
-(void)reportEvent:(NSDictionary*)eventData{
CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:eventData];
[pluginResult setKeepCallbackAsBool:true];
[self.commandDelegate sendPluginResult:pluginResult callbackId:self.listenerCallbackId];
}
Вот часть JavaScript плагина:
var HybridBridge = (function() {
var PLUGIN_NAME = "HybridBridge";
var ACTION_BIND_LISTENER = "bindAction";
this.bindListener = function(listener) {
cordova.exec(listener, listener, PLUGIN_NAME, ACTION_BIND_LISTENER, []);
};
return this;
}());
Вот слушатель события javascript:
var NativeEventsListener = (function() {
this.onReceivedEvent = function(eventData) {
var eventHandler = function(){};
switch (eventData.eventType){
case "colorButtonClicked":
eventHandler = colorButtonClickEvent;
break;
default:
}
eventHandler(eventData);
};
function colorButtonClickEvent(eventData){
changeBackgroundColor(eventData.color);
}
function changeBackground(color) {
document.body.style.background = color;
}
return this;
}());
Вот файл main.js, в котором привязывается прослушиватель событий к плагину:
function wlCommonInit(){
HybridBridge.bindListener(NativeEventsListener.onReceivedEvent);
}
function wlEnvInit(){
wlCommonInit();
}
И, наконец, вот вызов плагина в target-C:
- (IBAction)changeWebPageColor {
redColor = !redColor;
NSString *color = redColor ? @"red" : @"white";
HybridBridge *bridge = [self.pluginObjects objectForKey:@"HybridBridge"];
NSDictionary *eventData = [NSDictionary dictionaryWithObjectsAndKeys:
@"colorButtonClicked", @"eventType",
color, @"color",
nil];
[bridge reportEvent:eventData];
}
Спасибо за помощь!
1 ответ
Попробуйте внедрить этот пример в свой проект.
убедитесь, что вы уже определили свой плагин в своем config.xml
<feature name="CustomPlugin">
<param name="ios-package" value="CustomPlugin" />
</feature>
Реализация плагина с использованием кода Objective-C
CustomPlugin.h
#import <Foundation/Foundation.h>
#import <Cordova/CDV.h>
@interface CustomPlugin : CDVPlugin
- (void)sayHello:(CDVInvokedUrlCommand*)command;
@end
CustomPlugin.m
#import "CustomPlugin.h"
@implementation CustomPlugin
- (void)sayHello:(CDVInvokedUrlCommand*)command{
NSString *responseString =
[NSString stringWithFormat:@"Hello World, %@", [command.arguments objectAtIndex:0]];
CDVPluginResult *pluginResult =
[CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:responseString];
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
@end
Вызов плагина из JavaScript
function initial(){
var name = $("#NameInput").val();
cordova.exec(sayHelloSuccess, sayHelloFailure, "CustomPlugin", "sayHello", [name]);
}
function sayHelloSuccess(data){
alert("OK: " + data);
}
function sayHelloFailure(data){
alert("FAIL: " + data);
}