我可以在IOS本机代码中调用worklight 6.0适配器调用(使用Objective-C)但我无法使用我的混合应用程序中的cordova插件读取适配器JSON响应。
//调用适配器
MyConnectListener *connectListener = [[MyConnectListener alloc] initWithController:self];
[[WLClient sharedInstance] wlConnectWithDelegate:connectListener];
// calling the adapter using objective-c
WLProcedureInvocationData *myInvocationData = [[WLProcedureInvocationData alloc] initWithAdapterName:@"HTTP_WS_ADPTR" procedureName:@"getBalance"];
MyInvokeListener *invokeListener = [[MyInvokeListener alloc] initWithController: self];
[[WLClient sharedInstance] invokeProcedure:myInvocationData withDelegate:invokeListener];
CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:responseString];
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
// hybrids应用程序调用本机代码
cordova.exec(sayHelloSuccess, sayHelloFailure, "HelloWorldPlugin", "sayHello", [name]);
上面的cordova.exec成功并且失败的方法没有返回值。
但我无法解析CDVPluginResult方法的值。有人请指教。我怎样才能从混合应用程序中读取适用于IOS本地的适配器。
答案 0 :(得分:1)
有几点需要注意:
您正在使用Worklight 6.0.0.x.在Worklight 6.0.0.x中,Web和本机视图之间没有正确的会话共享。这意味着,例如,如果您将在Web视图中调用WL.Client.connect()
方法,然后在本机视图中执行connect()和适配器调用 - 这些调用将不会共享可导致竞争条件错误的同一会话,无法在视图和其他意外事件之间共享状态。不推荐。
如果这是您希望在混合应用程序中实施的方法,那么强烈建议您升级到MobileFirst(之前称为" Worklight")v6。 3或v7.0,现在可以开箱即用网页和本机视图之间的会话共享。
虽然您可能只想选择从JS代码中调用适配器...
要使其在您提供的项目中按原样运行,您可以根据以下内容更改实施。
请注意,下面的实现基于MFP 7.0,因此适配器调用代码在6.0.0.0x代码库中不起作用。您需要根据自己在v6.0.0.x中的代码更改它:
<强> sayHello.h 强>
#import <Foundation/Foundation.h>
#import <Cordova/CDV.h>
#import "WLClient.h"
#import "WLDelegate.h"
@interface SayHelloPlugin : CDVPlugin
- (void)sayHello:(CDVInvokedUrlCommand*)command;
- (void)callResult:(NSString*)response;
@end
<强> sayHello.m 强>
#import "SayHelloPlugin.h"
#import "MyConnectListener.h"
CDVInvokedUrlCommand *tempCommand;
@implementation SayHelloPlugin
- (void)sayHello:(CDVInvokedUrlCommand*)command {
MyConnectListener *connectListener = [[MyConnectListener alloc] init:self];
[[WLClient sharedInstance] wlConnectWithDelegate:connectListener];
tempCommand = command;
}
-(void)callResult:(NSString*)response{
CDVPluginResult *pluginResult =
[CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:response];
[self.commandDelegate sendPluginResult:pluginResult callbackId:tempCommand.callbackId];
}
@end
<强> MyConnectListener.h 强>
#import <Foundation/Foundation.h>
#import "WLClient.h"
#import "WLDelegate.h"
#import "SayHelloPlugin.h"
@interface MyConnectListener : NSObject <WLDelegate> {
@private
SayHelloPlugin *sh;
}
- (id)init: (SayHelloPlugin *)sayHello;
@end
<强> MyConnctListener.m 强>
responseText
行被注释掉了,因为我认为从适配器检索的数据太大了,所以最好只返回你真正需要的而不是全部。
#import "MyConnectListener.h"
#import "WLResourceRequest.h"
NSString *resultText;
NSString *request;
@implementation MyConnectListener
- (id)init: (SayHelloPlugin *) sayHello{
if ( self = [super init] )
{
sh = sayHello;
}
return self;
}
-(void)onSuccess:(WLResponse *)response{
NSURL* url = [NSURL URLWithString:@"/adapters/testAdapter/getStories"];
WLResourceRequest* request = [WLResourceRequest requestWithURL:url method:WLHttpMethodGet];
[request setQueryParameterValue:@"['technology']" forName:@"params"];
[request sendWithCompletionHandler:^(WLResponse *response, NSError *error) {
if(error != nil){
resultText = @"Invocation failure: ";
resultText = [resultText stringByAppendingString: error.description];
[sh callResult:resultText];
}
else{
resultText = @"Invocation success. ";
//resultText = [resultText stringByAppendingString:response.responseText];
[sh callResult:resultText];
}
}];
}
-(void)onFailure:(WLFailResponse *)response{
resultText = @"Connection failure: ";
resultText = [resultText stringByAppendingString:[response errorMsg]];
NSLog(@"***** failure response: %@", resultText);
[sh callResult:resultText];
}
@end