Skip to content

Commit 83d9aaf

Browse files
authored
feat(js): js code (#1)
1 parent ec0cc4c commit 83d9aaf

14 files changed

Lines changed: 127 additions & 55 deletions

HWJavaScriptBridge.podspec

Lines changed: 0 additions & 42 deletions
This file was deleted.

HWJavaScriptBridge/Classes/HWJavaScriptBridge/HWBaseJavaScriptBridge.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// HNBaseBridge.h
33
// JSBridge
44
//
5-
// Created by ihenryhuang on 2022/4/24.
5+
// Created by hong on 2022/4/24.
66
// Copyright © 2022 Tencent. All rights reserved.
77
//
88

HWJavaScriptBridge/Classes/HWJavaScriptBridge/HWBaseJavaScriptBridge.m

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22
// HNBaseBridge.m
33
// JSBridge
44
//
5-
// Created by ihenryhuang on 2022/4/24.
5+
// Created by hong on 2022/4/24.
66
// Copyright © 2022 Tencent. All rights reserved.
77
//
88

99
#import "HWBaseJavaScriptBridge.h"
1010
#import "NSString+HWJavaScriptProcess.h"
11+
#import "JSBridgeJSCode.h"
1112

1213
@implementation HWBaseJavaScriptBridge{
1314
long _uniqueId; // 自增唯一的客户端调用JS回调的id
@@ -107,9 +108,7 @@ - (void)log:(NSString *)action json:(id)json {
107108
#pragma mark - private
108109
/// JavaScriptBridge的代码
109110
- (NSString*)javaScriptBridge {
110-
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"honejsbridge" ofType:@"js"];
111-
NSString *script = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
112-
return script;
111+
return honeJSBridgeJS();
113112
}
114113

115114
- (NSString *)serializeMessage:(id)message pretty:(BOOL)pretty{

HWJavaScriptBridge/Classes/HWJavaScriptBridge/HWJSContextJavaScriptBridge.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// HNJavaScriptBridgeBase.h
33
// JSBridge
44
//
5-
// Created ihenryhuang on 2022/4/20.
5+
// Created hong on 2022/4/20.
66
// Copyright © 2022 Tencent. All rights reserved.
77
//
88

HWJavaScriptBridge/Classes/HWJavaScriptBridge/HWJSContextJavaScriptBridge.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// HNJavaScriptBridgeBase.m
33
// JSBridge
44
//
5-
// Created ihenryhuang on 2022/4/20.
5+
// Created hong on 2022/4/20.
66
// Copyright © 2022 Tencent. All rights reserved.
77
//
88

HWJavaScriptBridge/Classes/HWJavaScriptBridge/HWWebViewJavaScriptBridge.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// HNWebViewBridge.h
33
// JSBridge
44
//
5-
// Created by ihenryhuang on 2022/4/24.
5+
// Created by hong on 2022/4/24.
66
// Copyright © 2022 Tencent. All rights reserved.
77
//
88

HWJavaScriptBridge/Classes/HWJavaScriptBridge/HWWebViewJavaScriptBridge.m

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22
// HNWebViewBridge.m
33
// JSBridge
44
//
5-
// Created by ihenryhuang on 2022/4/24.
5+
// Created by hong on 2022/4/24.
66
// Copyright © 2022 Tencent. All rights reserved.
77
//
88

99
#import "HWWebViewJavaScriptBridge.h"
10+
#import "JSBridgeJSCode.h"
1011

1112
/// 代理:解决addScriptMessageHandler导致的循环饮用问题
1213
@interface WeakProxy : NSProxy
@@ -67,7 +68,7 @@ - (void)injectJSBridge:(WKWebView *)webView{
6768

6869
// 注入 JSBridge
6970
NSString *jspath = [[NSBundle mainBundle]pathForResource:@"honejsbridge" ofType:@"js"];
70-
NSString *str = [NSString stringWithContentsOfFile:jspath encoding:NSUTF8StringEncoding error:nil];
71+
NSString *str = honeJSBridgeJS();
7172
//注入时机是在webview加载状态WKUserScriptInjectionTimeAtDocumentStart、WKUserScriptInjectionTimeAtDocumentEnd
7273
WKUserScript *userScript = [[WKUserScript alloc] initWithSource:str injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
7374
[_webView.configuration.userContentController addUserScript:userScript];
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//
2+
// JSBridgeJSCode.h
3+
// HWJavaScriptBridge
4+
//
5+
// Created by hong on 8/8/25.
6+
//
7+
8+
#import <Foundation/Foundation.h>
9+
10+
/// 获取 JSBridge 的 JavaScript 代码
11+
NSString * honeJSBridgeJS(void);
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
//
2+
// JSBridgeJSCode.m
3+
// HWJavaScriptBridge
4+
//
5+
// Created by hong on 2022/6/5.
6+
// Copyright © 2022 Tencent. All rights reserved.
7+
//
8+
9+
#import "JSBridgeJSCode.h"
10+
11+
/// 获取JSBridge的代码
12+
/// JS代码会被clang扫描出警告,进行忽略
13+
#pragma clang diagnostic push
14+
#pragma clang diagnostic ignored "-Winvalid-pp-token"
15+
16+
// NOCC:CCN(设计如此:此处是JS代码,不参与Objective - C的代码检查)
17+
NSString * honeJSBridgeJS() {
18+
#define __hone_js_func__(x) #x
19+
20+
// BEGIN preprocessorJSCode
21+
static NSString * preprocessorJSCode = @__hone_js_func__(
22+
(function() {
23+
'use strict';
24+
25+
// 回调管理
26+
var callbacks = {};
27+
var handlers = {};
28+
var callbackId = 0;
29+
30+
function generateId() {
31+
return 'cb_' + (++callbackId) + '_' + Date.now();
32+
}
33+
34+
// 核心功能1: 发送消息到Native,接收回调数据
35+
function invoke(method, params, callback) {
36+
var id = generateId();
37+
if (callback) {
38+
callbacks[id] = callback;
39+
}
40+
41+
var message = {
42+
method: method,
43+
params: params,
44+
callbackId: id
45+
};
46+
47+
// 调用Native方法
48+
if (window.HoneJSCoreNativeBridge && window.HoneJSCoreNativeBridge.callHandler) {
49+
window.HoneJSCoreNativeBridge.callHandler(JSON.stringify(message));
50+
}
51+
}
52+
53+
// 核心功能2: 监听Native消息,返回数据
54+
function on(method, handler) {
55+
handlers[method] = handler;
56+
}
57+
58+
// 处理Native发来的消息
59+
function handleMessage(messageStr) {
60+
try {
61+
var message = JSON.parse(messageStr);
62+
63+
// 处理回调消息 (JS调用Native的回调)
64+
if (message.callbackId && callbacks[message.callbackId]) {
65+
var callback = callbacks[message.callbackId];
66+
delete callbacks[message.callbackId];
67+
callback(message.data);
68+
return;
69+
}
70+
71+
// 处理Native主动调用JS
72+
if (message.method && handlers[message.method]) {
73+
var handler = handlers[message.method];
74+
var result = handler(message.params);
75+
76+
// 如果Native需要回调,发送结果
77+
if (message.responseId) {
78+
var responseMessage = {
79+
responseId: message.responseId,
80+
data: result
81+
};
82+
if (window.HoneJSCoreNativeBridge && window.HoneJSCoreNativeBridge.callHandler) {
83+
window.HoneJSCoreNativeBridge.callHandler(JSON.stringify(responseMessage));
84+
}
85+
}
86+
}
87+
} catch (e) {
88+
console.error('JSBridge message parse error:', e);
89+
}
90+
}
91+
92+
// 导出接口
93+
return {
94+
invoke: invoke,
95+
on: on,
96+
handleMessage: handleMessage
97+
};
98+
})()
99+
); // END preprocessorJSCode
100+
101+
#undef __hone_js_func__
102+
return preprocessorJSCode;
103+
};
104+
#pragma clang diagnostic pop

HWJavaScriptBridge/Classes/HWJavaScriptBridge/NSString+HWJavaScriptProcess.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// NSString+JavaScriptProcess.h
33
// HNPreRenderiOS
44
//
5-
// Createdby ihenryhuangon 2022/4/27.
5+
// Createdby hongon 2022/4/27.
66
// Copyright © 2022 Tencent. All rights reserved.
77
//
88

0 commit comments

Comments
 (0)