HiPDA iOS 客户端
一些技术点
1. 模拟Api
Discuz7.2 没有api可用, 用爬虫的方法模拟用户看帖/回帖/收藏等操作
其中从html源文件中获取数据有下面几种方法:
经测试, 正则提取在渣CPU(iphone4)上明显较快, 但是写起来麻烦, 要细心调试
相关代码: HPNewPost, HPThread, HPSendPost 等(很久以前写的, 代码较渣)
2. UIWebView 和 Native 交互
使用 UIWebView 展示帖子详情, 并和 Native 配合做一些交互
为什么采用 UIWebView 而不是原生控件展示帖子?
用户发帖里面有很多html标签
如加粗, 外链, 图片, 等等, 并且复制过来的帖子标签很多不规范
很难解析也很难使用原生控件展示, 所以采用的UIWebview
- html模板: post_view.html,
- webview与native的交互: HPReadViewController.m:669
- webview的image与native的照片浏览器无缝动画: HPReadViewController.m:1057
3. UIWebView 和 Native 共享头像/图片缓存
在帖子列表页(native)和帖子详情页(webview)都有用户头像
列表页使用的是 SDWebImage 做加载缓存, 而 webview 内部自己处理
这样就无法做到头像缓存的共用, 并且 webview 的缓存行为难以琢磨, 无法定制 (参考链接)
经过一些研究最终实现 webview 与 native 共享 image 缓存
相关代码: HPURLProtocol, SDImageCache+URLCache
通过自定义 NSURLProtocol 和改造 SDWebImage 实现共享image缓存
实现webview请求图片/头像时先从SDImageCache(memory/disk)找, 找不到再发网络请求
并且请求得到的头像图片缓存到cache中, 供以后native和webview使用
4. 自定义 NSURLProtocol
HiPDA这个论坛的域名在移动线路上有时获取不到正确的ip
使用自定义 NSURLProtocol, 强制将来自该域名的请求转向正确的ip地址
相关代码: HPURLProtocol
5. 利用 Background Fetch 实现伪推送
没有服务器支持怎么实时获取消息通知?
使用 Background Fetch 获取新消息后通过发本地通知的方式, 实现伪推送
Moke 等第三方微博客户端也采取这个方法做伪推送
6. UIWebview 的下拉刷新 & 下拉加载上一页 & 上拉翻页
在 webview.scrollview 顶部加上下拉刷新/下拉加载上一页
和底部加上上拉翻页
的控件
其中在最下面加上上拉翻页
的控件有一个问题:
webview的contentSize是不断变化的, 所以需要相应调整控件的 origin.y
实时调整的思路: 键值观察获得 contentSize 然后实时调整 origin.y
当时还没有 SVPullToRefresh/MJRefresh 这样傻瓜化的refresh控件
只有 EGOTableViewPullRefresh 可以参考
当时得到这样的思路还是花了很多力气的
7. 使用 UIActivityViewController 分享
- 可以将帖子全文保存至
印象笔记
,邮件
等应用 - 通过自定义 UIActivity 实现
复制链接
,复制全文
,保存页面完整截图
的功能
8. 使用七牛云服务为站内短消息加上发送图片的功能
Discuz7.2 站内短消息不能发送图片, 所以使用七牛云服务实现了此功能
相关代码: HPQiniuUploader
注意
- 请不要打包后以任何形式分发
- 编译前请了解一下CocoaPods
目前的不足
- 因为没有api, 又因为刚开始编写时经验不足, 跳过了自行设计api的过程, 留下了参数不足, 不明确的隐患
- 两年前第一次独立写完整的软件项目, 没有什么大局观, 基本是想到哪写到哪, 自(tian)豪(zhen)的采用MassiveViewController架构 :)