iOS與JS互動,OC呼叫JS方法,JS呼叫OC方法,URL解碼
首先 iOS7開始 蘋果公佈了JavaScriptCore.framework 它使得JS與OC的互動更加方便了。
第一步:匯入framework
OC 呼叫JS方法 :(一句話即可)
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
// JS url載入完成後,可直接呼叫JS方法showmessage。 如果有需求,還可以傳遞引數。
[myWebView stringByEvaluatingJavaScriptFromString:@"showmessage('引數')"];
// 若JS有返回值此方法會直接返回。返回的格式為URL編碼格式,所以必須解碼才能使用。 下邊是解碼方法
例如: NSString *data = [myWebViewstringByEvaluatingJavaScriptFromString:@"showmessage('引數')"];
}
// URL 解碼
- (NSString *)decodeFromPercentEscapeString: (NSString *) input
{
NSMutableString *outputStr = [NSMutableString stringWithString:input];
[outputStr replaceOccurrencesOfString:@"+"
withString:@" "
options:NSLiteralSearch
range:NSMakeRange(0, [outputStr length])];
return [outputStr stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}
JS呼叫OC方法:
// webView 的代理方法, 網頁載入之前呼叫。看到之前有同學提供的例子。
首先在js中宣告方法
- <html>
- <head>
- <metahttp-equiv="content-type"content="text/html;charset=utf-8">
- <title>js呼叫oc</title>
- <scripttype="text/javaScript">
- /* 呼叫本地帶引數的方法 */
- function testFunction1(cmd,parameter1){
- return document.location="objc://"+cmd+":/"+parameter1; //cmd代表objective-c中的的方法名,parameter1自然就是引數了
- }
- /* 呼叫本地不帶引數的方法 */
- function testFunction2(cmd){
- return document.location="objc://"+cmd; //cmd代表objective-c中的的方法名
- }
- </script>
- </head>
- <body>
- <p><buttontype="text"id="text1"value="點選這裡1"onclick="testFunction1('printLog:','str')">呼叫本地帶引數的方法</button></p>
- <p><buttontype="text"id="text2"value="點選這裡2"onclick="testFunction2('testFunc')">呼叫本地不帶引數的方法</button></p>
- </body>
- </html>
再呼叫webview代理
- - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
- {
- NSString *urlString = [[request URL] absoluteString];
- NSArray *urlComps = [urlStringcomponentsSeparatedByString:@"://"];
- if([urlComps count] && [[urlCompsobjectAtIndex:0] isEqualToString:@"objc"])
- {
- NSArray *arrFucnameAndParameter = [(NSString*)[urlCompsobjectAtIndex:1] componentsSeparatedByString:@":/"];
- NSString *funcStr = [arrFucnameAndParameterobjectAtIndex:0];
- if (1 == [arrFucnameAndParametercount])
- {
- // 沒有引數
- if([funcStr isEqualToString:@"testFunc"])
- {
- /*呼叫本地函式*/
- [self testFunc];
- }
- }
- elseif(2 == [arrFucnameAndParametercount])
- {
- //有引數的
- if([funcStr isEqualToString:@"printLog:"] && [arrFucnameAndParameterobjectAtIndex:1])
- {
- /*呼叫本地函式*/
- [self printLog:@"js呼叫本地帶引數的方法成功!"];
- }
- }
- returnNO;
- };
- returnYES;
- }
- - (void)printLog:(NSString *)str
- {
- NSLog(@"%@", str);
- }
- - (void)testFunc
- {
- NSLog(@"js呼叫本地不帶引數的方法成功!");
- }