`UITabBarController`和`UINavigationController`同时使用时的处理
- 当需要叠加
UITabBarController和UINavigationController时,应将后者放在前者之中。

- 当需要新的控制器不显示Tab Bar时,应该在它的控制器选中
Hide Botton Bar on Push.

UITabBarController和UINavigationController时,应将后者放在前者之中。
Hide Botton Bar on Push.
保存的数据库采用realm。手表部分的app具备与iOS端相同的功能。
数据保存在用户的Document里。升级app数据不会消失,卸载app数据会消失。
以iOS端为核心。watchOS发起同步请求。
以WCSession的生命周期最为标准。每次WCSessionDelegate的session(_:activationDidCompleteWith:error:)的运行被认为是一次首次启动。
needSyncDatabase = true。在同步数据库完成之前,不会发送新的同步信息。// MARK: - WatchConnectivity
extension AppDelegate:WCSessionDelegate {
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
if transfer?.isTransferring == true { transfer?.cancel() }
needSyncDatabase = true
transfer = session.transferUserInfo(["needSyncDatabase":needSyncDatabase])
}
func sessionDidBecomeInactive(_ session: WCSession) {
}
func sessionDidDeactivate(_ session: WCSession) {
}
}
WCSession首次启动时主动同步。// MARK: -WCSessionDelegate
extension ExtensionDelegate:WCSessionDelegate {
func shouldSyncDatabase() -> Bool {
return needSyncDatabase && !isSyncingDatabase
}
func willSyncDatabase() {
isSyncingDatabase = true
}
func didSyncDatabase() {
needSyncDatabase = false
isSyncingDatabase = false
}
func syncDatabase() {
guard shouldSyncDatabase() else { return }
willSyncDatabase()
// sync database
didSyncDatabase()
}
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
syncDatabase()
}
func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) {
if let value = userInfo["needSyncDatabase"] as? Bool {
needSyncDatabase = value
syncDatabase()
}
}
}

NSHomeDirectory()NSTemporaryDirectory(),在home目录外,但在沙盒里~/Library/Group Containers/<application-group-id>FileManager的containerURL(forSecurityApplicationGroupIdentifier:)方法思考
单独将数据保存在程序组容器目录是否安全?
**安全。**因为只有相同开发团队的人才能访问。而且可以简化开发。
**不安全。**因为一个app的数据有被其它app删除的风险。另外,是否应该限制这部分数据,使只有需要分享的数据才方到这里。
**结论。**我个人更倾向于安全。因为团队内部的人应该被认为是可信的。但是这么做的确会存在过多分享的问题。因此,我认为还是不要把主数据库放在这边,而是将其作为辅助数据库更好。至于说需要额外处理的代码问题。我相信,从长期看,这部分代码必然是必要的。