RxCoreLocation 1.5.1

RxCoreLocation 1.5.1

测试测试版
语言语言 SwiftSwift
许可证 MIT
发布上次发布2021年1月
SPM支持 Swift Package Manager

obi bob godwin 维护。



RxCoreLocation

Platforms License

Swift Package Manager Carthage compatible CocoaPods compatible

Travis JetpackSwift

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 许可协议下发布。有关详细信息,请参阅授权协议Try me