移动开发技术

Jason's Blog

TIP项目网络框架梳理

前段时间小伙伴重构了项目的网络层代码,将之前的过程式的代码,面向对象化了,职责分离,更易维护。不过也增加了理解成本,这里记录一下。

整个网络模块的类图如下。PMD开头的类下沉到了基础库,IG开头的类仍然在项目中。

  • IGNetworkManager作为项目中使用网络层的入口类,不多做介绍。
  • PMDNetworking是发起网络请求的类,这里首先要用PMDCallFactory工厂类,生成一个实现PMDCall协议的对象,然后调用makeCallWithRequest方法进行网络请求。
  • PMDCallFactory用于生成PMDCall协议对象
  • PMDCall协议对象为了避免被回收,放到了PMDCallPool里进行管理
  • PMDBaseCall实现了PMDCall协议,完成了主要的网络请求逻辑。分为以下几个步骤

1.callWithRequest准备发起网络请求

2.dealWithInterceptResult遍历所有PMDIntercept,在真正发起网络请求前进行逻辑处理,处理的过程中可以中断。

3.realCallWithRequest真正发起网络请求,这里的实现交给继承类IGCall来实现,具体的实现可以是http,也可以是tcp,在TIP项目中用到了IGNetworkObject去发网路请求。

4.convertResponse将请求回来的数据,遍历PMDConverter进行处理。

  • PMDInterceptor和PMDConverter协议分别是需要在网络请求发出之前和之后要处理的逻辑,只要实现此协议,加入到PMDBaseCall中就可以了。

基本的结构就是这样了,除此之外,框架还实现了取消发送,重新发送等逻辑,这里不再详细介绍。

对iOS App签名的理解

关于iOS设备签名的原理,这篇文章说的比较清楚了。如果忘了的话可以重新阅读以下。

iOS App 签名的原理

这里按照我的理解角度复述一下:

  1. 为了不让每次开发App,都将App上传到苹果后台,用苹果后台的私钥A签名,需要本地生成一对公私钥。这样每次签名就在本地Mac机器上,用私钥L签名就可以了。
  2. 那么苹果如果验证公钥L的合法性呢,就需要开发者将公钥L上传到苹果的后台,苹果用私钥A进行一次签名,签名+公钥L就是证书了。(这里实际上用一次对公钥L的签名替代了每次对App的签名,省去了App每次修改都上传签名的麻烦,很巧妙)
  3. 第2步中的证书+一些额外信息(AppId,设备列表,push权限等)全部都在苹果的后台用私钥A签名,打包成的东西叫Provisioning Profile,下载到本地Mac后,打包在App中。安装在iOS设备的时候,用公钥A对其进行解密,验证证书+一些额外信息(AppId,设备列表,push权限等。证书验证后拿到公钥L,对App数据进行解密验证(App是用私钥L签名的)。

好了,上边的文字其实看着还是有点乱和绕,权当我自己的思路做参考吧。

回到我们的项目,其实有一点是可以改进的。

以上图片是我们项目在苹果后台的证书配置,可以看到,有很多项,原因是每个开发的电脑上都生成了一对公钥L和私钥L,然后将公钥L上传到苹果后台生成了证书。更好的办法是,只用一台开发电脑生成公钥L和私钥L,然后到处p12文件,分享给别的电脑,这样苹果后台就只需要一个证书就可以了。

在新电脑上恢复Octopress

换了新电脑,如何在新电脑上继续使用OctoPress呢,只需要执行以下命令

1.首先将博客的源文件clone到本地的octopress文件夹内

1
$ git clone -b source https://github.com/username/username.github.io.git octopress  

2.将博客文件clone到octopress的_deploy文件夹内

1
2
$ cd octopress  
$ git clone https://github.com/username/username.github.io.git _deploy   

username为github用户名

iOS开发中支持实时UI调试的方法

背景

平时在开发iOS界面的过程中,如果修改了布局代码,需要重新启动模拟器,进行效果查看。如果工程较大,启动将耗时比较长,比较浪费时间。这里介绍一个工具InjectionIII,使用后可以不重启应用,保存文件后直接查看修改效果,极大提升界面开发工作的效率。

使用方法

1.在App Store下载InjectionIII

2.在应用启动函数 加入以下代码

1
2
3
4
#if DEBUG
    NSBundle *bundle = [NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection10.bundle"];
    [bundle load];
#endif

3.启动InjectionIII,重启XCode,然后用模拟器启动应用。状态栏上有InjectionIII的小图标,确认File Watcher选项已经勾选。这时候修改文件,只要保存,在模拟器界面上会立即更新效果

PS: 这个工具的缺点是只支持模拟器,原因参见原理部分。

原理

Injection:iOS热重载背后的黑魔法

用Weex实现三端开发架构和思路

基于目前项目的已有架构,若要实现Weex三端开发,设计的架构如下图:

1.iOS和Android客户端维持tcp+pb方式不变

2.新增http proxy模块,提供http接口给Weex h5访问

职责是将已有的tcp+pb方式访问的服务转换成http+json形式,提供给Weex h5调用。目前http proxy用java实现,与Android客户端网络层复用代码。

3.改造svr接入层,验证Weex h5登录态,进行openid转换

以微信登录为例,之前iOS和Android用的是App授权登录,由于Weex h5是微信公众号授权登录,两者appid不同,授权得到的openid和accesstoken都不一样,需要支持对公众号进行登录校验。校验完登录态后,将公众号openid转换为App openid,再与svr逻辑层进行通信。

Weex与原生页面间的相互跳转

我们在现有应用中集成Weex,难免会遇到Weex页面与原生页面相互跳转的问题。通常的一种场景是,某一个中间的原生页面我们用Weex来替换,这样就存在原生页面跳转到Weex页面,再由Weex页面跳转到原生页面的场景。这篇文章讲述如何实现这种场景。

利用Weex DevTool调试Native应用-iOS篇

官方的文档里说提供了一个工具DevTool,用来调试原生应用,但是写得比较简略,一直跑不起来,经过几天折腾和查资料,基本上是可以调试了,记录一下步骤和问题。