在将数据从javascript传递到目标c时,不会调用shouldStartLoadWithRequest

时间:2018-02-07 09:36:31

标签: javascript objective-c iframe uiwebview uiwebviewdelegate

我查看了与此问题相关的大部分StackOverflow答案,但我没有得到我的解决方案,所以我决定在StackOverflow中询问。
问题: shouldStartLoadWithRequest未被调用。我在calliOSFunction内部添加了提醒功能。我需要showToastPassValues中得到的所有价值 这是我的代码:

的index.html

    function showToastPassValues(phrase,thisAddress,thisPrivKey,thisPubKey){
    var phrase = phrase;
    var thisAddress = thisAddress;
    var thisPrivKey = thisPrivKey;
    var thisPubKey = thisPubKey;
    //app.makeToastPassValues(phrase,thisAddress,thisPrivKey,thisPubKey);
    //var message = {"key1":"value1", "key2":"value2", "dictionary": {"name": "foo"}};
    //window.webkit.messageHandlers.fontsReady.postMessage(message);
    calliOSFunction("sayHello", phrase, "onSuccess", "onError");
    return false;
}
function calliOSFunction(functionName, args, successCallback, errorCallback) {
    var url = "js2ios:///";
    var callInfo = {};
    callInfo.functionname = functionName;
    //alert("Custom menu clicked !!"+functionName);
    if (successCallback)
    {
        //alert("Success !!"+functionName);
        callInfo.success = successCallback;
    }
    if (errorCallback)
    {
        //alert("Error !!"+functionName);
        callInfo.error = errorCallback;
    }
    if (args)
    {
        alert("args !!"+args);
        callInfo.args = args;
    }

    url += JSON.stringify(callInfo)

    //openCustomURLinIFrame(url);
    execute(url);
}
function openCustomURLinIFrame(src)
{
    var rootElm = document.documentElement;
    var newFrameElm = document.createElement("IFRAME");
    newFrameElm.setAttribute("src",src);
    rootElm.appendChild(newFrameElm);
    //remove the frame now
    newFrameElm.parentNode.removeChild(newFrameElm);
    newFrameElm = null;
}
function execute(url)
{
    var iframe = document.createElement("IFRAME");
    iframe.setAttribute("src", url);
    document.documentElement.appendChild(iframe);
    iframe.parentNode.removeChild(iframe);
    iframe = null;
}
function onSuccess (ret)
{
    if (ret)
    {
        var obj = JSON.parse(ret);
        document.write(obj.result);
    }
}
function onError (ret)
{
    if (ret)
    {
        var obj = JSON.parse(ret);
        document.write(obj.error);
    }
}  

Viewcontroller.m

    - (void)viewDidLoad {
        [super viewDidLoad];
        _webView.delegate = self;
        NSString *filePath;
        NSBundle *thisBundle;
        NSMutableString *html;
        _webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, 1024,768)];
        thisBundle = [NSBundle mainBundle];
        filePath = [thisBundle pathForResource:@"index" ofType:@"html"];
        html = [NSMutableString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
        //[_webView loadHTMLString:[NSString stringWithFormat:@"%@",html] baseURL: [[NSBundle mainBundle] bundleURL]];
        [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]isDirectory:NO]]];

        [self.view addSubview:_webView];
    }  
#pragma mark WKWebView Delegaet Methods
-(void)webViewDidStartLoad:(UIWebView *)webView1 {
    //NSLog(@"start");
}
-(void)webViewDidFinishLoad:(UIWebView *)webView1 {
    //NSLog(@"finish");
}
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    NSLog(@"Error for WEBVIEW: %@", [error description]);
}
#pragma mark -
#pragma mark Html to Objective-C Methods

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSLog(@"Loading: %@", [request URL]);
    NSURL *url = [request URL];
    NSString *urlStr = url.absoluteString;
    return [self processURL:urlStr];
}
- (BOOL) processURL:(NSString *) url {
    NSString *urlStr = [NSString stringWithString:url];
    NSString *protocolPrefix = @"js2ios:///";
    //process only our custom protocol
    if ([[urlStr lowercaseString] hasPrefix:protocolPrefix]) {
        //strip protocol from the URL. We will get input to call a native method
        urlStr = [urlStr substringFromIndex:protocolPrefix.length];
        //Decode the url string
        //urlStr = [urlStr stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        urlStr = [urlStr stringByRemovingPercentEncoding];
        NSError *jsonError;
        //parse JSON input in the URL
        NSDictionary *callInfo = [NSJSONSerialization JSONObjectWithData:[urlStr dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&jsonError];
        //check if there was error in parsing JSON input
        if (jsonError != nil) {
            NSLog(@"Error parsing JSON for the url %@",url);
            return NO;
        }
        //Get function name. It is a required input
        NSString *functionName = [callInfo objectForKey:@"functionname"];
        if (functionName == nil) {
            NSLog(@"Missing function name");
            return NO;
        }
        NSString *successCallback = [callInfo objectForKey:@"success"];
        NSString *errorCallback = [callInfo objectForKey:@"error"];
        NSArray *argsArray = [callInfo objectForKey:@"args"];
        [self callNativeFunction:functionName withArgs:argsArray onSuccess:successCallback onError:errorCallback];
        return NO;
    }
    return YES;
}
- (void) callNativeFunction:(NSString *) name withArgs:(NSArray *) args onSuccess:(NSString *) successCallback onError:(NSString *) errorCallback {
    if ([name compare:@"sayHello" options:NSCaseInsensitiveSearch] == NSOrderedSame) {
        if (args.count > 0) {
            NSLog(@"args : %@",args);

        } else {
            NSString *resultStr = [NSString stringWithFormat:@"Error calling function %@. Error : Missing argument", name];
            [self callErrorCallback:errorCallback withMessage:resultStr];
        }
    } else {
        //Unknown function called from JavaScript
        NSString *resultStr = [NSString stringWithFormat:@"Cannot process function %@. Function not found", name];
        [self callErrorCallback:errorCallback withMessage:resultStr];
    }
}
-(void) callErrorCallback:(NSString *) name withMessage:(NSString *) msg {
    if (name != nil) {
        //call error handler
        NSMutableDictionary *resultDict = [[NSMutableDictionary alloc] init];
        [resultDict setObject:msg forKey:@"error"];
        [self callJSFunction:name withArgs:resultDict];
    } else {
        //NSLog(@"%@",msg);
    }
}

-(void) callSuccessCallback:(NSString *) name withRetValue:(id) retValue forFunction:(NSString *) funcName {
    if (name != nil) {
        //call succes handler
        NSMutableDictionary *resultDict = [[NSMutableDictionary alloc] init];
        [resultDict setObject:retValue forKey:@"result"];
        [self callJSFunction:name withArgs:resultDict];
    } else {
        //NSLog(@"Result of function %@ = %@", funcName,retValue);
    }
}
-(void) callJSFunction:(NSString *) name withArgs:(NSMutableDictionary *) args {
    NSError *jsonError;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:args options:0 error:&jsonError];
    if (jsonError != nil) {
        //call error callback function here
        NSLog(@"Error creating JSON from the response  : %@",[jsonError localizedDescription]);
        return;
    }
    NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    if (jsonStr == nil) {
        NSLog(@"jsonStr is null. count = %lu", (unsigned long)[args count]);
    }
}  

提前致谢。

1 个答案:

答案 0 :(得分:0)

得到了一个答案,我尝试使用loadHTMLString加载我的html文件,但它确实有用。