Developer Rajinikanth
Developer Rajinikanth

Reputation: 354

worklight 6.0 adapter native ios to hybrids application

I can able to call worklight 6.0 adapter invoke in IOS native code (using Objective-C) but i can not read adapter JSON response using cordova plugin from my hybrids application.

// invoke the adapter

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 application call the native code

cordova.exec(sayHelloSuccess, sayHelloFailure, "HelloWorldPlugin", "sayHello", [name]);

above the cordova.exec success and failed method is not return the value.

but i can not able to parse the value from CDVPluginResult method. Anybody please advice me. how can i read the adapter for IOS native from hybrids application.

Upvotes: 0

Views: 186

Answers (1)

Idan Adar
Idan Adar

Reputation: 44516

Several things to note:

  • You are using Worklight 6.0.0.x. In Worklight 6.0.0.x there is no proper session sharing between web and native views. Meaning, if you will for example call the WL.Client.connect() method in the web view and then do a connect() and adapter invocation in the native view - these calls will not share the same session which can lead to race condition errors, inability to share state between the views and other unexpected events. Not recommended.

  • If this is the approach you're looking to implement in your Hybrid application it is therefore highly recommended that you will upgrade to either MobileFirst (previous known as "Worklight") v6.3 or v7.0 where session sharing between web and native views is now available out-of-the-box.

  • Although you might just want to opt to call the adapter from the JS code...


To get this to work as-is in your supplied project, you can change the implementation based on the below.

Note that the implementation below was based on MFP 7.0, as such the adapter invocation code will not work in your 6.0.0.0x codebase. You will need to alter it based on your own code in 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

The responseText line is commented out because the data retrieved from the adapter was too large I suppose, so it's best to return only what you really need and not all of it.

#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

Upvotes: 1

Related Questions