worklight 6.0适配器本机ios到混合应用程序

时间:2015-04-25 10:40:09

标签: ibm-mobilefirst worklight-adapters

我可以在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本地的适配器。

1 个答案:

答案 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