ServerManager.swift 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. //
  2. // ServerManager.swift
  3. // Bark
  4. //
  5. // Created by huangfeng on 2018/3/21.
  6. // Copyright © 2018年 Fin. All rights reserved.
  7. //
  8. import RxSwift
  9. import SwiftUI
  10. import UIKit
  11. let defaultServer = "https://api.day.app"
  12. class Server: Codable {
  13. let id: String
  14. let address: String
  15. var key: String
  16. var state: Client.ClienState
  17. init(id: String = UUID().uuidString, address: String, key: String, state: Client.ClienState = .ok) {
  18. self.id = id
  19. self.address = address
  20. self.key = key
  21. self.state = state
  22. }
  23. }
  24. class ServerManager: NSObject {
  25. static let shared = ServerManager()
  26. override private init() {
  27. if let servers: [Server] = Settings[.servers] {
  28. self.servers = servers
  29. }
  30. if servers.count <= 0 {
  31. servers = [Server(id: UUID().uuidString, address: defaultServer, key: "")]
  32. }
  33. self.currentServer = servers[0]
  34. super.init()
  35. // 将老版本数据转换成新版本
  36. if let key = Settings[.key] {
  37. let address = Settings[.currentServer] ?? defaultServer
  38. let server = Server(id: UUID().uuidString, address: address, key: key)
  39. self.servers = []
  40. self.addServer(server: server)
  41. Settings[.currentServerId] = server.id
  42. // 清空老版本数据
  43. Settings[.currentServer] = nil
  44. Settings[.key] = nil
  45. }
  46. if let currentServerId = Settings[.currentServerId] {
  47. self.setCurrentServer(serverId: currentServerId)
  48. }
  49. }
  50. /// 所有的 server
  51. var servers: [Server] = []
  52. /// 当前选中的 server ,在教程页显示。
  53. private(set) var currentServer: Server
  54. /// 更改当前选中的 server
  55. func setCurrentServer(serverId: String) {
  56. if let server = servers.first(where: { $0.id == serverId }) {
  57. currentServer = server
  58. }
  59. else {
  60. currentServer = servers.first!
  61. }
  62. Settings[.currentServerId] = serverId
  63. }
  64. /// 添加新的 server
  65. func addServer(server: Server) {
  66. self.servers.append(server)
  67. saveServers()
  68. }
  69. func updateServerKey(server: Server) {
  70. let foundServer = self.servers.first{ $0.id == server.id }
  71. foundServer?.key = server.key
  72. saveServers()
  73. }
  74. /// 移除 server,移除后如果 server 为`空`, `会新增一个默认server`
  75. func removeServer(server: Server) {
  76. self.servers.removeAll { $0.id == server.id }
  77. if self.servers.count <= 0 {
  78. self.servers.append(
  79. Server(id: UUID().uuidString, address: defaultServer, key: "")
  80. )
  81. }
  82. if self.currentServer.id == server.id {
  83. self.setCurrentServer(serverId: self.servers[0].id)
  84. }
  85. saveServers()
  86. }
  87. /// 保存 servers
  88. func saveServers() {
  89. Settings[.servers] = self.servers
  90. }
  91. @available(*, unavailable)
  92. required init?(coder aDecoder: NSCoder) {
  93. fatalError("init(coder:) has not been implemented")
  94. }
  95. var dispose: Disposable?
  96. /// 同步所有 server
  97. func syncAllServers() {
  98. guard let token = Client.shared.deviceToken.value, token.count > 0 else {
  99. return
  100. }
  101. dispose?.dispose()
  102. let apis = servers.map { server in
  103. BarkApi.provider.request(
  104. .register(
  105. address: server.address,
  106. key: server.key,
  107. devicetoken: token))
  108. .filterResponseError()
  109. .map { result -> (Server, String, Client.ClienState) in
  110. switch result {
  111. case .success(let json):
  112. if let key = json["data", "key"].rawString() {
  113. return (server, key, .ok)
  114. }
  115. else {
  116. return (server, "", .serverError)
  117. }
  118. case .failure:
  119. return (server, "", .serverError)
  120. }
  121. }.catch { _ in
  122. Observable.just((server, "", .serverError))
  123. }
  124. }
  125. dispose = Observable
  126. .merge(apis)
  127. .subscribe { result in
  128. // 更新所有的 server 状态
  129. if result.2 == .ok {
  130. result.0.key = result.1
  131. }
  132. result.0.state = result.2
  133. // 通知客户端 当前 server 状态改变
  134. if result.0.id == self.currentServer.id {
  135. Client.shared.state.accept(result.2)
  136. }
  137. } onError: { _ in
  138. } onCompleted: {
  139. self.saveServers()
  140. }
  141. }
  142. }