iOS客户端节日换肤的思考与实现

最近单位的APP来了新的需求,市场说他们要在圣诞节把APP里的图标都换了,还要换背景图片,还要给部分view添加一个遮盖。对,就是换肤。以前没有搞过换肤,所以考虑了一天,感觉大概就是这么个思路,感觉有问题的大家可以一块讨论。

总体来说主要分为两个部分:

第一部分主要是服务器资源的远程加载:

资源加载.png

先说一下我们的要求是,一般在活动的前一天或前几天会提前把资源准备好放在服务器,然后后台开启换肤的接口,也就是说争取在活动开始前确保大多数用户已经把节日需要的资源下载到了本地,然后服务器接口返回会有此次活动的开始时间以及结束时间。然后在活动期间用户打开APP的话动态更换资源。暂时不考虑极限情况,例如用户在活动开始之前始终没有打开过APP,那么该用户当天打开APP第一次是不会看到最新的皮肤。

流程图是刚开始考虑的时候按着当时的思路画的,具体实现的时候有些许偏差,不过总起来说就是这个逻辑。在APP初次打开时配置关于皮肤的一些参数信息反正自我发挥,只要能确保与之后服务器的数据做对比,之后再次打开时只是去读取之前存好的值,在这里我会有一个换肤服务的一个单例,提供一个只读属性来标示现在是否需要更换资源。

如果服务器的版本高于本地的版本,则证明可能有换肤活动,这时需要判断服务器活动的结束时间,如果这个时间早于当前时间说明这次活动可能已经过期,那么客户端也就没有下载资源的必要了。如果这个时间晚于当前时间,则需要下载资源,这里可以给一个资源状态的标示,用来以防本地的版本已经跟服务器的同步而资源并没有下载成功的意外情况。事实上,我们可以一直等到资源下载并解压完成后再更改本地的所有设置,中间如果发生不可预料的错误,也可以避免客户端本地产生脏数据。

第二部分主要就是图片资源的加载了:

图片加载.png

这部分基本上没什么操作难点,无非就是运行时更改方法,重写该方法,在ChangeSkinService单例允许更换资源的情况下,去本地沙盒的Document文件夹中读取需要的图片。具体细节可以根据各自业务的不太来制定,大致思路是不变的,比如说你客户端有的地方的图片可能会有拉伸之类的需求,但这样其实是不影响的,因为图片拉伸的操作底层依然需要调用imageNamed:方法来找到该图片。

所以,基本也就这样。如果你有问题也可以留言我们一起讨论。

注:此文章首发在简书转载请说明出处。

如果你想看到完整的代码,可以去这里:https://github.com/agenric/ChangeSkin

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20190103A08AJ400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券