Skip to content

Commit

Permalink
修改白名单域名匹配规则
Browse files Browse the repository at this point in the history
  • Loading branch information
pcjbird committed Mar 10, 2018
1 parent 5ea4701 commit 2a34428
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 10 deletions.
1 change: 1 addition & 0 deletions .travis.yml
@@ -1,5 +1,6 @@

language: objective-c
osx_image: xcode9

env:
global:
Expand Down
5 changes: 4 additions & 1 deletion SmartJSWebView.podspec
@@ -1,7 +1,10 @@
Pod::Spec.new do |s|
s.name = 'SmartJSWebView'
s.summary = '支持 H5 页面通过 JavaScript 与 Native App 交互的 WebView,兼容 UIWebView 和 WKWebView。'
s.version = '1.0.6'
s.description = <<-DESC
支持 H5 页面通过 JavaScript 与 Native App 交互的 WebView,兼容 UIWebView 和 WKWebView,支持白名单功能。
DESC
s.version = '1.0.7'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.authors = { 'pcjbird' => 'pcjbird@hotmail.com' }
s.social_media_url = 'http://www.lessney.com'
Expand Down
2 changes: 1 addition & 1 deletion SmartJSWebView/Info.plist
Expand Up @@ -15,7 +15,7 @@
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0.6</string>
<string>1.0.7</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSPrincipalClass</key>
Expand Down
3 changes: 3 additions & 0 deletions SmartJSWebView/public_headers/SmartJSWebView.h
Expand Up @@ -8,6 +8,9 @@
// 框架名称:SmartJSWebView
// 框架功能:支持 H5 页面通过 JavaScript 与 Native App 交互的 WebView,兼容 UIWebView 和 WKWebView。
// 修改记录:
// pcjbird 2018-03-10 Version:1.0.7 Build:201803100002
// 1.修改白名单域名匹配规则
//
// pcjbird 2018-03-10 Version:1.0.6 Build:201803100001
// 1.调整命名
// 2.修改白名单提供方式
Expand Down
66 changes: 58 additions & 8 deletions SmartJSWebView/source/SmartJSWebViewProxy.m
Expand Up @@ -178,6 +178,36 @@ -(void)webView:(UIWebView *)webView didCreateJavaScriptContext:(JSContext *)ctx
[webView stringByEvaluatingJavaScriptFromString:injection];
}

#pragma mark - 判断域名是否在白名单中
-(BOOL) isHost:(NSString*)host inWhitelist:(NSArray<NSString*>*)whitelist
{
__block BOOL result = NO;
if([host isKindOfClass:[NSString class]] && [whitelist isKindOfClass:[NSArray<NSString*> class]])
{
[whitelist enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0f)
{
if([host containsString:obj])
{
result = YES;
*stop = YES;
}
}
else
{
NSRange range = [host rangeOfString:obj];
if(range.location != NSNotFound && range.length > 0)
{
result = YES;
*stop = YES;
}
}

}];
}
return result;
}

#pragma mark - UIWebViewDelegate

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
Expand Down Expand Up @@ -262,13 +292,13 @@ - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)
BOOL isSafe = YES;
if(self.securityProxy && [self.securityProxy conformsToProtocol:@protocol(SmartJSWebSecurityProxy)])
{
BOOL useWhiteList = [self.securityProxy shouldSmartJSWebViewUseSecurityWhitelist:[webView superview]];
BOOL useWhiteList = [self.securityProxy shouldSmartJSWebViewUseSecurityWhitelist:(SmartJSWebView*)[webView superview]];
if(useWhiteList)
{
NSArray<NSString*> *whitelist = nil;
if([self.securityProxy respondsToSelector:@selector(securityWhitelistForWebView:)])
{
whitelist = [self.securityProxy securityWhitelistForWebView:[webView superview]];
whitelist = [self.securityProxy securityWhitelistForWebView:(SmartJSWebView*)[webView superview]];
}
if(![whitelist isKindOfClass:[NSArray<NSString *> class]])
{
Expand All @@ -277,14 +307,20 @@ - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)
NSString *host = request.mainDocumentURL.host;
if([host isKindOfClass:[NSString class]])
{
if(![whitelist containsObject:host])
if(![self isHost:host inWhitelist:whitelist])
{
isSafe = NO;
}
}
}
}
if(!isSafe) return NO;
if(!isSafe)
{
#if DEBUG
NSLog(@"域名%@不在白名单中,无法通过 JavaScript 与 Native App 交互。", request.mainDocumentURL.host);
#endif
return NO;
}
/*
A sample URL structure:
smart-js:MyJSTest:test
Expand Down Expand Up @@ -445,14 +481,20 @@ - (void)userContentController:(WKUserContentController *)userContentController d
NSString *host = message.webView.URL.host;
if([host isKindOfClass:[NSString class]])
{
if(![whitelist containsObject:host])
if(![self isHost:host inWhitelist:whitelist])
{
isSafe = NO;
}
}
}
}
if(!isSafe) return;
if(!isSafe)
{
#if DEBUG
NSLog(@"域名%@不在白名单中,无法通过 JavaScript 与 Native App 交互。", message.webView.URL.host);
#endif
return;
}
NSDictionary *body = message.body;
if([body isKindOfClass:[NSDictionary class]])
{
Expand Down Expand Up @@ -703,7 +745,11 @@ - (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView {
{
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0)
{
[self.realDelegate webViewWebContentProcessDidTerminate:webView];
if (@available(iOS 9.0, *)) {
[self.realDelegate webViewWebContentProcessDidTerminate:webView];
} else {
// Fallback on earlier versions
}
}

}
Expand All @@ -715,7 +761,11 @@ - (void)webViewDidClose:(WKWebView *)webView {
{
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0)
{
[self.realDelegate webViewDidClose:webView];
if (@available(iOS 9.0, *)) {
[self.realDelegate webViewDidClose:webView];
} else {
// Fallback on earlier versions
}
}
}
}
Expand Down

0 comments on commit 2a34428

Please sign in to comment.