创建 iOS 应用程序 - Amazon Location Service

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

创建 iOS 应用程序

按照以下步骤使用 Amazon Location Service 构建 iOS 应用程序。

GitHub 克隆项目文件。

AWS 账户准备就绪后,您可以生成 Amazon Location Service 资源。这些资源对于执行提供的代码段至关重要。

注意

如果尚未创建 AWS 账户,请创建 AWS 账户

首先,您需要创建 Amazon Cognito 身份池 ID,请按以下步骤进行操作:

  1. 在 AWS 控制台中,导航至 Amazon Cognito 服务,从左侧菜单中选择身份池,然后选择创建身份池

  2. 确保选中访客访问权限,然后按下一步继续。

  3. 接下来,创建一个新 IAM 角色或使用现有 IAM 角色。

  4. 输入身份池名称,并确保身份池可以访问您将在接下来的步骤中创建的地图和跟踪器的 Amazon Location (geo) 资源。

现在,您需要在 AWS Amazon Location 控制台中创建地图并设置地图样式,请按以下步骤操作:

  1. 导航至 Amazon Location 控制台的地图部分,然后选择创建地图,预览可用的地图样式。

  2. 为新地图资源提供名称描述。记录您分配给地图资源的名称,因为稍后本教程会使用该名称。

  3. 选择地图样式时,请考虑地图数据提供程序。有关更多详细信息,请参阅 AWS 服务条款的第 82 节。

  4. 接受 Amazon Location 条款和条件,然后选择创建地图。创建地图后,您可以通过放大、缩小或向任意方向平移来与地图进行交互。

使用 Amazon Location 控制台创建跟踪器

  1. 打开 Amazon Location Service 控制台

  2. 在左侧导航窗格中,选择跟踪器

  3. 选择创建跟踪器

  4. 填写所有必填字段。

  5. 位置筛选下,选择最适合您打算如何使用跟踪器资源的选项。如果未设置位置筛选,则默认设置为 TimeBased。有关更多信息,请参阅本指南中的“跟踪器”,以及《Amazon Location Service 跟踪器 API 参考》中的“PositionFiltering”。

  6. 选择创建跟踪器完成操作。

创建地理围栏集合时,您可以使用控制台、API 或 CLI。以下步骤将指导您完成每个选项。

使用 Amazon Location 控制台创建地理围栏集合:

  1. 打开 Amazon Location Service 控制台:https://console.aws.amazon.com/location/。

  2. 在左侧导航窗格中,选择“地理围栏集合”。

  3. 选择创建地理围栏集合。

  4. 为集合提供名称和描述。

  5. 根据以 CloudWatch 为目标的 EventBridge 规则,您可以创建一条可选的 EventBridge 规则,以开始对地理围栏事件做出反应。这使 Amazon Location 能够向 Amazon CloudWatch Logs 发布事件。

  6. 选择创建地理围栏集合。

使用 Amazon Location API 创建地理围栏集合:

使用 Amazon Location 地理围栏 API 中的 CreateGeofenceCollection 操作。以下示例使用 API 请求创建名为 GOECOLLECTION_NAME 的地理围栏集合。

POST /geofencing/v0/collections Content-type: application/json { "CollectionName": "GOECOLLECTION_NAME", "Description": "Geofence collection 1 for shopping center", "Tags": { "Tag1" : "Value1" } }

使用 AWS CLI 命令创建地理围栏集合:

使用 create-geofence-collection 命令。以下示例使用 AWS CLI 创建名为 GOECOLLECTION_NAME 的地理围栏集合。

aws location \ create-geofence-collection \ --collection-name "GOECOLLECTION_NAME" \ --description "Shopping center geofence collection" \ --tags Tag1=Value1  

要将跟踪器链接到地理围栏集合,您可以使用控制台、API 或 CLI。以下步骤将指导您完成每个选项。

使用 Amazon Location Service 控制台将跟踪器资源链接到地理围栏集合:

  1. 打开 Amazon Location 控制台。

  2. 在左侧导航窗格中,选择跟踪器

  3. 设备跟踪器下,选择目标跟踪器的名称链接。

  4. 链接的地理围栏集合下,选择链接地理围栏集合

  5. 链接的地理围栏集合窗口中,从下拉菜单中选择一个地理围栏集合。

  6. 选择链接

  7. 在您关联跟踪器资源后,它将处于活动状态。

