iOS设计模式

XCode中引入workspace管理平台型应用

2016-08-29  本文已影响436人  松哥888

背景介绍

移动互联网已经从1.0进化到2.0,移动APP也从单体应用进化到了平台型客户端。稍微上点规模的APP,已经不再是一个简单的MVC就能清晰表达的小儿科了。
常见场景:业务部门A有APP1,业务部门B有APP2......,为了模块复用,公司可能还会成立一个平台部,给各个业务部门提供公用组件。
做过VS开发都知道,一般上来是workspace,然后project,然后dll;对应到XCode,这一套也是同样可以的,只是目前还没流行而已
这是Swift版本的,基于Carthage库管理的。 Object-C的话,由于CocoaPods的原因,侵入性太强,会自动生成应用同名的workspace,所以不需要手动创建workspace文件,不过目录结构要注意一下。

基本结构

分为workspace -》project -》target -》File 四级

程序架构

程序框架.jpg

操作步骤

  1. 创建文件夹Platform,名字也可以带上版本号,比如Platform1.0.0

  2. 创建workspace文件,Platform.xcworkspace

  3. 创建主工程Platform.xcodeproj,工程类型选“Single View Application”,语言选"Swift",保持"Include Unit Test"勾上不动,保存时选择加入workspace。Target的概念目前就用默认的单元测试,做不做,看情况吧,位置先留着。

  4. 创建 Business.framework,类型选framework,不要选static library,用动态库,不要静态库,除非有十二分的理由。“Add to”和“Group”都选择workspace

  5. 用同样的方式创建Service.framewrok:Component.framework:等工程

  6. 版本号都设为8.0;framework从iOS8才开始用。并且主工程的版本号不能低于framework的版本号,否则会崩溃。大家都设成8就没事了。以后主工程可以升,framework保持不变。一般framework都是些跟界面无关的逻辑或者数据,不需要经常升版本的。实在有必要,才设为8以上的版本。

  7. 创建Carthage文件Carthage Cartfile,写上第三方库的内容(github "Alamofire/Alamofire" ~> 3.4)(当然可以有更多第三方库),保存在和workspace同一目录下

  8. 打开终端工具,定位到工程文件夹下,运行命令carthage update,下载并编译第三方库。至此,基本的准备工作算是完成了。这些步骤也只是建议,乱了也没关系,总是有办法调整过来的,只是有时候会麻烦一点。

文件结构.jpg 工程结构.jpg

编码实现

/ 单例入口
public final class BusinessManager {
    public static let sharedInstance = BusinessManager()
    
    public func invokeWithUrl(url: String) {
        print(url)
        Service1.invokeWithUrl("Service1://function?from=Business&param1=value1&param2=value2")
        Service2.invokeWithUrl("Service2://function?from=Business&param1=value1&param2=value2")
        Component.invokeWithUrl("Component://function?from=Business&param1=value1&param2=value2")
    }
}

// 全局函数入口
public func invokeWithUrl(url: String) {
    BusinessManager.sharedInstance.invokeWithUrl(url)
}

调用和依赖

主程序Platform调用Business.framework

import UIKit
import Business

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
            BusinessManager.sharedInstance.invokeWithUrl("Business://function?from=Platform&param1=value1&param2=value2")
    }
}
  1. 这里竟然不需要在“General”标签的“Linked Frameworks and Libraries”加入Business.framework就能在Platform里直接使用,超出预期。“什么都不用做,import一下,就直接使用”,竟然这么简单。估计是同属于一个workspace的原因吧
  1. Business.framework做了修改,直接运行Platform,修改没有显现出来。这种情况下,工程需要切换到Business.framework编译一下,再切换到Platform,运行,修改就起效果了。 === 如果有修改,在主工程或者相应的framework工程clean一下,那么就会提示重新编译
  1. 在Business.framework中加断点,直接运行Platform,断点能正确停住,就像在同一工程中一样,修改也能及时起效果。=== 这里,由于断点原因,重新编译,修改效果能够立即显现。
  1. 在模拟器中调试运行,也不涉及第三方库,“什么都不用做,import一下,就直接使用”。真机调试,或者涉及第三方库,需要做相应的调整。

framework之间相互调用

主程序或者framework调用第三方库

真机调试

不要copy framework.jpg

framework的真机版本和模拟器版本

例子代码

Platform1.0

上一篇 下一篇

猜你喜欢

热点阅读