# iOS 集成 WeexBox

即使项目是用 @weexbox/cli 生成的,我依旧建议你了解一下这个过程。

TIP

iOS SDK使用Swift开发,并且尽量兼容OC。但由于Swift语言本身的限制,导致OC的VC不能继承swift的VC。一个变通的方法是把Swift VC作为OC VC的subVC来使用。
对于有追求的团队而言,强烈建议使用Swift来开发,开发速度和稳健度都会大幅提升!

# 集成SDK

修改Podfile

source 'https://github.com/cocoapods/specs.git'
platform :ios, '10.0'
inhibit_all_warnings!
use_modular_headers!

target 'WeexBoxExample' do
    pod 'WeexBox', '~> 2.0'
end

# 初始化

在 AppDelegate.swift 中

func application(_ application: UIApplication, 
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) 
    -> Bool {
        
    // 初始化 WeexBox
    WeexBoxEngine.setup()
        
    // 开启调试
    WeexBoxEngine.isDebug = true
        
    window = UIWindow(frame: UIScreen.main.bounds)
    window?.backgroundColor = .white
        
    // 使用 WBNavigationController 作为导航基类
    window?.rootViewController = WBNavigationController(rootViewController: LaunchController())
        
    window?.makeKeyAndVisible()
        
    return true
}

# 继承

  • 普通 ViewController 继承 WBBaseViewController
  • Weex ViewController 继承 WBWeexViewController
  • 导航 ViewController 继承 WBNavigationController
  • Web ViewController 继承 WBWebViewController

# 事件通知

WeexBox 提供了原生与weex互相通知的能力(你甚至可以用作原生之间的通知)。
通过 Event 类,你可以:

// 注册事件
Event.register()

// 发送事件
Event.emit()

// 注销事件
Event.unregister()

// 注销所有事件
Event.unregisterAll()

# 网络

Network 类封装了Alamofire。原生和weex的网络请求都会走这里。

// 网络请求域名
Network.server = 你的网络请求域名

// 发起网络请求。如果url已经包含了域名,会忽略你上面的设置
Network.request(url)

TIP

原生也可以直接使用Alamofire,如果是这样,建议使用Network提供的sessionManager。
大多数情况下app会有自己的网络封装,可以参考weexbox来实现自己的network module。

# 热更新

// 配置热更新地址
UpdateManager.serverUrl = hotdeployUrl

// 是否需要强制更新
UpdateManager.forceUpdate = true

// 执行热更新
UpdateManager.update { (state, progress, error, url) in
    switch state {
    case .Unzip:
        // 解压
    case .DownloadFile:
        // 下载
    case .UpdateSuccess:
        // 更新成功,可以进入APP
        // 如果开启了强制更新,会等到下载完成才会进入这里。否则就是静默更新,解压成功就会进入
    }
}

TIP

可以根据环境来选择更新模式。比如
开发和测试使用强制更新,保证app启动即使最新代码。
准生产和生产使用静默更新,保证用户体验。

# 路由

路由提供页面间的跳转功能。

  • 注册路由
Router.register()

TIP

WeexBox 默认注册了weexweb,你可以在app初始化的时候重新注册,用你自己的VC覆盖它们。

  • 路由实例的属性
// 页面名称
public var name: String = ""

// 下一个weex/web的路径
public var url: String?

// 页面出现方式:push, present
public var type: String = Router.typePush

// 是否隐藏导航栏
public var navBarHidden: Bool = false

// 需要传到下一个页面的数据
public var params: Dictionary<String, Any>?

// 打开页面的同时关闭页面
public var closeFrom: Int?

// 关闭页面的方向,默认和堆栈方向一致
public var closeFromBottomToTop = true

// 关闭页面的个数
public var closeCount: Int?
  • 打开页面
var router = Router()

// 原生页面
router.name = "你注册路由时的页面名称"

// weex页面
router.name = Router.nameWeex
router.url = "module/page.js"

// web页面
router.name = Router.nameWeb
router.url = "https://aygtech.github.io/weexbox"

router.open()
  • 关闭页面
var router = Router()
router.close()