RxAppState
RxAppState 是一系列便捷的 RxSwift Observables,让您能够观察应用状态以及 UIViewController 视图相关的通知中的所有更改。
关于
应用状态
几乎在每一个应用中,都有一些代码您希望在用户每次打开应用时运行。例如,您希望刷新某些数据或跟踪用户打开了您的应用。
“UIApplicationDelegate”提供了两种可用于在用户打开应用时运行代码的方法:applicationWillEnterForeground 和 applicationDidBecomeActive。但任意一种方法在此情况下都不是最理想的
applicationWillEnterForeground 在应用首次启动时不会被调用。它仅在应用处于后台并进入前台时被调用。在首次启动时,应用不是处于后台状态,因此此方法不会被调用来。
applicationDidBecomeActive 方法不仅在应用程序首次启动时被调用,当应用程序从非活动状态变为活动状态时也会被调用。这是因为每当用户打开控制中心、通知中心、接收到电话或显示系统提示(例如请求用户允许发送远程通知)时,都会发生这种情况。因此,如果您将代码放在 applicationDidBecomeActive 中,它不仅会在用户打开应用程序时被调用,还会在上文提到的所有情况下被调用。
因此,要确保只有当用户打开应用程序时运行您的代码,您需要跟踪应用程序的状态。您可能会实现如下等内容:
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var didEnterBackground = true
...
func applicationDidEnterBackground(_ application: UIApplication) {
didEnterBackground = true
}
func applicationDidBecomeActive(_ application: UIApplication) {
if didEnterBackground {
// run your code
didEnterBackground = false
}
}
...
}
这不是一个大问题,但这并不是一个非常优雅的方法。而且,您必须将 didEnterBackground 的初始值设置为 true 来在首次启动后运行代码(请参阅上文),即使应用程序从未进入后台。
RxAppState 来拯救!
使用 RxAppState,您只需做以下操作
UIApplication.shared.rx.didOpenApp
.subscribe(onNext: { _ in
// run your code
})
.disposed(by: disposeBag)
这将使每当用户打开应用程序时运行您的代码。这包括应用程序的首次启动,并忽略了应用程序在未进入后台状态的情况下进入活动状态的情况(例如,当用户刚刚打开控制中心或接收到电话)。
而且还有更多!
您想在用户首次打开应用程序时显示教程?并且只想在首次启动后显示它,之后再也不会显示?没问题
UIApplication.shared.rx.firstLaunchOnly
.subscribe(onNext: { _ in
// run your code
})
.disposed(by: disposeBag)
您想在用户在更新后首次打开应用程序时显示新功能?
UIApplication.shared.rx.firstLaunchOfNewVersionOnly
.subscribe(onNext: { version in
let previousAppVersion = version.previous
let currentAppVersion = version.current
// show what has changed between
// the previous and the current version
})
.disposed(by: disposeBag)
您想在用户每次打开应用程序时检查上一个版本和当前版本?只需这样做
UIApplication.shared.rx.appVersion
.subscribe(onNext: { version in
let previousAppVersion = version.previous
let currentAppVersion = version.current
// run your code
})
.disposed(by: disposeBag)
您想跟踪用户打开您的应用程序的次数吗?只需这样做
UIApplication.shared.rx.didOpenAppCount
.subscribe(onNext: { count in
print("app opened \(count) times")
})
.disposed(by: disposeBag)
额外福利
此代码不必存在于您的 AppDelegate 中。您可以将它放在应用程序中的任何地方!所以不要在我们的 AppDelegate 中添加这些代码,将其放在其他地方!
ViewController 视图相关通知
您还可以使用 Observable 来订阅您视图控制器的视图相关通知。
要在您的视图控制器的 viewDidAppear:
方法被调用时执行某些操作,您可以在视图中进行如下操作:
rx.viewDidAppear
.subscribe(onNext: { animated in
// do something
})
.disposed(by: disposeBag)
如果只想在视图首次出现时执行某些操作,您可以轻松地这样做
rx.viewDidAppear
.take(1)
.subscribe(onNext: { animated in
// do something
})
.disposed(by: disposeBag)
您还可以直接将视图控制器的视图状态绑定到另一个对象。
rx.viewWillDisappear
.bind(to: viewModel.saveChanges)
.disposed(by: disposeBag)
示例
有一个简单的示例项目来演示如何使用 RxAppDelegate。
需求
iOS 12 或更高版本
Swift 5
Xcode 10.2
如果您使用的是 Swift 4.0,请使用 RxAppState 版本 1.1.1
如果您使用的是 Swift 4.1,请使用 RxAppState 版本 1.1.2
如果您使用的是 Swift 4.2,请使用 RxAppState 版本 1.4.1
依赖项
RxSwift 6.0
RxCocoa 6.0
集成
CocoaPods
RxAppState
通过 CocoaPods 提供使用。要安装它,只需将以下行添加到您的 Podfile
pod "RxAppState"
如果 Xcode 抱怨 Swift 版本,请在您的 Podfile 的末尾添加此内容
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '5.0'
end
end
end
Carthage
您可以使用 Carthage 通过将其添加到您的 Cartfile
来安装 RxAppState
github "pixeldock/RxAppState"
Swift 包管理器
您可以使用 Swift 包管理器来安装 RxAppState
https://swiftlang.cn/package-manager/
作者
Jörn Schoppe,
<[email protected]>
许可证
RxAppState可在MIT许可证下使用。有关更多信息,请参阅LICENSE文件。