/hipda_ios_client_v3

Primary LanguageObjective-CMIT LicenseMIT

HiPDA iOS 客户端

一些技术点

1. 模拟Api

Discuz7.2 没有api可用, 用爬虫的方法模拟用户看帖/回帖/收藏等操作
其中从html源文件中获取数据有下面几种方法:

  • 正则提取
  • 生成 DOM 树后提取, hpple
  • 用隐藏的 UIWebView 载入页面然后用 JavaScript 提取数据 (WebKit的DOM树) 参考链接

经测试, 正则提取在渣CPU(iphone4)上明显较快, 但是写起来麻烦, 要细心调试
相关代码: HPNewPost, HPThread, HPSendPost 等(很久以前写的, 代码较渣)

2. UIWebView 和 Native 交互

使用 UIWebView 展示帖子详情, 并和 Native 配合做一些交互

为什么采用 UIWebView 而不是原生控件展示帖子?
用户发帖里面有很多html标签
如加粗, 外链, 图片, 等等, 并且复制过来的帖子标签很多不规范
很难解析也很难使用原生控件展示, 所以采用的UIWebview

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

目前的不足

  1. 因为没有api, 又因为刚开始编写时经验不足, 跳过了自行设计api的过程, 留下了参数不足, 不明确的隐患
  2. 两年前第一次独立写完整的软件项目, 没有什么大局观, 基本是想到哪写到哪, 自(tian)豪(zhen)的采用MassiveViewController架构 :)