版本记录
版本号 | 时间 |
---|---|
V1.0 | 2021.05.08 星期六 |
前言
很多的app都有定位功能,比如说滴滴,美团等,他们都需要获取客户所在的位置,并且根据位置推送不同的模块数据以及服务,可以说,定位方便了我们的生活,接下来这几篇我们就说一下定位框架
CoreLocation
。感兴趣的可以看我写的上面几篇。
1. CoreLocation框架详细解析 —— 基本概览(一)
2. CoreLocation框架详细解析 —— 选择定位服务的授权级别(二)
3. CoreLocation框架详细解析 —— 确定定位服务的可用性(三)
4. CoreLocation框架详细解析 —— 获取用户位置(四)
5. CoreLocation框架详细解析 —— 监控用户与地理区域的距离(五)
6. CoreLocation框架详细解析 —— 确定接近iBeacon(六)
7. CoreLocation框架详细解析 —— 将iOS设备转换为iBeacon(七)
8. CoreLocation框架详细解析 —— 获取指向和路线信息(八)
9. CoreLocation框架详细解析 —— 在坐标和用户友好的地名之间转换(九)
10. CoreLocation框架详细解析(十) —— 跟踪访问位置简单示例(一)
11. CoreLocation框架详细解析(十一) —— 跟踪访问位置简单示例(二)
12. CoreLocation框架详细解析(十二) —— 仿Runkeeper的简单实现(一)
13. CoreLocation框架详细解析(十三) —— 仿Runkeeper的简单实现(二)
14. CoreLocation框架详细解析(十四) —— 仿Runkeeper的简单实现(三)
15. CoreLocation框架详细解析(十五) —— 仿Runkeeper的简单实现(四)
16. CoreLocation框架详细解析(十六) —— 基于Core Location地理围栏的实现(一)
17. CoreLocation框架详细解析(十七) —— 基于Core Location地理围栏的实现(二)
开始
首先看下写作内容:
了解如何使用
UNLocationNotificationTrigger
为iOS应用设置位置触发的通知。内容来自翻译。
接着看下写作环境:
Swift 5, iOS 14, Xcode 12
下面就是正文了。
地理围栏(Geofencing)
(通常称为区域监视)会在您的应用进入或退出某个地理区域时向您发出alert
。这样的一个例子是当用户进入他们最喜欢的咖啡店时提醒用户的应用程序,或者当用户到达牙医时提醒用户签到的应用程序。 iOS中的地理围栏是一项强大的功能,您可以使用它通过UNLocationNotificationTrigger
来驱动位置触发的通知。该功能可以在应用处于活动状态,在后台,挂起或终止时起作用,而无需用户始终提供对其位置的访问权限并牺牲其隐私。
在本教程中,您将向Swifty TakeOut
添加区域监视,Swifty TakeOut
是一个简单的应用程序,允许用户下达取货订单。
通过使用UNLocationNotificationTrigger
提醒用户到达,您将增强该应用程序。然后,用户可以通知厨房他们在“这里”以收集他们的订单。
在此过程中,您不仅将了解什么是Core Location
,而且还将了解如何:
- 设置
Core Location
。 - 注册地理围栏
(geofence)
。 - 向用户征求使用位置服务的许可。
- 启用位置更新后台模式功能。
- 通知用户地理围栏进入事件。
- 注册
UNLocationNotificationTrigger
。
注意:本教程假定您了解
SwiftUI
的基础知识。如果您不熟悉SwiftUI
,请先查看SwiftUI: Getting Started。
打开入门项目,您会找到Swifty TakeOut
,这是一个显示可订购的外卖商品列表的应用程序。用户以后可以在Swifty
外卖店取货。
构建并运行该应用程序:
该应用程序允许用户选择食物单个项目:
还可以对它们下订单:
在Xcode
中,查看将要使用的主要文件:
-
TakeOutStore.swift包含代表外卖店的
struct
结构体。 -
LocationManager.swift包含一个
ObservableObject
,这就是发生魔术的地方。 - MenuItem.swift包含表示菜单项和菜单项数组的结构。
- MenuListView.swift显示可用于订购的项目列表。
- MenuListRow.swift表示菜单的行项目。
- DetailView.swift显示所选项目的详细信息。
在本教程中,您将学习如何在用户到达Swifty TakeOut
餐厅时显示提醒。 您可以通过注册地理围栏并使用设置的UNLocationNotificationTrigger
在该地理围栏上触发来完成此操作。
但是首先,您将学到更多有关Core Location
的信息。
What Is Core Location?
Core Location
是一个Apple
框架,可提供许多服务来从用户设备中获取地理信息。使用API,您可以确定设备的位置,高度,航向和方向。此外,如果附近有任何iBeacon
(蓝牙广告),您可以检测并找到它们。
地理信息来自设备的硬件组件。在可用的地方,包括Wi-Fi,GPS,蓝牙,磁力计,气压计和蜂窝无线电。
一切都围绕CLLocationManager
展开。您将使用它在Swifty TakeOut
中启动,停止和配置位置事件的传递。您还可以将其属性设置为不同的精度,并使用区域监视来监视用户进入或离开不同区域。
注意:要了解有关
Core Location
及其服务的更多信息,请查看Apple’s Core Location documentation。
1. Setting Up Core Location
在检测用户是否进入地理区域之前,您需要设置Core Location
。为此,您将创建一个CLLocationManager
实例。
打开LocationManager.swift
并在LocationManager
内部的location
属性下添加以下代码:
// 1
lazy var locationManager = makeLocationManager()
// 2
private func makeLocationManager() -> CLLocationManager {
// 3
let manager = CLLocationManager()
// 4
return manager
}
这是此代码的作用:
- 1) 添加一个实例属性来存储
location manager
。lazy
属性会延迟初始化,直到首次使用为止。 - 2) 声明一个创建和配置
CLLocationManager
的方法。 - 3) 创建
location manager
的实例。 - 4) 返回配置的
CLLocationManager
对象。
配置好location manager
后,您现在就可以注册您的位置兴趣点。
注意:您可能很想将
CLLocationManager
分配给该属性而不是使用该方法,但是稍后需要对CLLocationManager
对象进行一些其他配置。
2. Creating a Geofence
要在iOS中创建地理围栏,您需要配置CLCircularRegion
。 该对象由一个中心点和一个半径(以米为单位)组成。 当设备从半径外移到半径内时,进入事件会通知您的应用。
从半径的内部到外部时,将触发退出事件。
接下来,当仍在LocationManager.swift
中时,通过在makeLocationManager()
下添加以下代码来配置区域:
// 1
private func makeStoreRegion() -> CLCircularRegion {
// 2
let region = CLCircularRegion(
center: location,
radius: 2,
identifier: UUID().uuidString)
// 3
region.notifyOnEntry = true
// 4
return region
}
这是此代码的作用:
- 1) 声明一个创建
CLCircularRegion
的方法。 - 2) 创建一个
CLCircularRegion
实例。 中心点是location
,即Swifty TakeOut
的纬度和经度。 半径为两米,并且关联了unique identifier
。 - 3) 配置
region
以在发生进入事件时触发通知。 - 4) 返回配置的
region
。
添加该属性后,配置属性以使用此返回值。 将代码添加到location
属性下面:
lazy var storeRegion = makeStoreRegion()
现在,您已经设置了该实用程序方法,您需要获得用户的使用位置信息的许可。 接下来,您将要执行此操作。
Placing an Order
Swifty TakeOut
的主要功能是点菜。 用户下订单时,他们会收到confirmation alert
。 此confirmation alert
还会询问他们是否希望在到达时收到通知。 如果您在点菜时选择路边取货,一些餐馆会建议将食物带到您的车上。 到达时,您必须告诉餐厅“我在这里!”,这样他们才能将食物带到您的车上。 在接下来的几节中,您将添加此功能。
1. Monitoring User Location
对于越过区域边界的通知,您需要开始跟踪设备的位置。 为此,您需要请求用户授权。
返回LocationManager.swift
,在makeStoreRegion()
下添加以下方法:
// 1
func validateLocationAuthorizationStatus() {
// 2
switch locationManager.authorizationStatus {
// 3
case .notDetermined, .denied, .restricted:
// 4
print("Location Services Not Authorized")
// 5
case .authorizedWhenInUse, .authorizedAlways:
// 6
print("Location Services Authorized")
default:
break
}
}
在这里,您添加了以下代码:
- 1) 创建一个名为
validateLocationAuthorizationStatus()
的方法,该方法确定应用程序使用位置服务的授权状态。 - 2) 在应用程序的当前授权状态上配置
switch
语句。 - 3) 针对
.notDefined,.denied
或.restricted
验证当前授权值。 如果匹配,则执行此case
的代码块。 - 4) 如果位置服务未经授权,则打印到调试器。
- 5) 检查当前授权值是否与
.authorizedWhenInUse
或.authorizedAlways
匹配。 - 6) 如果授权,则打印到调试器。
下订单后,您将要求跟踪用户的位置。 然后,使用用户的位置来确定是否跨越了地理围栏。
接下来,打开DetailView.swift
。 如果用户同意在到达时收到通知,则将调用requestNotification()
。 更新此方法以确认位置服务授权状态:
func requestNotification() {
locationManager.validateLocationAuthorizationStatus()
}
添加了此代码后,就可以测试添加的内容了。
构建并运行:
- 1) 选择一种食物。
- 2) 下订单。
- 3) 点击
Yes
以在到达时得到通知。
您应该看到以下内容打印到调试器:
接下来,您将请求用户许可以允许Swifty TakeOut
使用位置服务。
2. Location Authorization
您的应用可以请求两类位置授权:
- 1) When in Use:您的应用在前台运行时可以使用位置服务。借助后台模式,该应用程序还可以在后台获取更新。
- 2) Always:您的应用可以随时使用位置服务。如果该应用未运行,则系统将唤醒它以发送事件。无需具有此权限的后台模式。
重要的是要尊重用户的隐私并尽可能使用When in Use
。 Swifty TakeOut
的核心功能不是基于位置的,因此您不应使用Always
权限。
向用户解释为什么需要监控他们的位置也很重要。用户首次打开应用程序时,许多开发人员会提示您提供位置权限。用户可能不知所措,因为他们不了解应用为何需要其位置。相反,当他们实际想要使用位置功能时,请考虑寻求用户的许可。例如,当用户点击Yes
以在到达时收到通知时,您的应用将请求权限。该应用程序还将在权限提示中说明该应用程序需要位置的原因。
为此,请打开Info.plist
并添加Privacy – Location When In Use Usage Description
键。在原始模式下,这是NSLocationWhenInUseUsageDescription
:
对于该值,添加字符串 Swifty TakeOut uses your location to check you in on arrival
:
注意:如果没有必须的键值对,您将无法获取用户的位置。
3. Requesting Location Authorization
现在,您已经为位置权限添加了必需的键值对,是时候询问用户了。 返回到LocationManager.swift
的validateLocationAuthorizationStatus()
内部,定位到case .notDetermined,.denied,.restricted
。 您将在此处请求WhenInUse
权限。
在print("Location Services Not Authorized")
下,添加:
locationManager.requestWhenInUseAuthorization()
添加此功能后,您现在可以请求用户的许可。
构建并运行。 现在,您应该在第一次下订单时看到位置授权对话框:
如上面的屏幕快照所示,用户可以给出三类响应:
- 1) Allow Once:用户将允许您的应用使用一次其位置信息。
- 2) Allow While Using App:用户在使用该应用程序时已被授予使用其位置的权限。通常,这意味着该应用程序处于前台。但是,此权限可以包括应用在后台,挂起或终止时的权限。
- 3) Allow While Using App:用户拒绝许可。
点击Allow While Using App。
Triggering a Location Notification on Arrival
您想在到达Swifty TakeOut
时提醒用户。为此,您将创建一种特殊的通知类型:UNLocationNotificationTrigger
。设备进入或退出区域时,此对象将创建本地用户通知(local user notification)
。因为您在本教程的前面配置了地理围栏区域,所以现在可以继续进行操作并创建位置触发器。但是,在执行此操作之前,您需要征得用户的许可才能接收推送通知(push notifications)
。
1. Notification Authorization
要获取通知并配置UNLocationNotificationTrigger
,您需要使用UserNotifications API
。
打开LocationManager.swift
,然后在CoreLocation
的导入下方添加:
import UserNotifications
接下来,将以下内容和其他属性添加到LocationManager
类的顶部:
let notificationCenter = UNUserNotificationCenter.current()
您可以在此处创建对系统共享notification center
的引用。 这是iOS中所有事物通知的大脑。
仍在LocationManager.swift
中,将以下方法添加到类的底部:
// 1
func requestNotificationAuthorization() {
// 2
let options: UNAuthorizationOptions = [.sound, .alert]
// 3
notificationCenter
.requestAuthorization(options: options) { result, _ in
// 4
print("Notification Auth Request result: \(result)")
}
}
上面的代码执行以下操作:
- 1) 创建请求通知授权的方法。
- 2) 定义通知的功能,并请求播放声音和显示弹窗的功能。
- 3) 请求用户授权以显示本地通知。
- 4)
completion block
将授权请求的结果打印到调试器。
您想在用户下订单时向他们显示。
导航到DetailView.swift
并找到requestNotification()
。 在方法的底部,添加:
locationManager.requestNotificationAuthorization()
现在,下订单后,系统将提示用户进行通知授权。
构建并运行,然后下订单。
每次下订单时都会执行通知授权步骤。 第一次在特定应用中运行通知授权时,如果默认情况下未启用通知,则应该看到一个弹窗,要求发送通知的权限:
点击Allow
。 您会看到以下内容打印到调试器:
您的应用已准备就绪,可以接收通知。 接下来,您将配置并处理本地通知。
2. Using UNLocationNotificationTrigger to Notify the User
添加了接收推送通知的权限后,该配置一个了。
打开LocationManager.swift
并将以下方法添加到LocationManager
类的底部:
// 1
private func registerNotification() {
// 2
let notificationContent = UNMutableNotificationContent()
notificationContent.title = "Welcome to Swifty TakeOut"
notificationContent.body = "Your order will be ready shortly."
notificationContent.sound = .default
// 3
let trigger = UNLocationNotificationTrigger(
region: storeRegion,
repeats: false)
// 4
let request = UNNotificationRequest(
identifier: UUID().uuidString,
content: notificationContent,
trigger: trigger)
// 5
notificationCenter
.add(request) { error in
if error != nil {
print("Error: \(String(describing: error))")
}
}
}
此方法执行以下操作:
- 1) 创建一种注册通知的方法。
- 2) 创建通知的内容。
UNMutableNotificationContent
是用于表示通知内容的对象。 在这里,您要设置此对象的title, body
和sound
属性。 - 3) 创建一个位置触发条件,使该条件出现。 当您进入
storeRegion
时,将触发此事件。 - 4) 配置
UNNotificationRequest
对象以请求带有notificationContent
和trigger
的通知。 在此请求中设置了unique identifier
。 如果您需要取消通知,这很有用。 - 5) 添加
request
以调度通知。
添加此内容后,如果允许,您需要更新requestNotificationAuthorization()
来注册通知。 这需要进行两次修改。 首先,将.requestAuthorization(options: options) { result, _ in
更改为以下所示:
.requestAuthorization(options: options) { [weak self] result, _ in
您要将[weak self]
添加到completion block
的捕获列表中。 这样,您就可以从completion block
内部访问类的属性。
接下来,在print(“ Notification Auth Request result:\(result)”)
之后,添加:
if result {
self?.registerNotification()
}
此代码测试授权结果,以查看用户是否已获得接收通知的权限。 如果是这样,请注册区域触发通知。
现在,用户进入该区域时应收到通知。
3. Handling Notification Action
要处理通知及其动作,您需要添加UNUserNotificationCenterDelegate
。
打开LocationManager.swift
,并在LocationManager
类之后添加以下扩展名:
extension LocationManager: UNUserNotificationCenterDelegate {}
此扩展程序允许LocationManager
充当UNUserNotificationCenter
的代理。
设置好代理后,在LocationManager
内的属性下方添加以下代码:
// 1
override init() {
super.init()
// 2
notificationCenter.delegate = self
}
这段代码:
- 1) 重写
NSObject
的初始化程序以提供自定义初始化程序代码。 - 2) 将
LocationManager
配置为NotificationCenter
的代理。
接下来,在扩展内添加以下代理方法:
// 1
func userNotificationCenter(
_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void
) {
// 2
print("Received Notification")
// 3
completionHandler()
}
// 4
func userNotificationCenter(
_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler:
@escaping (UNNotificationPresentationOptions) -> Void
) {
// 5
print("Received Notification in Foreground")
// 6
completionHandler(.sound)
}
以下是代码概述:
- 1) 如果用户点击通知,则将调用此代理方法。
- 2) 收到通知时打印到调试器。
- 3) 告诉系统您已完成处理通知。
- 4) 此代理方法处理在应用程序处于前台时到达的通知。
- 5) 当您在前台收到通知时,打印到调试器。
- 6) 告诉系统您已经完成了对前台通知的处理,它应该只播放通知声音,而不显示通知。
添加此代码后,您现在就可以测试您的位置通知了。
Simulating User Movement
除非您有幸住在虚构的Swifty TakeOut
所在的Apple Campus
附近,否则您将需要模拟进入该地区。为此,您需要添加.gpx
文件。 GPX
或GPS Exchange Format
是一个XML
文件,用于描述航点,航迹和路线:
- 1) 转到
Project navigator
。 - 2) 右键单击
Swifty TakeOut
组。 - 3) 单击
New File…
。 - 4) 选择
GPX File
。 - 5) 将其命名为
SimulatedLocations
。 - 6) 单击
Create
。
添加SimulatedLocations.gpx
后,将其内容替换为以下内容:
<?xml version="1.0"?>
<gpx version="1.1" creator="Xcode">
<wpt lat="37.422155" lon="-122.134751">
<name>Apple Park</name>
<time>2021-01-23T14:00:00Z</time>
</wpt>
<wpt lat="37.33182000" lon="-122.03118000">
<name>Apple Campus</name>
<time>2021-01-23T14:00:05Z</time>
</wpt>
</gpx>
在这里,您添加了包含两个航点的XML
文件:Apple Park
和Apple Campus
。 您会注意到,每个航路点都有一个时间戳。 它们相距五秒钟,模拟了从Apple Park
到Apple Campus
的五秒钟旅程。
添加GPX
文件后,您可以开始模拟输入事件。
1. Connecting to a physical device
不幸的是,模拟UNLocationNotificationTrigger
在模拟器中似乎无法正常工作。 但是,它确实可以在连接Xcode
的物理设备上工作。 要执行本节中的步骤,您需要使用USB电缆将iOS设备连接到计算机。
在已连接的设备上,您会看到一条通知,询问您是否要信任计算机:
点击Trust
。
接下来,您需要为您的项目设置开发团队:
- 1) 在
Xcode
中,从Project navigator
中选择项目。 - 2) 单击
SwiftyTakeOut
应用程序target
- 3) 选择
Signing & Capabilities
选项卡。 - 4) 从
Signing
部分的Team
下拉控件中选择您的developer account
。
您已准备好在设备上安装该应用程序。 使用Scheme
菜单将active scheme
设置为所连接的设备:
构建并运行。
Xcode
将在您的设备上安装该应用程序,然后尝试将其打开。 当Xcode
尝试打开应用程序时,由于安全限制,它可能会显示错误:
要解决此错误,请在物理iOS设备上打开“设置”应用。 导航到 常规▸设备管理▸苹果开发:[帐户]:
点按Trust “Apple Development: [account]”
。
将会出现一个通知。 点击Trust
以确认。
一旦您的开发人员帐户受到信任并且您的应用程序已通过验证,Xcode就可以启动该应用程序了。
解锁iOS
设备后,从Xcode构建并运行。 该应用程序应在物理设备上打开:
oo! 您已准备好继续本教程的其余部分。
2. Simulating the Journey
现在,您可以尝试在添加的GPX
文件中模拟位置了。
在连接的iOS设备上构建并运行。 应用启动时,从菜单中选择一个项目,下订单并点击Yes
以得到通知:
通知将出现,询问权限:点按Allow While Using App
来定位,然后点按Allow
来通知。
接下来,切换回Xcode
,在Debug bar
中选择Location
图标,然后选择SimulatedLocations
:
注意:有时,
Location
图标没有出现在Debug bar
栏上。 如果发生这种情况,请停止调试并再次构建并运行该应用程序。
您的模拟旅程现在将开始。 经过约五秒钟后,您将在调试器中看到以下内容:
当您的应用程序位于前台并调用LocationManager.swift
中的userNotificationCenter(_:willPresent:withCompletionHandler :)
时,将打印输出。
接下来,要么在Xcode
中停止该应用程序,然后再次构建并运行该应用程序,要么停止模拟位置。 现在下新订单,然后点击Yes
以得到通知。 然后,在模拟用户旅程之前,通过锁定屏幕或转到主屏幕将应用程序置于后台。 应用程序进入后台后,模拟您的旅程。 现在,您会看到一条本地通知:
如果您点击通知,它将启动应用程序并将以下内容打印到调试器:
此处的区别在于,如果您的应用程序位于前台,则不会看到通知,但是如果您的应用程序位于后台,则会看到通知。
恭喜,您的应用程序现在会在您进入该地区时通知您! 但是您的旅程还没有结束!
在到达时打印到调试器很酷,但是如果还向您的用户发出alert
弹窗,那岂不是很好吗?
在下一节中,您将通过以下方式改善用户体验:
- 1) 当应用程序在前台时显示
alert
弹窗。 - 2) 通过点击通知启动应用程序时显示
alert
弹窗。
3. Handling a Geofence Entry Event
在此部分中,当您输入地理围栏时,如果应用程序位于前台,则会向用户显示alert
弹窗。 最后,在后台时,本地通知将唤醒应用程序。
4. Alerting the Kitchen
打开LocationManager.swift
并将以下内容添加到类顶部的storeRegion
下:
@Published var didArriveAtTakeout = false
当didArriveAtTakeout
更改时,所有引用该视图的视图都会得到通知,并可以执行代码以作为响应。 在您的应用中,当此值更改为true
时,用户将看到alert
。
接下来,仍在LocationManager.swift
中,使用以下代码更新userNotificationCenter(_:didReceive:withCompletionHandler :)
和userNotificationCenter(_:willPresent:withCompletionHandler :)
,并在每个方法中的completeHandler()
调用上方添加以下代码:
didArriveAtTakeout = true
在这里,由于您已经到达目的地,因此您正在更新值。
现在,当此值更改时,您将显示alert
。 为此,请打开ContentView.swift
并在.navigationViewStyle(StackNavigationViewStyle())
之后的正文中添加一个alert
修饰符:
.alert(isPresented: $locationManager.didArriveAtTakeout) {
Alert(
title: Text("Check In"),
message:
Text("""
You have arrived to collect your order.
Do you want to check in?
"""),
primaryButton: .default(Text("Yes")),
secondaryButton: .default(Text("No"))
)
}
每当didArriveAtTakeout
更改为true
时,便会执行此alert
。
在连接的iOS设备上构建并运行该应用程序,然后进行测试:
- 1) 下订单。
- 2) 使用调试器模拟位置。
现在,当您到达Swifty TakeOut
时,应用程序将要求用户签入:
接下来,尝试在下订单后将应用置于后台,然后模拟位置。
首先,您会看到一条横幅广告,上面写着您的食物即将准备就绪。当您点击该横幅时,该应用程序将启动。然后,您将看到允许您签入的alert
。
哇!恭喜!您的应用程序已经走了很长一段路。现在,您的应用程序用户会在收到订单时收到通知,从而可以在路边取货。
但是,等等,您需要解决一个小问题:如果您的应用处于暂停或终止状态,则不会通知您的用户签入。在下一部分中,您将解决此问题。
5. Getting Background Updates
要解决此问题,出于前面部分提到的隐私原因,将权限更改为Always
不是解决方案。但是可选择输入Background Modes
,使您可以继续使用When in Use
授权。
要启用此功能:
- 1) 从
Project navigator
中选择项目。 - 2) 单击
SwiftyTakeOut
应用程序target
。 - 3) 选择
Signing & Capabilities
选项卡。 - 4) 点击
+Capability
标签。 - 5) 选择
Background Modes
。 - 6) 在
Background Modes
部分下,启用Location updates
。
接下来,打开LocationManager.swift
并在return manager
语句上方的makeLocationManager()
中添加以下代码:
manager.allowsBackgroundLocationUpdates = true
此代码可让您的应用处于暂停状态时接收位置更新。 当应用程序在后台运行一段时间并且不再能够执行代码时,就会发生此状态。 启用此功能后,当设备进入地理围栏时,您的应用会收到通知,并唤醒它以处理任何事件。
注意:很遗憾,您无法从Xcode的终止状态测试您的应用。 要对此进行测试,您需要:
- 1) 选择附近的位置作为测试区域。
Apple Maps
或Google Maps
将为您提供location
属性所需的经度和纬度。- 2) 在连接的iOS设备上构建并运行该应用程序。
- 3) 在Xcode中停止该应用程序,然后从设备上断开USB电缆的连接。
- 4) 距离该地点至少
200
米。- 5) 打开应用并下订单。
- 6) 通过启动应用
App Switcher
并向上滑动来退出应用程序。- 7) 向您选择的位置走去。 当您靠近该位置时,应该会收到通知。
这意味着要出门,但从好的方面来说,您距离自己的日常目标只有几步之遥。
恭喜你! 您已经完成了本教程,并可以在用户到达Swifty TakeOut
时成功通知他们。
在本教程中,您学习了如何:
- 1) 设置并使用
Core Location
。 - 2) 注册地理围栏以进行区域监视。
- 3) 当应用程序在后台时,为您的应用程序启用位置更新。
- 4) 通知用户地理围栏进入事件。
- 5) 请求用户位置权限并设置消息文本。
此外,您了解了为什么不需要Always
位置权限。
如果您想了解有关地理围栏的更多信息,请阅读我们的Geofencing with Core Location教程和 Apple’s documentation on geofencing,以了解更多信息。
最后,如果您想了解有关在后台处理位置更新的更多信息,请查看Apple’s Handling Location Events in the Background article。
后记
本篇主要讲述了基于
UNLocationNotificationTrigger
的位置通知,感兴趣的给个赞或者关注~~~