本文介绍非spring项目中利用Lombok + Logback + Slf4j记录日志,并附上所有的踩坑记录 本文环境 macos Idea2019.2 配置过程 首先在idea中下载lombok插件 在pom.xml文件中引入Lombok,Logback,Slf4j依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> |
在项目中的resources文件夹中添加logback.xml配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--> <property name="LOG_HOME" value="/logs" /> <!-- 控制台输出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %boldMagenta(%-5level %logger{50}) : %msg%n</pattern>--> <pattern>%d{yyyy-MM-dd HH:mm:ss:SS} %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{50}) - %cyan(%msg%n)</pattern> </encoder> </appender> <!-- 按照每天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_HOME}/provider.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <FileNamePattern>${LOG_HOME}/provider.log.%d{yyyy-MM-dd}.log</FileNamePattern> <!--日志文件保留天数--> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <!-- 日志输出级别 --> <root level="INFO"> <appender-ref ref="STDOUT" /> </root> </configuration> |
编写代码测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import lombok.extern.slf4j.Slf4j; @Slf4j public class ProviderStart { public static void main(String[] args) { log.debug("输出DEBUG级别日志"); log.info("输出INFO级别日志"); log.warn("输出WARN级别日志"); log.error("输出ERROR级别日志"); } } |
输出为 踩过的坑 看上去简简单单几步就完成了,然后并不是,接下来附上踩过的坑以及解决方法 idea中plugins的marketplace直接打不开 在idea中使用lombok需要在plugins中的marketplace中下载插件,然而我下载时marketplace迟迟无法连接上 我们需要在设置中的Appearance & Behavior --> System Settings --> Http Proxy中选择Auto-detect proxy settings勾选Automatic proxy configuration URL选项并填写url为http://127.0.0.1:1080,重启idea 代码运行成功,但是不显示日志信息 也是很邪门的一种情况,代码没错,但是不显示log打印的信息。 解决方案为,在Build,Execution,Deployment–>compiler–>Annotation Processors中勾选Enable annotation processing,重启idea 多个Slf4j冲突 报错信息如下
1 2 |
SLF4J Warning: Class Path Contains Multiple SLF4J Bindings ..... |
说明是jar包冲突了,maven仓库中可能同时包含了log4j,logback,然后slf4j在程序运行时,不知道binding哪一个jar包。 解决方案为:在maven仓库中删除其中一个jar包,只保留一个即可。 from:https://blog.csdn.net/jerseywwwwei/article/details/105871320
View Details
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" debug="false"> <springProperty scop="context" name="spring.application.name" source="spring.application.name" defaultValue=""/> <!--日志存放路径--> <property name="PATH" value="logs"/> <property name="FILE_NAME" value="${spring.application.name}"/> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <withJansi>true</withJansi> <encoder> <charset>UTF-8</charset> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) %magenta([PID:${PID:-}]) %green([%15.15thread]) %cyan(%40.40logger:%-5.5L):%msg%n</pattern> </encoder> </appender> <!--trace--> <appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${PATH}/${FILE_NAME}_trace.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${PATH}/${FILE_NAME}_trace.%d{yyyy-MM-dd}.log</FileNamePattern> <maxHistory>60</maxHistory> <totalSizeCap>1GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %highlight([%-5level]) %green([%15.15thread]) %cyan([%logger:%line])--%mdc{client} %msg%n</pattern> </encoder> </appender> <!--error--> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${PATH}/${FILE_NAME}_error.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${PATH}/${FILE_NAME}_error.%d{yyyy-MM-dd}.log</FileNamePattern> <maxHistory>60</maxHistory> <totalSizeCap>1GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %highlight([%-5level]) %green([%15.15thread]) %cyan([%logger:%line])--%mdc{client} %msg%n</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> </appender> <root level="INFO"> <appender-ref ref="STDOUT" /> <appender-ref ref="TRACE_FILE" /> <appender-ref ref="ERROR_FILE" /> </root> </configuration> |
from:https://my.oschina.net/haopeng/blog/3065616
View Details参考官方网址: https://logging.apache.org/log4j/2.x 一、log4j日志级别配置说明
1 2 3 4 5 6 7 8 9 10 11 12 13 |
log4j提供了4种日志级别和2个日志开关。 DEBUG:输出调试信息;指出细粒度信息事件对调试应用程序是非常有帮助的。 INFO: 输出提示信息;消息在粗粒度级别上突出强调应用程序的运行过程。 WARN: 输出警告信息;表明会出现潜在错误的情形。 ERROR:输出错误信息;指出虽然发生错误事件,但仍然不影响系统的继续运行。 FATAL: 输出致命错误;指出每个严重的错误事件将会导致应用程序的退出。 ALL level:打开所有日志记录开关;是最低等级的,用于打开所有日志记录。 OFF level:关闭所有日志记录开关;是最高等级的,用于关闭所有日志记录。 按照范围从小到大排序:OFF level > FATAL > ERROR > WARN > INFO > DEBUG > ALL level;范围大的会包含范围小的,例如日志设置为INFO级别的话则FATAL、ERROR、WARN、INFO的日志开关都是打开的,而DEBUG的日志开关将是关闭的。 Log4j建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。 |
二、logback-spring.xml配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
<?xml version="1.0" encoding="UTF-8"?> <!-- 说明: 1、日志级别及文件 日志记录采用分级记录,级别与日志文件名相对应,不同级别的日志信息记录到不同的日志文件中。 2、日志级别可以根据开发环境进行配置,为方便统一管理查看日志,日志文件路径统一由LOG_PATH:-.配置在/home/项目名称/logs --> <configuration> <!-- 引入默认设置 --> <include resource="org/springframework/boot/logging/logback/defaults.xml"/> <!-- 编码格式设置 --> <property name="ENCODING" value="UTF-8" /> <!-- 日志文件的存储地址,由application.yml中的logging.path配置,根路径默认同项目路径 --> <property name="LOG_HOME" value="${LOG_PATH:-.}" /> <!-- 常规输出格式:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 --> <property name="NORMAL_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}.%method@%line - %msg%n"/> <!-- 彩色输出格式:magenta:洋红,boldMagenta:粗红,yan:青色,·#══> --> <property name="CONSOLE_LOG_PATTERN" value="%boldMagenta([%d{yyyy-MM-dd HH:mm:ss.SSS}]) %red([%thread]) %boldMagenta(%-5level) %blue(%logger{20}.%method@%line) %magenta(·#═>) %cyan(%msg%n)"/> <!-- ==========================控制台输出设置========================== --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>${ENCODING}</charset> </encoder> </appender> <!-- ==========================按天输出日志设置========================== --> <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_HOME}/system-info.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 按天回滚 daily --> <FileNamePattern>${LOG_HOME}/system-info.%d{yyyy-MM-dd}.log</FileNamePattern> <!-- 日志文件保留天数 --> <MaxHistory>30</MaxHistory> </rollingPolicy> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <!-- 设置拦截的对象为INFO级别日志 --> <onMatch>ACCEPT</onMatch> <!-- 当遇到了INFO级别时,启用该段配置 --> <onMismatch>DENY</onMismatch> <!-- 没有遇到INFO级别日志时,屏蔽该段配置 --> </filter> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${NORMAL_LOG_PATTERN}</pattern> <charset>${ENCODING}</charset> </encoder> <!-- 日志文件最大的大小 --> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <!-- ==========================按天输出ERROR级别日志设置========================== --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_HOME}/system-error.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 按天回滚 daily --> <FileNamePattern>${LOG_HOME}/system-error.%d{yyyy-MM-dd}.log</FileNamePattern> <!-- 日志文件保留天数 --> <MaxHistory>30</MaxHistory> </rollingPolicy> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <!-- 设置拦截的对象为ERROR级别日志 --> <onMatch>ACCEPT</onMatch> <!-- 当遇到了ERROR级别时,启用该段配置 --> <onMismatch>DENY</onMismatch> <!-- 没有遇到ERROR级别日志时,屏蔽该段配置 --> </filter> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${NORMAL_LOG_PATTERN}</pattern> <charset>${ENCODING}</charset> </encoder> <!-- 日志文件最大的大小 --> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <!-- ==========================用户登录日志设置========================== --> <appender name="USER_LOGIN" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_HOME}/user-login.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 按天回滚 daily --> <fileNamePattern>${LOG_HOME}/auth-user.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 日志最大的历史 30天 --> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>${NORMAL_LOG_PATTERN}</pattern> <charset>${ENCODING}</charset> </encoder> </appender> <!-- ===日志输出级别,OFF level > FATAL > ERROR > WARN > INFO > DEBUG > ALL level=== --> <logger name="com.sand" level="INFO"/> <logger name="com.apache.ibatis" level="INFO"/> <logger name="java.sql.Statement" level="INFO"/> <logger name="java.sql.Connection" level="INFO"/> <logger name="java.sql.PreparedStatement" level="INFO"/> <logger name="org.springframework" level="WARN"/> <logger name="com.baomidou.mybatisplus" level="WARN"/> <!-- 用户登录日志 --> <logger name="user-login" level="INFO"> <appender-ref ref="USER_LOGIN"/> </logger> <!-- ======开发环境:打印控制台和输出到文件====== --> <springProfile name="dev"><!-- 由application.yml中的spring.profiles.active配置 --> <root level="INFO"> <appender-ref ref="CONSOLE"/> <appender-ref ref="INFO_FILE"/> <appender-ref ref="ERROR_FILE"/> </root> </springProfile> <!-- ======测试环境:打印控制台和输出到文件====== --> <springProfile name="test"><!-- 由application.yml中的spring.profiles.active配置 --> <root level="INFO"> <appender-ref ref="CONSOLE"/> <appender-ref ref="INFO_FILE"/> <appender-ref ref="ERROR_FILE"/> </root> </springProfile> <!-- ======生产环境:打印控制台和输出到文件====== --> <springProfile name="prod"><!-- 由application.yml中的spring.profiles.active配置 --> <root level="INFO"> <appender-ref ref="CONSOLE"/> <appender-ref ref="INFO_FILE"/> <appender-ref ref="ERROR_FILE"/> </root> </springProfile> </configuration> |
注意:登录日志的记录还需进行以下配置,用lombok的话直接使用注解即可 @Slf4j(topic = "user-login") 配置效果如下: from:https://www.cnblogs.com/54hsh/p/12684241.html
View Details今天下了个Android Studio,准备换个平台,但是创建新的项目遇到点问题,网上也没有找到完整的解决方法,研究了一下发出来供大家参考 问题:找不到R文件 报错Error:Execution failed for task ':app:processDebugResources'. > com.android.ide.common.process.ProcessException: Failed to execute aapt 问题原因:compileSdkVersion高于buildToolsVersion,可以用高版本的build-tool去构建一个低版本的sdk工程,但是反过来就不行了 解决方法:1.更新Android-SDK Build-Tools 2.修改build.gradle中相应版本号 之后我的问题就解决了 可能对于很多人来说根本不是问题,但是既然我遇上了,也就有可能有朋友还会遇到相同问题,希望能提供参考 from:https://www.cnblogs.com/madzxr/p/6322504.html
View Details// 定义 const ApiBridge = { msgQueue: [], callbackCache: [], callbackId: 0, processingMsg: false, isReady: false, isNotifyReady: false }; ApiBridge.callNative = function(clz, method, args, callback) { var msgJson = {}; msgJson.clz = clz; msgJson.method = method; if (args != undefined) msgJson.args = args; return prompt(JSON.stringify(msgJson)); }; // 调用 setTimeout(() => { this.$ApiBridge.callNative("KCApiTSLModule", "notifyF", { action: 'closePage', param: {} }); }); 以上代码经测试不能很好的兼容ios,下面的代码可以:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 |
; (function(window) { if (window.WebViewJSBridge) return; window.WebViewJSBridge = {}; console.log("--- kerkee init begin---"); var browser = { versions: function() { var u = navigator.userAgent, app = navigator.appVersion; return { trident: u.indexOf('Trident') > -1, //IE presto: u.indexOf('Presto') > -1, //opera webKit: u.indexOf('AppleWebKit') > -1, //apple&google kernel gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //firfox mobile: !!u.match(/AppleWebKit.*Mobile.*/), //is Mobile ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //is ios android: u.indexOf('Android') > -1 || u.indexOf('Adr') > -1, //android iPhone: u.indexOf('iPhone') > -1, //iPhone or QQHD iPad: u.indexOf('iPad') > -1, //iPad iPod: u.indexOf('iPod') > -1, //iPod webApp: u.indexOf('Safari') == -1, //is webapp,no header and footer weixin: u.indexOf('MicroMessenger') > -1, //is wechat qq: u.match(/\sQQ/i) == " qq", //is qq, wxwork: u.indexOf('wxwork') > -1 //is wechat }; }(), language: (navigator.browserLanguage || navigator.language).toLowerCase() } var global = this || window; var ApiBridge = { msgQueue: [], callbackCache: [], callbackId: 0, processingMsg: false, isReady: false, isNotifyReady: false }; ApiBridge.create = function() { ApiBridge.bridgeIframe = document.createElement("iframe"); ApiBridge.bridgeIframe.style.display = 'none'; document.documentElement.appendChild(ApiBridge.bridgeIframe); }; ApiBridge.prepareProcessingMessages = function() { ApiBridge.processingMsg = true; }; ApiBridge.fetchMessages = function() { if (ApiBridge.msgQueue.length > 0) { var messages = JSON.stringify(ApiBridge.msgQueue); ApiBridge.msgQueue.length = 0; return messages; } ApiBridge.processingMsg = false; return ''; }; ApiBridge.callNative = function(clz, method, args, callback) { var msgJson = {}; msgJson.clz = clz; msgJson.method = method; if (args != undefined) msgJson.args = args; if (callback) { var callbackId = ApiBridge.getCallbackId(); ApiBridge.callbackCache[callbackId] = callback; if (msgJson.args) { msgJson.args.callbackId = callbackId.toString(); } else { msgJson.args = { "callbackId": callbackId.toString() }; } } if (browser.versions.wxwork || browser.versions.weixin) { return; } if (browser.versions.ios) { if (ApiBridge.bridgeIframe == undefined) { ApiBridge.create(); } // var msgJson = {"clz": clz, "method": method, "args": args}; ApiBridge.msgQueue.push(msgJson); if (!ApiBridge.processingMsg) ApiBridge.bridgeIframe.src = "kcnative://go"; } else if (browser.versions.android) { // android return prompt(JSON.stringify(msgJson)); } }; ApiBridge.showVersion = function() { return browser.versions; } ApiBridge.log = function(msg) { ApiBridge.callNative("ApiBridge", "JSLog", { "msg": msg }); } ApiBridge.getCallbackId = function() { return ApiBridge.callbackId++; } ApiBridge.onCallback = function(callbackId, obj) { if (ApiBridge.callbackCache[callbackId]) { ApiBridge.callbackCache[callbackId](obj); } } ApiBridge.onBridgeInitComplete = function(callback) { ApiBridge.callNative("ApiBridge", "onBridgeInitComplete", {}, callback); } ApiBridge.onNativeInitComplete = function(callback) { ApiBridge.isReady = true; if (callback) { callback(); ApiBridge.isNotifyReady = true; } } ApiBridge.compile = function(aIdentity, aJS) { var value; var error; try { value = eval(aJS); } catch (e) { var err = {}; err.name = e.name; err.message = e.message; err.number = e.number & 0xFFFF; error = err; } ApiBridge.callNative("ApiBridge", "compile", { "identity": aIdentity, "returnValue": value, "error": error }); } var _Configs = { isOpenJSLog: false, isOpenNativeXHR: false }; var kerkee = {}; /***************************************** * 事件监听 *****************************************/ kerkee.Event = {}; // kerkee.Event.LOADED = "loaded"; // kerkee.Event.LOAD_ERROR = "load_error"; // kerkee.Event.LOAD_PROGRESS = "load_progress"; kerkee.addEventListener = function(event, callback) { ApiBridge.callNative("event", "addEventListener", { "event": event }, callback); } /* Scroll to the bottom of the page when the callback function and the threshold setting */ //callback:Return to the page in webview upper vertex Y value kerkee.registerHitPageBottomListener = function(callback, threshold) { ApiBridge.callNative("ApiBridge", "setHitPageBottomThreshold", { "threshold": threshold }); kerkee.onHitPageBottom = callback; }; kerkee.registerScrollListener = function(callback) { ApiBridge.callNative("ApiBridge", "setPageScroll", { "isScrollOn": true }); kerkee.onPageScroll = callback; }; kerkee.notifyF = function(aString) { ApiBridge.callNative("KCApiTSLModule", "notifyF", aString); }; global.KCApiTSLModule = kerkee; /***************************************** * 接口 *****************************************/ kerkee.testJSBrige = function(aString) { ApiBridge.callNative("jsBridgeClient", "testJSBrige", { "info": aString }); }; kerkee.openJSLog = function() { _Configs.isOpenJSLog = true; } kerkee.closeJSLog = function() { _Configs.isOpenJSLog = false; } kerkee.commonApi = function(aString, callback) { ApiBridge.callNative("jsBridgeClient", "commonApi", { "info": aString }, callback); } kerkee.onDeviceReady = function(handler) { ApiBridge.onDeviceReady = handler; if (ApiBridge.isReady && !ApiBridge.isNotifyReady && handler) { handler(); ApiBridge.isNotifyReady = true; } }; kerkee.invoke = function(clz, method, args, callback) { if (callback) { ApiBridge.callNative(clz, method, args, callback); } else { ApiBridge.callNative(clz, method, args); } }; kerkee.onSetImage = function(srcSuffix, desUri) { var obj = document.querySelectorAll('img[src$="' + srcSuffix + '"]'); for (var i = 0; i < obj.length; ++i) { obj[i].src = desUri; } }; /* * var windowOpen = function (url) { ApiBridge.callNative("JavascriptAPIInterceptor", "windowOpen", { "url" : url }); }; */ global.ApiBridge = ApiBridge; global.kerkee = kerkee; global.jsBridgeClient = kerkee; kerkee.register = function(_window) { _window.ApiBridge = window.ApiBridge; _window.kerkee = window.kerkee; _window.console.log = window.console.log; _window.open = window.open; }; ApiBridge.onBridgeInitComplete(function(aConfigs) { if (aConfigs) { if (aConfigs.hasOwnProperty('isOpenJSLog')) { _Configs.isOpenJSLog = aConfigs.isOpenJSLog; } if (aConfigs.hasOwnProperty('isOpenNativeXHR')) { _Configs.isOpenNativeXHR = aConfigs.isOpenNativeXHR; } } if (_Configs.isOpenJSLog) { //global.console.log = ApiBridge.log; } ApiBridge.onNativeInitComplete(ApiBridge.onDeviceReady); }); })(window); |
View Details