CoreLocation框架详细解析(十八) —— 基于UNLocationNotificationTrigger的位置通知(一)

版本记录

版本号 时间
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 managerlazy属性会延迟初始化,直到首次使用为止。
  • 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 UseSwifty 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.swiftvalidateLocationAuthorizationStatus()内部,定位到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, bodysound属性。
  • 3) 创建一个位置触发条件,使该条件出现。 当您进入storeRegion时,将触发此事件。
  • 4) 配置UNNotificationRequest对象以请求带有notificationContenttrigger的通知。 在此请求中设置了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文件。 GPXGPS 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 ParkApple Campus。 您会注意到,每个航路点都有一个时间戳。 它们相距五秒钟,模拟了从Apple ParkApple 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 MapsGoogle 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的位置通知,感兴趣的给个赞或者关注~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容