Coder Social home page Coder Social logo

wendux / dsbridge-ios Goto Github PK

View Code? Open in Web Editor NEW
1.9K 45.0 303.0 2.69 MB

:earth_asia: A modern cross-platform JavaScript bridge, through which you can invoke each other's functions synchronously or asynchronously between JavaScript and native.

Objective-C 74.82% HTML 10.21% Ruby 13.40% Swift 1.25% C 0.22% Shell 0.09%
javascript-bridge jsbridge webviewjavascriptbridge

dsbridge-ios's Introduction

dsbridge-ios's People

Contributors

dodohua avatar l1dan avatar wendux avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dsbridge-ios's Issues

真机会闪退?

你好,我想麻烦问一下.我这边相同的代码在模拟器里面能正常跑,但是在真机里就会出现闪退的情况.

方法名的匹配逻辑有问题。

例如在同一个jsBridge中实现了 request和requestWithData,如果前端调用了request,但是requestWithData的定义比requst早,则实际调用的方法是requestWithData,因为源码中方法匹配的逻辑是根据方法前缀以及参数个数来匹配的,有漏洞。建议根据方法的signature来匹配。
方法匹配逻辑在JSBUtil.m文件 方法methodByNameArg:selName:class: 中。

当服务器返回为JSON字符串,且回掉方法为Void的时候,程序会闪退

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");
}

v3.0 change list

DSBridge v3.0 change list

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

In Java

  1. DeprecatedsetJavascriptInterface , use addJavascriptObject instead.

  2. DeprecatedsetJavascriptContextInitedListener ,callHandler can be called at any time.

  3. DeprecatedDUIWebView , UIWebView will not be supported ever.

  4. New: addJavascriptObject:(id) object namespace:(NSString *) namespace

  5. New: removeJavascriptObject:NSString * namespace

  6. New: disableJavascriptDialogBlock:(bool) disable

  7. New: hasJavascriptMethod:(NSString *) handlerName methodExistCallback:(void(^ )(bool exist))callback

  8. New: setJavascriptCloseWindowListener:(void(^)(void))callback

  9. New: setDebugMode:(bool) debug

  10. New: customJavascriptDialogLabelTitles:(NSDictionary*) dic

  11. New feature: Support namespace

  12. New feature: Can add multiple API object

  13. Changed: Object-c API signature changed

  14. Changed: callHandler can be called at any time.

In Javascript

  1. New: hasNativeMethod(handlerName,[type])
  2. New: disableJavascriptDialogBlock(disable)
  3. New: registerAsyn(methodName|namespace,function|asyApiObject)
  4. Changed: register(methodName|namespace,function|synApiObject)
  5. New feature: Support namespace

Why Only Support WKWebView?

Advantages of WKWebView

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+.

UIWebView Cross-Domain Access Vulnerability

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.

demo中并不能实现JS端异步调用原生方法

步骤:
在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")

可以看出这并不是异步调用

Swift中同步的没问题,异步的一直报Method is not invoked ,已经检查过版本,web的是^3.1.3,iOS的是3.0.2

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)
})

编译不通过

cocoapods集成

DUIwebview里WebEventDelegate,JavascriptInterfaceObject;这两个变量
提示Cannot sysnthesize weak property because the current deployment target does not support weak references

参数问题

DKWebView 中有使用namespace 参数 能不能改一下名字,因为在c ++ 中是关键字,混编有问题。
JSBUtil 中有个参数是 class ,这样也有问题

使用DSBridge必须集成DWebView吗

我的项目是集成UIWebView的,并且自己做了很多处理,现在不太可能修改集成DWebView,请问如果要使用DSJsBright必须使用DWebView吗?是否提供WebView的Category来实现DWebView功能,降低使用门槛?

iOS9出现大量奔溃

-> translating『 0x41c2cb 』=> -> translating『 0xa8a59 』=> +[JSBUtil call::JavascriptInterfaceObject:jscontext:] -> translating『 0x2a141 』=> -[DWKwebview webView:runJavaScriptTextInputPanelWithPrompt:defaultText:initiatedByFrame:completionHandler:] -> translating『 0x2aae5 』=> main

iOS 11.1.2 使用DWKWebView加载网页时,TIC Read Status [1:0x1c016f3c0]: 1:57

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])

请问swift的话端方法如何定义?

这是我的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的可能?

getJsBridge= undefined

在ios中. 访问服务端网页 getJsBridge 获取为undefined, 但是将网页放在本地就可以获取到.

WKWebView下JS调用原生方法, 方法的定位不准

发现dsbridge里面有个小问题 就是如果一个方法名和另一个方法名是包含关系并且长的方法名在前边会出现方法执行错误问题

代码如下

- (NSString *)testSyn123123:(NSString *) msg
{
    return [msg stringByAppendingString:@"[ syn call]"];
}

- (NSString *)testSyn:(NSString *) msg
{
    return [msg stringByAppendingString:@"[ syn call]"];
}

这时在js中调用testSyn方法就会跳到testSyn123123方法上

解决方法如下 修改一下方法判断依据 代码没怎么读 也没进行啥测试 如果有遇到此问题的人可以改改 不过具体还需要作者本人测试 如果有问题随时找我 = =

+ (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;
}

How to synchronize cookie between native and DWKWebView ?

There are two ways to do this:

  1. With JavaScript

    NSString * script=@"document.cookie=\"uname=xx; uid=34\"";
    [dwebview evaluateJavaScript:script completionHandler:nil];
  2. 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:

    1. https://wendux.github.io/dist/#/doc/flyio-en/redirect
    2. https://wendux.github.io/dist/#/doc/flyio-en/native

Load HTML string crash in Swift

我在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运行正常。

关于DUIwebView的时候内存暴涨不释放

一直用的DUIwebView.一开始没发现2个问题.(1)在不退出页面的时候操作的时候内存一直涨 能涨到1个G不释放,目前测试加载任何网页 都有这种问题. (2)我检测内存 发现退出页面内存没有改变 在+(NSArray *)allMethodFromClass:(Class)class 中的Method *methods = class_copyMethodList(class, &count) 没有释放 我free(methods)之后 稍微有改观 但是效果不明显

2.0改了什么呢?

2.0了改了什么,能不能说一下呢?
还有目前你这个设计,不支持以下下场景
原生多次返回结果
因为每次返回结果后,把桥接对象就删除了。

debug模式崩溃

-[__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.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.