使用 Amazon Location API 将跟踪器资源链接到地理围栏集合:

使用 Amazon Location 跟踪器 API 中的 AsssociateTrackerConsumer 操作。以下示例使用一个 API 请求,该请求使用其 Amazon 资源名称 (ARN) 将 ExampleTracker 与地理围栏集合链接起来。

POST /tracking/v0/trackers/ExampleTracker/consumers Content-type: application/json {    "ConsumerArn": "arn:aws:geo:us-west-2:123456789012:geofence-collection/GOECOLLECTION_NAME" }

使用 AWS CLI 命令将跟踪器资源链接到地理围栏集合:

使用 associate-tracker-consumer 命令。以下示例使用 AWS CLI 创建名为 GOECOLLECTION_NAME 的地理围栏集合。

aws location \ associate-tracker-consumer \ --consumer-arn "arn:aws:geo:us-west-2:123456789012:geofence-collection/GOECOLLECTION_NAME" \ --tracker-name "ExampleTracker"

创建 Lambda 函数:

要在 AWS IoT Core 和 Amazon Location Service 之间建立连接,您需要一个 AWS Lambda 函数来处理由 EventBridge CloudWatch 事件转发的消息。此函数将提取所有位置数据,将其格式化为 Amazon Location Service,然后通过 Amazon Location 跟踪器 API 提交。您可以通过 AWS Lambda 控制台创建此函数,也可以使用 AWS Command Line Interface (AWS CLI) 或 AWS Lambda API。要使用控制台创建 Lambda 函数,将位置更新发布到 Amazon Location,请执行以下操作:

  1. 通过 https://console.aws.amazon.com/lambda/ 打开 AWS Lambda 控制台。

  2. 从左侧导航窗格中,选择函数。

  3. 选择创建函数,并确保选择从头开始创作。

  4. 填写以下选框:

    • 函数名称

    • 对于运行时选项,选择“Node.js 16.x”。

  5. 选择“创建函数”。

  6. 选择 代码 选项卡以打开编辑器。

  7. 在 index.js 中使用以下内容覆盖占位符代码:

    const AWS = require('aws-sdk') const iot = new AWS.Iot(); exports.handler =  function(event) {   console.log("event===>>>", JSON.stringify(event));   var param = {     endpointType: "iot:Data-ATS"   };   iot.describeEndpoint(param, function(err, data) {     if (err) {       console.log("error===>>>", err, err.stack); // an error occurred     } else {       var endp = data['endpointAddress'];       const iotdata = new AWS.IotData({endpoint: endp});           const trackerEvent = event["detail"]["EventType"];       const src = event["source"];       const time = event["time"];       const gfId = event["detail"]["GeofenceId"];       const resources = event["resources"][0];         const splitResources = resources.split(".");         const geofenceCollection = splitResources[splitResources.length - 1];       const coordinates = event["detail"]["Position"];                                     const deviceId = event["detail"]["DeviceId"];       console.log("deviceId===>>>", deviceId);       const msg =  {           "trackerEventType" : trackerEvent,           "source" : src,           "eventTime" : time,           "geofenceId" : gfId,           "coordinates": coordinates,           "geofenceCollection": geofenceCollection         };       const params = {         topic: `${deviceId}/tracker`,         payload: JSON.stringify(msg),         qos: 0       };       iotdata.publish(params, function(err, data) {           if (err) {             console.log("error===>>>", err, err.stack); // an error occurred           } else {             console.log("Ladmbda triggered===>>>", trackerEvent);  // successful response           }       });     }   }); }
  8. 选择部署以保存您更新的函数。

  9. 选择配置选项卡。

  10. 在“触发器”部分中,单击“添加触发器”。

  11. 在“源”字段中选择 EventBridge (CloudWatch Events)。

  12. 选择“现有规则”单选选项。

  13. 输入类似这样的规则名称:“AmazonLocationMonitor-GEOFENCECOLLECTION_NAME”。

  14. 单击“添加”按钮。

  15. 此时,系统还会在“权限”选项卡中附加“基于资源的策略声明”

MQTT 测试客户端

  1. 打开 https://console.aws.amazon.com/iot/

  2. 在左侧导航窗格中,选择 MQTT 测试客户端。

  3. 您将看到标题为 MQTT 测试客户端的部分,您可以在其中配置 MQTT 连接。

  4. 配置必要的设置后,单击连接按钮,使用提供的参数建立与 MQTT 代理的连接。

  5. 记下端点值。

连接后,您可以使用 MQTT 测试客户端界面中提供的各个输入字段订阅 MQTT 主题或向主题发布消息。接下来,您将附加 MQTT 策略:

  1. 在左侧菜单的管理下,展开安全性选项,然后单击策略

  2. 单击创建策略按钮。

  3. 输入策略名称。

  4. 策略文档上,选择 JSON 选项卡。

  5. 复制粘贴下面显示的策略,但请务必使用您的 REGIONACCOUNT_ID 更新所有元素:

    { "Version": "2012-10-17", "Statement": [     {       "Action": [         "iot:Connect",         "iot:Publish",         "iot:Subscribe",         "iot:Receive"       ],       "Resource": [         "arn:aws:iot:REGION:ACCOUNT_ID:client/${cognito-identity.amazonaws.com:sub}",     "arn:aws:iot:REGION:ACCOUNT_ID:topic/${cognito-identity.amazonaws.com:sub}", "arn:aws:iot:REGION:ACCOUNT_ID:topicfilter/${cognito-identity.amazonaws.com:sub}/", "arn:aws:iot:REGION:ACCOUNT_ID:topic/${cognito-identity.amazonaws.com:sub}/tracker" ], "Effect": "Allow" } ] }
  6. 选择创建按钮完成操作。

为了设置示例代码,您必须安装以下工具:

  • Git

  • XCode 15.3 或更高版本

  • iOS 模拟器 16 或更高版本

使用以下步骤设置示例应用程序代码:

  1. 克隆以下 URL 中的 git 存储库:https://github.com/aws-geospatial/amazon-location-samples-ios/tree/main/tracking-with-geofence-notifications

  2. 打开 AWSLocationSampleApp.xcodeproj 项目文件。

  3. 等待程序包解析过程完成。

  4. 可选:在项目导航菜单上,将 ConfigTemplate.xcconfig 重命名为 Config.xcconfig 并填写以下值:

    IDENTITY_POOL_ID = `YOUR_IDENTITY_POOL_ID` MAP_NAME = `YOUR_MAP_NAME` TRACKER_NAME = `YOUR_TRACKER_NAME` WEBSOCKET_URL = `YOUR_MQTT_TEST_CLIENT_ENDPOINT` GEOFENCE_ARN = `YOUR_GEOFENCE_COLLECTION_NAME`

设置示例代码后,您现在可以在 iOS 模拟器或物理设备上运行该应用程序。

  1. 构建并运行应用程序。

  2. 该应用程序将要求您提供位置和通知权限。您需要允许这些权限。

  3. 点击“Cognito 配置”按钮。

  4. 如果您尚未填写“Config.xcconfig”文件中的值,则需要使用您之前在配置屏幕中创建的资源值填写该字段。

    IDENTITY_POOL_ID = `YOUR_IDENTITY_POOL_ID` MAP_NAME = `YOUR_MAP_NAME` TRACKER_NAME = `YOUR_TRACKER_NAME` WEBSOCKET_URL = `YOUR_MQTT_TEST_CLIENT_ENDPOINT` GEOFENCE_ARN = `YOUR_GEOFENCE_COLLECTION_NAME`
  5. 保存配置

  6. 现在,您将能够看到时间、距离和精度的筛选选项。根据需要使用这些选项。

  7. 转到应用程序中的“跟踪”选项卡,您将看到地图和“开始跟踪”按钮。

  8. 如果您已在模拟器上安装该应用程序,则可能需要模拟位置更改。可以在“功能”->“位置”菜单选项中完成此操作。例如,选择“功能”->“位置”->“高速公路驾车”。

  9. 点击“开始跟踪”按钮。此时,您应该会在地图上看到跟踪点。

  10. 该应用程序还会在后台跟踪位置。因此,当您在后台移动应用程序时,它会要求您提供在后台模式下继续跟踪的权限。

  11. 您可以通过点击“停止跟踪”按钮来停止跟踪。