RxCoreLocation
RxCoreLocation 抽象化了 Core Location 的 Rx 行为
需求
- iOS 9.0+ / Mac OS X 10.10+ / tvOS 9.0+ / watchOS 2.0+
- Xcode 9.1+
安装
CocoaPods
CocoaPods 是 Cocoa 项目的依赖管理器。你可以使用以下命令安装它
$ gem install cocoapods
为了使用 CocoaPods 将 RxCoreLocation 集成到你的 Xcode 项目中,请在 Podfile
中指定它
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
use_frameworks!
pod 'RxCoreLocation', '~> 1.5.1'
然后,运行以下命令
$ pod install
Carthage
Carthage是一个去中心化的依赖管理器,它自动化了向您的Cocoa应用程序添加框架的过程。
您可以使用以下命令通过Homebrew安装Carthage
$ brew update
$ brew install carthage
要使用Carthage将RxCoreLocation集成到您的Xcode项目中,请在您的Cartfile
中指定它
github "RxSwiftCommunity/RxCoreLocation" ~> 1.5.1
Swift Package Manager
为了将RxCoreLocation作为一种Swift Package Manager包来使用,只需在您的Package.swift文件中添加以下内容。
import PackageDescription
let package = Package(
name: "HelloRxCoreLocation",
dependencies: [
.Package(url: "https://github.com/RxSwiftCommunity/RxCoreLocation.git", "1.5.1")
]
)
手动
如果您不希望使用上述任一依赖管理器,可以手动将RxCoreLocation集成到项目中去。
Git 子模块
- 打开终端,使用
cd
命令进入您的顶层项目目录,运行以下命令(如果您的项目尚未初始化为git仓库)
$ git init
- 通过运行以下命令将RxCoreLocation添加为git submodule
$ git submodule add https://github.com/RxSwiftCommunity/RxCoreLocation.git
$ git submodule update --init --recursive
-
打开新的
RxCoreLocation
文件夹,将RxCoreLocation.xcodeproj
拖动到您应用程序Xcode项目的Project Navigator中。它应该位于您应用程序蓝色项目图标的旁边。它是在所有其他Xcode组之上还是之下并不重要。
-
在Project Navigator中选择
RxCoreLocation.xcodeproj
并验证部署目标是否与您的应用程序目标匹配。 -
接下来,在Project Navigator中(蓝色项目图标)选择您应用程序项目,转到目标配置窗口并选择侧边栏中“targets”部分下的应用程序目标。
-
在窗口顶部的标签栏中,打开“General”面板。
-
在“Embedded Binaries”部分下点击加号按钮
+
。 -
您将看到两个不同的
RxCoreLocation.xcodeproj
文件夹,每个文件夹中都嵌套了两个不同版本的RxCoreLocation.framework
,分别位于一个Products
文件夹中。选择哪个
产品
文件夹并不重要。 -
选择
RxCoreLocation.framework
。 -
就这么简单!
RxCoreLocation.framework
会在自动添加为项目依赖、链接框架和嵌入框架,这在复制文件构建阶段配置就能满足模拟器和设备的构建需求。
嵌入的二进制文件
- 从https://github.com/RxSwiftCommunity/RxCoreLocation/releases下载最新版本。
- 接下来,在Project Navigator中(蓝色项目图标)选择您应用程序项目,转到目标配置窗口并选择侧边栏中“targets”部分下的应用程序目标。
- 在窗口顶部的标签栏中,打开“General”面板。
- 在“Embedded Binaries”部分下点击加号按钮
+
。 - 添加下载的
RxCoreLocation.framework
。 - 就这么简单!
使用方法
RxCoreLocation 向开发者暴露了大量的 Apple Core Location API
,使其可以直接在 App 中使用。
- 订阅
CLPlacemark
/// Setup CLLocationManager
manager.requestWhenInUseAuthorization()
manager.startUpdatingLocation()
manager.rx
.placemark
.subscribe(onNext: { placemark in
guard let name = placemark.name,
let isoCountryCode = placemark.isoCountryCode,
let country = placemark.country,
let postalCode = placemark.postalCode,
let locality = placemark.locality,
let subLocality = placemark.subLocality else {
return print("oops it looks like your placemark could not be computed")
}
print("name: \(name)")
print("isoCountryCode: \(isoCountryCode)")
print("country: \(country)")
print("postalCode: \(postalCode)")
print("locality: \(locality)")
print("subLocality: \(subLocality)")
})
.disposed(by: bag)
- 您可以订阅单个
CLLocation
更新或订阅[CLLocation]
///Subscribing for a single location events
manager.rx
.location
.subscribe(onNext: { location in
guard let location = location else { return }
print("altitude: \(location.altitude)")
print("latitude: \(location.coordinate.latitude)")
print("longitude: \(location.coordinate.longitude)")
})
.disposed(by: bag)
///Subscribing for an array of location events
manager.rx
.didUpdateLocations
.subscribe(onNext: { _, locations in
guard !locations.isEmpty,
let currentLocation = locations.last else { return }
print("altitude: \(currentLocation.altitude)")
print("latitude: \(currentLocation.coordinate.latitude)")
print("longitude: \(currentLocation.coordinate.longitude)")
})
.disposed(by: bag)
- 观察
CLAuthorizationStatus
并根据需求作出反应
///Monitoring authorization changes
manager.rx
.didChangeAuthorization
.subscribe(onNext: {_, status in
switch status {
case .denied:
print("Authorization denied")
case .notDetermined:
print("Authorization: not determined")
case .restricted:
print("Authorization: restricted")
case .authorizedAlways, .authorizedWhenInUse:
print("All good fire request")
}
})
.disposed(by: bag)
授权协议
RxCoreLocation 在 MIT 许可协议下发布。有关详细信息,请参阅授权协议。