diff --git a/Controller/HomeViewController.swift b/Controller/HomeViewController.swift index dbc5d78..e0508c0 100644 --- a/Controller/HomeViewController.swift +++ b/Controller/HomeViewController.swift @@ -51,7 +51,7 @@ class HomeViewController: BaseViewController { navigationItem.setBarButtonItems(items: [ UIBarButtonItem(customView: newButton), - UIBarButtonItem(customView: serversButton), + UIBarButtonItem(customView: serversButton) ], position: .right) self.view.addSubview(self.tableView) @@ -87,7 +87,7 @@ class HomeViewController: BaseViewController { let startRequestAuthorization: () -> Observable = { Single.create { single -> Disposable in let center = UNUserNotificationCenter.current() - center.requestAuthorization(options: [.alert, .sound, .badge, .criticalAlert], completionHandler: { (_ granted: Bool, _: Error?) -> Void in + center.requestAuthorization(options: [.alert, .sound, .badge, .criticalAlert], completionHandler: { (_ granted: Bool, _: Error?) in single(.success(granted)) }) return Disposables.create() @@ -166,6 +166,13 @@ class HomeViewController: BaseViewController { }) .disposed(by: rx.disposeBag) + // 弹出服务器错误提示,引导用户跳转FAQ + output.alertServerError + .drive(onNext: { [weak self] error in + self?.alertServerError(error: error) + }) + .disposed(by: rx.disposeBag) + // startButton是否可点击 output.startButtonEnable .drive(self.startButton.rx.isEnabled) @@ -198,11 +205,9 @@ class HomeViewController: BaseViewController { var viewController: UIViewController? if let viewModel = viewModel as? NewServerViewModel { viewController = NewServerViewController(viewModel: viewModel) - } - else if let viewModel = viewModel as? SoundsViewModel { + } else if let viewModel = viewModel as? SoundsViewModel { viewController = SoundsViewController(viewModel: viewModel) - } - else if let viewModel = viewModel as? CryptoSettingViewModel { + } else if let viewModel = viewModel as? CryptoSettingViewModel { self.navigationController?.present(BarkNavigationController(rootViewController: CryptoSettingController(viewModel: viewModel)), animated: true) return } @@ -219,4 +224,16 @@ class HomeViewController: BaseViewController { self.navigationController?.present(controller, animated: true, completion: nil) } } + + func alertServerError(error: String) { + let alertController = UIAlertController(title: NSLocalizedString("ServerError"), message: error, preferredStyle: .alert) + alertController.addAction(UIAlertAction(title: NSLocalizedString("faq"), style: .default, handler: { [weak self] _ in + guard let url = try? NSLocalizedString("faqUrl").asURL() else { + return + } + self?.navigationController?.present(BarkSFSafariViewController(url: url), animated: true, completion: nil) + })) + alertController.addAction(UIAlertAction(title: NSLocalizedString("Cancel"), style: .cancel, handler: nil)) + self.present(alertController, animated: true, completion: nil) + } } diff --git a/Controller/HomeViewModel.swift b/Controller/HomeViewModel.swift index eb4a980..ccb722a 100644 --- a/Controller/HomeViewModel.swift +++ b/Controller/HomeViewModel.swift @@ -32,6 +32,7 @@ class HomeViewModel: ViewModel, ViewModelType { let clienStateChanged: Driver let tableViewHidden: Driver let showSnackbar: Driver + let alertServerError: Driver let startButtonEnable: Driver let copy: Driver let preview: Driver @@ -119,6 +120,9 @@ class HomeViewModel: ViewModel, ViewModelType { ) ] + /// 记录服务器错误的次数,如果错误次数大于2次,弹出提示引导用户查看FAQ。 + private var serverErrorCount = 0 + func transform(input: Input) -> Output { let title = BehaviorRelay(value: ServerManager.shared.currentServer.host) @@ -166,6 +170,7 @@ class HomeViewModel: ViewModel, ViewModelType { .asDriver(onErrorJustReturn: false) let showSnackbar = PublishRelay() + let alertServerError = PublishRelay() // 点击注册按钮后,如果不允许推送,弹出提示 tableViewHidden @@ -187,11 +192,18 @@ class HomeViewModel: ViewModel, ViewModelType { .map { _ in () } // client state 变化时,发出相应错误提醒 - input.clientState.drive(onNext: { state in + input.clientState.drive(onNext: { [weak self] state in + guard let self else { return } + switch state { case .ok: break case .serverError(let error): - showSnackbar.accept("\(NSLocalizedString("ServerError")): \(error.rawString())") + if serverErrorCount < 2 { + showSnackbar.accept("\(NSLocalizedString("ServerError")): \(error.rawString())") + } else { + alertServerError.accept(error.rawString()) + } + serverErrorCount += 1 default: break } // 主要用于 url scheme 添加服务器时会有state状态改变事件,顺便更新下标题 @@ -220,6 +232,7 @@ class HomeViewModel: ViewModel, ViewModelType { clienStateChanged: clienState.asDriver(onErrorDriveWith: .empty()), tableViewHidden: tableViewHidden, showSnackbar: showSnackbar.asDriver(onErrorDriveWith: .empty()), + alertServerError: alertServerError.asDriver(onErrorDriveWith: .empty()), startButtonEnable: Driver.just(true), copy: Driver.merge(sectionModel.items.map { $0.copy.asDriver(onErrorDriveWith: .empty()) }), preview: Driver.merge(sectionModel.items.map { $0.preview.asDriver(onErrorDriveWith: .empty()) }),