Haisheng Wu

Haisheng Wu's Blog

Lombok

介绍 Lombok 是提升 Java 编码效率常用的工具,借助它开发人员可以使用注解来自动生成一些模版代码。比如 getter、setter、equals、toString 等方法。 安装 在 maven 中添加依赖 1 2 3 4 5 6 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> <scope>provided</scope> </dependency> 在编辑器中添加插件 如:Intellij Idea,在 setting 的 plugin 里搜索lombok plugin,安装插件 使用 常用的几个注解 @Data :注在类上,自动生成类的 get、set、equals、hashCode、canEqual、toString 方法 @AllArgsConstructor :注在类上,自动生成类的全参构造方法 @NoArgsConstructor :注在类上,自动生成类的无参构造 @Setter :注在属性上,自动生成 set 方法 @Getter :注在属性上,自动生成 get 方法 @EqualsAndHashCode :注在类上,自动生成对应的 equals 和 hashCode 方法 @Log4j/@Slf4j :注在类上,自动生成对应的 Logger 对象,变量名为 log @Cleanup(“close”):注在本地变量上,自动释放资源(如:关闭 InputStream) @Synchronized:注在方法上,自动生成一个私有锁变量 @SneakyThrows:自动生成异常处理语句 注意继承关系中使用 Lombok @EqualsAndHashCode 与 @ToString 注解默认情况下忽略父类的成员变量。譬如打印时 toString 返回的结果中缺少父类的成员变量,解决办法是在注解中设置 callSuper 属性为 true, @ToString(callSuper = true) 、@EqualsAndHashCode(callsuper = true)。

WebViewJavascriptBridge 源码剖析

WebViewJavascriptBridge 是一个可以让 OC 与 JS 进行交互通信的第三方开源库。相比其他热门的第三方库,WebViewJavascriptBridge 代码量比较少,并且设计优雅巧妙,可以说是 “小而美”。 WebViewJavascriptBridge 库在 OC 端和 JS 端都有对等的逻辑实现,事先注册 handler,内部维护一个消息队列。透明的 iframe HTML 元素和 webview 的 stringByEvaluatingJavaScriptFromString 是通信的关键。OC 端发消息给 JS 端比较直观,调起 stringByEvaluatingJavaScriptFromString 执行脚本传入消息即可。JS 端发消息给 OC 端,需要事先把消息存到队列中,然后借助 iframe 发起一个伪请求,伪请求会被 webview 的代理方法拦截下来,OC 端因此得知 JS 端消息队列中有消息,最后调起 stringByEvaluatingJavaScriptFromString 方法解析 JS 方法拿到队列中的消息并处理。交互流程见下图: 整个库只有以下几个文件: 1 2 3 4 5 6 7 8 WebViewJavascriptBridge.h WebViewJavascriptBridge.m WKWebViewJavascriptBridge.h WKWebViewJavascriptBridge.m WebViewJavascriptBridgeBase.h WebViewJavascriptBridgeBase.m WebViewJavascriptBridge_JS.h WebViewJavascriptBridge_JS.m 一般使用只需要关注 WebViewJavascriptBridge 类提供的接口,这个类的主要职责是用来做 Mac 和 iOS webview 的适配(包括 WKWebView,但是这部分代理出去给 WKWebViewJavaScriptBridge 类)并为客户端提供便利的使用接口。WebViewJavascriptBridgeBase 类负责有关数据加工、消息队列管理、消息派发及回调的处理工作。WebViewJavascriptBridge_JS 类包含 JS 端的实现代码,通过宏处理返回 JS 端实现代码的一个 OC 字符串,便于在适当时机将其注入到文档模型中完成 bridge 的初始化。

iOS 远程打包脚本制作

在 iOS 开发中,一般打发布包都是在本地打包,也就是工程师在自己开发电脑上使用 Xcode 编译并导出安装包来进行发布,为了提高效率可能会制作一些自动化打包脚本。本文聊的是远程打包的内容,通过资源拷贝及参数替换然后编译完成打包。 由于 HTML5 跨平台的特点,很多技术团队考虑到代码复用,在部分模块中会采用 h5 来描述界面。甚至有些不需要太复杂交互的 app,全部界面采用 h5 来编写,也就是一个 web 工程。对于大部分现有的 web 工程,能打包成 app 就已经满足了业务诉求。DCloud 团队开发的 HBuilder(IDE)工具中提供了云打包的功能,用起来很方便,简单的说,就是把 web 工程上传到云打包服务器,最后打包生成 app,点击下载即可安装使用。 虽然云打包服务很方便,但上传源码总感觉不太妥当,总有些秘密不想让别人看见,并且其他同事也有打包的需求,但不一定会使用 HBuilder。因此,搭建一个自己的打包服务很有必要。 按照 HBuilder 提供的云打包功能,先定一个初步的需求: 支持修改应用 id、版本号 、icon、启动图 支持导入签名文件 开工!!! 准备工作 首先,需要一台安装了 MacOS 的电脑(当做服务器使用)。 笔者手头上刚好有台闲置的电脑就拿来当服务器使用了,装了 WMWare,然后装了 MacOS 虚拟机(问题较多,不建议使用虚拟机)。 物理机 windows7,内存 4G;虚拟机 MacOS,内存 3G。 其次,在服务器上部署一个 web 服务,提供打包交互界面方便客户端上传资源文件及下载安装包。我们的界面只提供了一个 www zip 包的上传入口,所有应用资源及打包相关的配置文件都在里面。www 目录结构如下: appConfig.json 文件内容 1 2 3 4 5 6 7 8 9 10 11 { "id":"com.

Android Gradle 注入编译变量

最近为了制作 Android 应用打包脚本,学习了一下 gradle。Gradle 构建系统语法简洁、功能强大、配置灵活,笔者只是把它当作一个构建工具来使用,基于它所提供的便利制作可以修改版本号、编译号、id 及导入证书的脚本。 对于一个项目或者一个工程,Gradle 可以定义多个构建任务,debug 和 release 是常见的两个构建任务,用户还可以根据需要自定义自己的构建任务,如测试构建任务和预发布构建任务,甚至是针对不同发布渠道的构建任务。这里只用到 debug 任务。 gradle 命令行支持传入自定义参数,并在编译过程注入这些参数。 修改 appid 及 版本号 修改 build.gradle 文件 1 2 3 4 5 6 7 8 9 10 11 android { compileSdkVersion 21 buildToolsVersion '26.0.2' defaultConfig { applicationId project.hasProperty('applicationId') ? applicationId : "com.domain.myApp" minSdkVersion 14 targetSdkVersion 21 versionCode project.hasProperty('versionCode') ? versionCode.toInteger() : 100 versionName project.hasProperty('versionName') ? versionName : "1.0.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } 命令行中传入对应 key 的参数 1 gradle assembleDebug -PversionCode="200" -PversionName="2.