越狱开发系列(一):让 iPhone 上显示学期周数

引言

盘古团队前些天发布了 iOS 9.2–9.3.3 的越狱工具,虽然是 Semi-Tethered Jailbreak 1,但聊胜于无。趁此机会写几篇越狱开发的博客。

越狱开发和普通的 iOS 开发大有不同,之前看过一位开发说的观点:iOS 开发就是两个极端,能实现的功能实现起来极容易,没法实现的功能就连想都不要想。的确,苹果的技术文档非常详尽完善,开发社区也很活跃,因此一个开发者在苹果的框框里办事会非常舒服;而假如你想打破这个限制,那就步履维艰了,苹果的私有 API 不仅不公开、没文档,而且使用私有 API 的 App 将会在 App Store 的审核中被秒拒。

越狱开发则与之相反:一切皆有可能,只是需要不断地探索、尝试和失败。随着一代代越狱开发者的努力,越狱开发也渐渐形成了完整的工具链和一定的社区规模。尽管工具的易用程度和开发社区的活跃度都不可与非越狱 iOS 开发同日而语,但前人的经验已经让入门越狱开发变得非常简单 — — 这几篇博客就将证明这一点。

目标

这次拿来写博客的范例是我生活中的一个需求。相信每个大学生的生活都是以「周」为计时单位的,第 3 周作业提交、第 5 周实验、第 8 周期中考试、第 10 周答辩……各种课程活动让我需要经常打开校历查看现在是第几周。能不能把当前的周数显示在 iPhone 的某个位置,拿起来就能看到呢?

经过一番斟酌,我选中了两个地方:锁定屏幕显示日期处和通知中心「今天」页面显示农历日期处,我们的目标就初步确定为编写一个 WeekCount 插件,在这两处增加显示当前的周数。

工作流程

iOS 编程严格遵循 MVC (Model-View-Controller) 模式,即 View 管理和组织 UI 元素、Model 负责底层逻辑、Controller 建立二者的交互,如下图所示2。而越狱开发作为逆向工程的一种,其基本思路就是反其道而行之,由目标 UI 元素分析出其所属的 View、得到控制它的 Controller、进而获得其底层逻辑或者数据结构。

对于本例这种简单的 UI 修改插件来说,做到由 UI 到 View(至多再分析到 Controller)基本就可以完成目标了。因此这个插件开发的基本步骤是:分别找到需要修改的两处对应的 View、分析其头文件,定位目标方法,修改方法改变 UI;此外,当然还需开发一个计算周数的模块。

目录

让 iPhone 上显示学期周数(一) — — 环境搭建与测试

让 iPhone 上显示学期周数(二) — — 定位锁屏界面目标方法

让 iPhone 上显示学期周数(三) — — 定位通知中心目标方法

让 iPhone 上显示学期周数(四) — — 周数计算与添加显示

让 iPhone 上显示学期周数(五) — — 增加用户配置界面

让 iPhone 上显示学期周数(六) — — 用户配置的读取与更新、总结


  1. 即重启后越狱状态丢失,需要重新通过 App 引导激活。
  2. 取自 Stanford 公开课 Developing iOS 9 Apps with Swift 第二节课件。