wendux / dsbridge-ios Goto Github PK
View Code? Open in Web Editor NEW:earth_asia: A modern cross-platform JavaScript bridge, through which you can invoke each other's functions synchronously or asynchronously between JavaScript and native.
:earth_asia: A modern cross-platform JavaScript bridge, through which you can invoke each other's functions synchronously or asynchronously between JavaScript and native.
DWKWebView.m里面的305行,偶发性崩溃,目前原因不明~
SuppressPerformSelectorLeakWarning(
ret=[JavascriptInterfaceObject performSelector:sel withObject:arg ];
);
//get this class all method
+(NSArray *)allMethodFromClass:(Class)class中没有free(methods)操作,会内存泄露的
代码如下
- (NSString *)testSyn123123:(NSString *) msg
{
return [msg stringByAppendingString:@"[ syn call]"];
}
- (NSString *)testSyn:(NSString *) msg
{
return [msg stringByAppendingString:@"[ syn call]"];
}
解决方法如下 修改一下方法判断依据 代码没怎么读 也没进行啥测试 如果有遇到此问题的人可以改改 不过具体还需要作者本人测试 如果有问题随时找我 = =
+ (NSString *)methodByNameArg:(NSInteger)argNum selName:(NSString *)selName class:(Class)class {
NSString *result = nil;
if(class){
NSArray *arr = [JSBUtil allMethodFromClass:class];
for (int i = 0; i < arr.count; i++) {
NSString *method = arr[i];
NSArray *tmpArr = [method componentsSeparatedByString:@":"];
NSRange range = [method rangeOfString:@":"];
if (range.length > 0) {
NSString *methodName = [method substringWithRange:NSMakeRange(0, range.location)];
if ([methodName isEqualToString:selName] && tmpArr.count == (argNum + 1)) {
result = method;
return result;
}
}
}
}
return result;
}
为啥用DWebView加载h5 要比原生的慢呢?会有1s显示空白
我在swift项目里使用dsBridge,用cocoapods集成。然后添加DWebview
var webView = DWebview()
override func viewDidLoad() {
super.viewDidLoad()
self.webView.frame = self.view.bounds
self.view.addSubview(self.webView)
let jsApi = JsApiHandler()
self.webView.javascriptInterfaceObject = jsApi
}
func loadHTML(_ html: String, baseURL: URL?) {
self.webView.loadHTMLString(html, baseURL: baseURL ?? URL(string: "*")!)
}
业务需要后端返回的是一个HTML字符串,然后用WebView显示这个页面。
因为该库用OC写的,而原生UIWebView的loadHTMLString方法的baseURL参数是可选参数,DWebView暴露的接口参数没有支持nullable,所以这里就必须填写一个非nil的baseURL,这样要么crash,要么黑屏。
希望接口能支持Swift友好的nullable协议。
补充:单独使用DUIWebView或者DWKWebView使用loadHTMLString方法baseURL为nil运行正常。
2.0了改了什么,能不能说一下呢?
还有目前你这个设计,不支持以下下场景
原生多次返回结果
因为每次返回结果后,把桥接对象就删除了。
-(NSString )call:(NSString) method :(NSString*) argStr
我是在拿到这个值得时候,对argStr做了默认自动补全,若有更好的方法,请说一下,谢谢
赶紧支持Cocoapods呀
某些版本会出错,不知道是为什么?
iOS端
class AntzbJsBridgeabc: NSObject {
@objc func testSyn(args:Dictionary<String,Any>) -> String {
let msg = args["msg"] as? String ?? ""
return String(format:"%@[sync call:%@]", msg, "test")
}
@objc func testAsyn(arg:String, handler: (String, Bool)->Void) {
handler(String(format:"%@[async call:%@]", arg, "test"), true)
}
}
webview.addJavascriptObject(AntzbJsBridgeabc(), namespace: "abc")
Web端
this.msg = dsbridge.call("abc.testSyn", {a:"aa",b:12,msg:"asasas"}) //没问题
dsBridge.call("abc.testAsyn",'sassas', function (name) {//有问题,报Method is not invoked的错
this.msg = name
alert(name)
})
DUIWebView里的TS_JavaScriptContext与项目内TS_JavaScriptContext分类冲突?
集成DSBridge之后,项目里的UIWebView使用的UIWebView+TS_JavaScriptContext的delegate不执行了,全部执行去到了DUIWebView.m的方法里...
有没有demo,能不能详细的讲讲
DKWebView 中有使用namespace 参数 能不能改一下名字,因为在c ++ 中是关键字,混编有问题。
JSBUtil 中有个参数是 class ,这样也有问题
cocoapods集成
DUIwebview里WebEventDelegate,JavascriptInterfaceObject;这两个变量
提示Cannot sysnthesize weak property because the current deployment target does not support weak references
ionic v1 不兼容 web模式下 总是提示no invoke 。。。。
dsBridge并未违反任何AppStore的政策,很多使用DSBridge的APP都已成功过审,大家可以放心使用。
这是我的swift的定义
func testSyn(arg:String) -> String {
return String(format:"%@[sync call:%@]", "msg", "test")
}
js调用
alert(this.ds_bridge.call("testSyn","testSyn"))
然后页面alert报错:“Method{"data":"testSyn"} is not invoked, since there is not a implementation for it”
xcode报错:“json解析失败:Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}”
我是vue搭配dsbridge,swift4,ios11
最后问一下,3.0是否不支持UIWebview,目前依赖于Vassonic提升加载速度,可是后者不支持wkwebview,3.0是否有再次支持UIWebview的可能?
-> translating『 0x41c2cb 』=> -> translating『 0xa8a59 』=> +[JSBUtil call::JavascriptInterfaceObject:jscontext:] -> translating『 0x2a141 』=> -[DWKwebview webView:runJavaScriptTextInputPanelWithPrompt:defaultText:initiatedByFrame:completionHandler:] -> translating『 0x2aae5 』=> main
H5嵌入原生app里边,但是分享出来就会出现js桥的弹窗
[!] Unable to find a specification for dsBridge
,cocoapods cannot find it
之前在WVJSB中也遇到过类似问题,不过可以通过调整顺序来让其调用WKWebView的代理方法,不过在DSBridge中失效。。
请问有什么好的解决办法吗?
#UIWebView
-[__NSCFNumber length]: unrecognized selector sent to instance 0xb0000000000000b3
invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific - break on _CFRunLoopError_RunCalledWithInvalidMode to debug. This message will only appear once per execution.
bug: ios8/9 系统,调用没反应,不支持。10以上可以
请问DWebview能设置进度条吗?怎么设置
TIC Read Status [1:0x1c016f3c0]: 1:57
NSURLConnection finished with error - code -1001
APIBase request didFailWithError
NSURLConnection finished with error - code -1001
APIBase request didFailWithError
NSURLConnection finished with error - code -1001
APIBase request didFailWithError
Task <40F5571F-D735-41A0-BDFE-5EEEA51B1847>.<0> HTTP load failed (error code: -999 [1:89])
例如在同一个jsBridge中实现了 request和requestWithData,如果前端调用了request,但是requestWithData的定义比requst早,则实际调用的方法是requestWithData,因为源码中方法匹配的逻辑是根据方法前缀以及参数个数来匹配的,有漏洞。建议根据方法的signature来匹配。
方法匹配逻辑在JSBUtil.m文件 方法methodByNameArg:selName:class: 中。
一直用的DUIwebView.一开始没发现2个问题.(1)在不退出页面的时候操作的时候内存一直涨 能涨到1个G不释放,目前测试加载任何网页 都有这种问题. (2)我检测内存 发现退出页面内存没有改变 在+(NSArray *)allMethodFromClass:(Class)class 中的Method *methods = class_copyMethodList(class, &count) 没有释放 我free(methods)之后 稍微有改观 但是效果不明显
DSBridge v3.0 is a milestone, Compared with v2.0.X, we have made a lot of changes. Note that V3.0 is incompatible with V2.0, but v2.0 will continue to maintain. If you are a new user, use >=v3.0
Deprecated:setJavascriptInterface , use addJavascriptObject
instead.
Deprecated:setJavascriptContextInitedListener ,callHandler
can be called at any time.
Deprecated:DUIWebView , UIWebView
will not be supported ever.
New: addJavascriptObject:(id) object namespace:(NSString *) namespace
New: removeJavascriptObject:NSString * namespace
New: disableJavascriptDialogBlock:(bool) disable
New: hasJavascriptMethod:(NSString *) handlerName methodExistCallback:(void(^ )(bool exist))callback
New: setJavascriptCloseWindowListener:(void(^)(void))callback
New: setDebugMode:(bool) debug
New: customJavascriptDialogLabelTitles:(NSDictionary*) dic
New feature: Support namespace
New feature: Can add multiple API object
Changed: Object-c API signature changed
Changed: callHandler
can be called at any time.
hasNativeMethod(handlerName,[type])
disableJavascriptDialogBlock(disable)
registerAsyn(methodName|namespace,function|asyApiObject)
register(methodName|namespace,function|synApiObject)
It is well known that WKWebView loads web pages faster and more efficiently than UIWebView, and also doesn't have as much memory overhead for you.
Under the current timeline, most iOS apps only support iOS 9.0+.
The reason for the iOS platform cross-domain access vulnerability is due to UIWebView turning on the WebKitAllowUniversalAccessFromFileURLs and WebKitAllowFileAccessFromFileURLs options.
WKWebView default allowFileAccessFromFileURLs and allowUniversalAccessFromFileURLs option is false.
是这样吗
如果支持,swift中func如何写呢?
pod "dsBridge" 只有2.0.2
可以不通过代码而是通过storyboard初始化吗?
在ios中. 访问服务端网页 getJsBridge 获取为undefined, 但是将网页放在本地就可以获取到.
WebViewJsApi *jsApi = [[WebViewJsApi alloc] init];
myWebView.JavascriptInterfaceObject = jsApi;
已经这样设置了,仍然提示
Js bridge method called, but there is not a JavascriptInterfaceObject, please set JavascriptInterfaceObject first!
步骤:
在JsApiTest定义JS异步调用的方法中加入阻塞线程代码,比如
- (void) testAsyn:(NSDictionary *) args :(void (^)(NSString * _Nullable result,BOOL complete))completionHandler
{
sleep(5);
completionHandler([(NSString *)[args valueForKey:@"msg"] stringByAppendingString:@"[ asyn call]"],YES);
}
test.html js端加上log日志
function callAsyn() {
console.log("callAsyn beigin")
bridge.call("testAsyn", {msg: "testAsyn"}, function (v) {
alert(v)
})
console.log("callAsyn end")
}
在js端调用 程序时序是这样的
console.log("callAsyn beigin")
等待五秒
alert(v)
console.log("callAsyn end")
可以看出这并不是异步调用
JavascriptInterfaceObject调用的方法返回值为void,且服务器传参为Json字符串时会闪退.
修改test.html
代码为如下
function callSyn() {
alert(dsBridge.call("testSyn", "{\"url\":\"https://gslb.miaopai.com/stream/U8wK~SkowQqfbmyHNhFyDH0vy-KhqWvmdQMHLQ__.mp4?ssig=f3c7cac4c571591cc1b4c1da917a6ea2&time_stamp=1526013092137&cookie_id=c90730d82972cf7f169f2d7d246fc6a9&vend=1&os=2&partner=1&platform=2&cookie_id=c90730d82972cf7f169f2d7d246fc6a9&refer=miaopai&scid=U8wK%7ESkowQqfbmyHNhFyDH0vy-KhqWvmdQMHLQ__\"}"))
}
修改JsApiTest.m
代码如下
- (void) testSyn:(NSString *) msg
{
// return [msg stringByAppendingString:@"[ syn call]"];
NSLog(@"%@",@"call");
}
你好,我想麻烦问一下.我这边相同的代码在模拟器里面能正常跑,但是在真机里就会出现闪退的情况.
如定义
dsBridge.call('initTitleBar'); 连续调用几次就崩溃了
There are two ways to do this:
With JavaScript
NSString * script=@"document.cookie=\"uname=xx; uid=34\"";
[dwebview evaluateJavaScript:script completionHandler:nil];
With fly.js
Actually, fly.js can't support synchronizing Cookies between native and DWKWebView, but it supports forwarding the http request to Native through any Javascript bridge, and fly.js has already provide the dsBridge adapter. Suppose that all HTTP requests will be sent out on native side, there's no longer need to sync Cookies to DWKWebView. all you need to do is implementing a API named onAjaxRequest
in default API namespace :
/**
* Note: This method is for Fly.js
* In browser, Ajax requests are sent by browser, but Fly can
* redirect requests to native, more about Fly see https://github.com/wendux/fly
* @param requestInfo passed by fly.js, more detail reference https://wendux.github.io/dist/#/doc/flyio-en/native
*/
-(void)onAjaxRequest:(NSDictionary *) requestInfo :(void (^)(NSString * _Nullable result,BOOL complete))completionHandle{
}
More details please refer to:
我的项目是集成UIWebView的,并且自己做了很多处理,现在不太可能修改集成DWebView,请问如果要使用DSJsBright必须使用DWebView吗?是否提供WebView的Category来实现DWebView功能,降低使用门槛?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.