FRDIntent :https://github.com/douban/FRDIntent
使用 iOS 系统方法完成各 view controller 之间的跳转,各 view controller 会耦合得很紧。跳转时,一个 view controller 需要知道下一个 view controller 是如何创建的各种细节。这造成了 view controller 之间的依赖。
iOS 系统还为各个应用间的相互调用提供了一种基于 URL 的处理方案。即应用可以声明自己可以处理某些有特定 scheme 和 host 的 URL 。其他应用就可以通过调用这些 URL 而跳转到该应用的某些页面。部分 URL Router 项目比如,使用这个机制通过调用 URL 来实现 view controller 之间的相互调用。这种方案存在一些问题,比如:
- 传递复杂对象很麻烦;
- 无法区分内部和外部调用。
在 Android 中,这一问题得到了优雅的解决。这就是 Intent, Intent 是一个消息传递对象,用于启动 Activity 。 FRDIntent 是对 Android Intent 的一个模仿。当然,相对于 Android Intent , FRDIntent/Intent 做了极度简化。这是因为 FRDIntent/Intent 的使用场景更为简单:只处理应用内的 view controller 间跳转。在 FRDIntent/Intent 的基础上,我们在同一个项目封装了 FRDIntent/URLRoutes ,用于处理应用的外部调用。这样做其实是为了隔离了外部调用和内部调用,做这个区分会带来一些好处:
- iOS 系统提供的通过 URL 调用另外一个应用功能本身就是使用在应用间的。 iOS 系统中,应用之间的隔离是清晰而明确的,通过 URL 在应用之间传递信息是合适的。但是,如果在应用内部调用也使用 URL 传递信息,就会带来诸多限制。 Intent 更适合内部调用的场景。通过 Intent ,可以传递复杂数据对象,可以较容易地定义转场动画。这些在 URL 方案中都很难做到;
- 区分了外部调用和内部调用。我们就可以选择是否将一个内部调用暴露给外部使用。这就避免了在 URL 方案中,无法区分内部调用和外部调用,将本应只给内部使用的调用也暴露给了外部。