Client.swift 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. //
  2. // Client.swift
  3. // Bark
  4. //
  5. // Created by huangfeng on 2018/6/25.
  6. // Copyright © 2018 Fin. All rights reserved.
  7. //
  8. import RxCocoa
  9. import RxSwift
  10. import UIKit
  11. import UserNotifications
  12. class Client: NSObject {
  13. static let shared = Client()
  14. override private init() {
  15. super.init()
  16. }
  17. var window: UIWindow? {
  18. return UIApplication.shared.delegate?.window ?? nil
  19. }
  20. var currentSnackbarController: BarkSnackbarController? {
  21. return self.window?.rootViewController as? BarkSnackbarController
  22. }
  23. var currentTabBarController: StateStorageTabBarController? {
  24. guard let snackbarController = self.currentSnackbarController else {
  25. return nil
  26. }
  27. if #available(iOS 14, *), UIDevice.current.userInterfaceIdiom == .pad {
  28. return (snackbarController.rootViewController as? BarkSplitViewController)?.compactController
  29. } else {
  30. return snackbarController.rootViewController as? BarkTabBarController
  31. }
  32. }
  33. let appVersion: String = {
  34. var version = "0.0.0"
  35. if let infoDict = Bundle.main.infoDictionary {
  36. if let appVersion = infoDict["CFBundleVersion"] as? String {
  37. version = appVersion
  38. }
  39. }
  40. return version
  41. }()
  42. enum ClienState: Int, Codable {
  43. case ok
  44. case unRegister
  45. case serverError
  46. }
  47. var deviceToken = BehaviorRelay<String?>(value: nil)
  48. var state = BehaviorRelay<ClienState>(value: .ok)
  49. func registerForRemoteNotifications() {
  50. let center = UNUserNotificationCenter.current()
  51. center.requestAuthorization(options: [.alert, .sound, .badge], completionHandler: { (_ granted: Bool, _: Error?) in
  52. if granted {
  53. dispatch_sync_safely_main_queue {
  54. UIApplication.shared.registerForRemoteNotifications()
  55. }
  56. } else {
  57. print("没有打开推送")
  58. }
  59. })
  60. }
  61. func openUrl(url: URL) {
  62. if ["http", "https"].contains(url.scheme?.lowercased() ?? "") {
  63. UIApplication.shared.open(url, options: [UIApplication.OpenExternalURLOptionsKey.universalLinksOnly: true]) { success in
  64. if !success {
  65. // 打不开Universal Link时,则用内置 safari 打开
  66. self.currentSnackbarController?.present(BarkSFSafariViewController(url: url), animated: true, completion: nil)
  67. }
  68. }
  69. } else {
  70. UIApplication.shared.open(url, options: [:], completionHandler: nil)
  71. }
  72. }
  73. }