3

I have a Phonegap Cordova plugin. In this plugin I receive a click event from javascript.This click triggers a file download using my client library. This file download sends events and calls methods in my plugin, as I have set it to be delegate.

I can't manage to sends those events back to the javascript using 'stringByEvaluatingJavaScriptFromString' It seems like it doesn't triggers the call.

It's working when I try to call it after a javascript click to the echo Plugin method.

Here is the .m plugin class :

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

@implementation CCDataBundlePlugin


-(id)init{

[MYCLIENTLIB sharedInstance].delegate = self;

self = [super init];
    return self;
}

- (void)echo:(CDVInvokedUrlCommand*)command
{
NSLog(@"------ Received click");
    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];
    }

// When latest extraction succeeded, call next download
[[MYCLIENTLIB sharedInstance] downloadBundlesForChannel:@"myChannel"];
// When latest download succeeded, call next extraction
[[MYCLIENTLIB sharedInstance] extractBundlesForChannel:@"myChannel"];

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

-(void)callJavascriptMethodWithString:(NSString*)stringParameter{

NSString* jsString = [NSString stringWithFormat:@"CN.Interface.Recepter.receiveWithString(\"%@\");", stringParameter];

    //The line under is not working, I don't get the function call in JS
[self.webView stringByEvaluatingJavaScriptFromString:jsString];

}

// DOWNLOAD EVENTS Called from the Library
- (void)dataBundle:(MYCLIENTLIB *)dataBundle downloadDidStartForChannelIdentifier:(NSString *)channelIdentifier  {

NSLog(@"download in progress..."); // this is logged

[self callJavascriptMethodWithString:@"download in progress..."];
    // The line above do calls the method

}
4

2 回答 2

1

我不久前在这里写了一个cordova插件教程:http ://www.zen-sign.com/writing-a-cordova-plugin/ 。应该对你有很好的帮助。同时,这是我在我的原生插件包装器的 init/configure 方法中成功使用的基本结构:

- (void)configurePlugin:(CDVInvokedUrlCommand*)command
{
      // Cordova Result object and stirng to send to JS
      CDVPluginResult* pluginResult = nil;
      NSString* javaScript = nil;

      @try
      {
           // Create an instance of the class we want to wrap. This could be your 3rd party    library or whatever you want.
           wrappedClass = [[WrapMeUp alloc] init];

           pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:@"{'success' : '1'}"];
           javaScript = [pluginResult toSuccessCallbackString:command.callbackId];

      }
      @catch (NSException* exception)
      {
           //Sumptin went worng!
           pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_JSON_EXCEPTION messageAsString:[exception reason]];
           javaScript = [pluginResult toErrorCallbackString:command.callbackId];
      }

      // Write plugin results back to JS callback
      [self writeJavascript:javaScript];
 }
于 2013-07-23T14:37:56.550 回答
1

只是如果有人想做同样的事情,我设法通过使用 javascript 计时器调用本机插件方法来做到这一点。我会搜索如果我能找到更清洁的方法

于 2013-07-25T11:53:12.050 回答