前言
做項目過程中,后臺人員想在H5頁面直接調(diào)用一個js方法來實現(xiàn)iOS系統(tǒng)的復(fù)制功能。對webView熟悉的朋友可能馬上會想到UIWebView的代理方法shouldStartLoadWithRequest蚌讼。如果后臺發(fā)給我一個請求东羹,我可以通過這個代理方法截獲這個特殊請求糜值,從而實現(xiàn)頁面想要的復(fù)制功能丰捷。但是現(xiàn)在后臺不想在H5頁面發(fā)任何請求坯墨,他們只想在H5頁面直接調(diào)用js方法就實現(xiàn)復(fù)制功能。乍一看病往,這怎么可能呢捣染?不過通過查找資料,這個方案確實可以實現(xiàn)停巷。
UIWebView加載的H5頁面通過JS方法來調(diào)用原生方法
Cocoa已經(jīng)為我們提供了JS和原生API交互的框架:JavaScriptCore.framework耍攘。我們只需要:
1.新建一個類和一個協(xié)議,該協(xié)議遵守協(xié)議JSExport叠穆,使新建類遵守這個自定義協(xié)議少漆。協(xié)議里的方法便是js對象要調(diào)用的方法臼膏。
2.通過JSContext把js對象和oc對象進(jìn)行綁定硼被。
主要代碼如下:
/// js方法需要調(diào)用的方法均需要在此協(xié)議中實現(xiàn)
@protocol YSNativeAPIDelegate <JSExport>
/// 復(fù)制字符串到剪切板
- (void)copy:(NSString *)copyStr;
@end
@interface YSNativeAPI : NSObject <YSNativeAPIDelegate>
+ (void)configureWithWebView:(UIWebView *)webView andJSObject:(NSString *)jsObj;
@end
@implementation YSNativeAPI
#pragma mark - call methods
+ (void)configureWithWebView:(UIWebView *)webView andJSObject:(NSString *)jsObj {
JSContext *jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
YSNativeAPI *nativeObj = [YSNativeAPI new];
jsContext[jsObj] = nativeObj;
}
#pragma mark - delegate methods
- (void)copy:(NSString *)copyStr {
// copy string to pasteboard
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
pasteboard.string = copyStr;
}
@end
調(diào)用代碼:
// 調(diào)用此方法后,webView加載的H5頁面就可以直接通過JS對象“Xing”來調(diào)用YSNativeAPI里的代理方法
[YSNativeAPI configureWithWebView:self.webView andJSObject:@"Xing"];
我做了一個demo放到了GitHub上渗磅,有需要的同學(xué)可以下載參考嚷硫,地址如下:
GitHub