javascript将字符串传递给本机objective-c

Posted

技术标签:

【中文标题】javascript将字符串传递给本机objective-c【英文标题】:javascript to pass string to native objective-c 【发布时间】:2014-04-08 09:24:55 【问题描述】:

我想将按钮单击中的字符串从html 传递到ios native objective-c。这是我的html 和简单的javascript

<html>
    <head>
        <script language="javascript">
            function callVrama(vramaID) 
            window.location= "vramaWebShelves://vramaID/"+vramaID;
            
            </script>
    </head>
    <body>
       <button onclick="callVrama('asdfqwer1234')">Try it</button>
    </body>
</html>

这是我在UIWebViewDelegate中的功能:

- (void)viewDidLoad

    NSURL *url = [[NSBundle mainBundle] URLForResource:@"content"
                                                  withExtension:@"html"];
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];

    [super viewDidLoad];

    [_webShelves loadRequest:requestObj];
    _webShelves.delegate = self;

/// some other codes

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
 navigationType:(UIWebViewNavigationType)navigationType 
    NSString *url = [[request URL] absoluteString];

    static NSString *urlPrefix = @"vramaWebShelves://vramaID/";

    if ([url hasPrefix:urlPrefix]) 
        NSString *vramaID = [url substringFromIndex:[urlPrefix length]];
        NSLog(@"VramasRequest: %@", vramaID);
        return NO;
    
    else 
        return YES;
    

似乎有什么问题?

我实际上是按照link 中的教程进行操作的,一切正常。我只是不确定如何将js function 呼叫从点击uiwebview 更改为按钮。这是他的javascript

<script language="javascript">
            function resizeText(multiplier) 
                if (document.body.style.fontSize == "") 
                    document.body.style.fontSize = "1.0em";
                
                document.body.style.fontSize =
                parseFloat(document.body.style.fontSize) +
                (multiplier * 0.2) + "em";
            

            function touchStart(event) 
                sX = event.touches[0].clientX;
                sY = event.touches[0].clientY;
            

            function touchEnd(event) 
                var parentNode = event.target.parentNode
                if ( parentNode != null && parentNode.nodeName.toLowerCase() == "a" )
                    return;

                if (event.changedTouches[0].clientX == sX &&
                    event.changedTouches[0].clientY == sY) 

                    window.location = "nativeAction://hideShow";
                
            

            document.addEventListener("touchstart", touchStart, false);
            document.addEventListener("touchend", touchEnd, false);

            </script>

【问题讨论】:

什么问题? webView:shouldStartLoadWithRequest 未调用或未解析参数? webView:shouldStartLoadWithRequest 不打电话。我还需要处理javascript 的其他事情吗? 【参考方案1】:

我认为这两行有问题:

[_webShelves loadRequest:requestObj];
_webShelves.delegate = self;

请尝试在loadRequest之前设置delegate

【讨论】:

你在哪里创建_webShelves,是不是零?加载内容 html 时,应该至少调用一次 shouldStartLoadWithRequest。 我用另一个html(具有不同的js函数)测试它可以工作,这意味着不是ios部分,而是js中缺少一些东西。 也许你应该设置window.location.href 也试过了。还是没有结果。【参考方案2】:

经过多次重读和一些其他相关测试。我想知道如何让它工作。在objective c中,替换这个函数:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
 navigationType:(UIWebViewNavigationType)navigationType 

    if ([request.URL.scheme caseInsensitiveCompare:@"vramaWebShelves"] == NSOrderedSame) 
        NSString *url = [[request URL] absoluteString];
        static NSString *urlPrefix = @"vramaWebShelves://vramaID/";
        NSString *vramaID = [url substringFromIndex:[urlPrefix length]];
        NSLog(@"VramasRequest: %@",vramaID);
        return NO;
    

    return YES;

注意caseInsensitiveCompare:@"vramaWebShelves",不是caseInsensitiveCompare:@"vramaWebShelves://",我认为是我对函数缺乏了解。

而且,我的 javascripthtml 没有问题。

【讨论】:

以上是关于javascript将字符串传递给本机objective-c的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 将 Uint8List 传递给 iOS Objective-c

将 Dictionary<string, object> 传递给 MVC 控制器

如何通过 FromQuery 参数将“System.Object”类型传递给控制器

将 javascript 字符串传递给 std::string 打印垃圾值

如何将内存流作为字符串传递给 javascript

如何将 PHP 字符串传递给 Javascript 函数调用? [复制]