> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 基于位置的消息

> 按国家、GPS 坐标或地理围栏细分用户，并使用 OneSignal 发送位置触发的推送通知。

根据用户所在位置向其发送消息。OneSignal 可以按国家、GPS 坐标或自定义标签对用户进行细分，让您基于物理位置创建及时、相关的外联。

当用户与您的应用交互且位置跟踪已启用时，他们的坐标会定期更新（应用使用期间大约每 5 分钟一次），可以通过[旅程](./journeys-overview)或任何消息创建工具用来发送消息。

<Warning>
  **OneSignal 默认不跟踪 GPS 位置。** SDK 仅在满足以下三个条件时才收集经纬度：

  1. 您的应用具有正确的位置权限和依赖项。
  2. 您的应用明确启用与 OneSignal 的共享。没有此设置，您的应用可能会收集位置数据，但不会与 OneSignal 共享。
  3. 用户在系统提示中授予位置权限。

  请参阅[位置跟踪设置](#位置跟踪设置)进行配置。有关 SDK 位置行为的背景信息，请参阅 [You're in Control: How Location Actually Works in OneSignal's SDK](https://onesignal.com/blog/youre-in-control-how-location-actually-works-in-onesignals-sdk/)。
</Warning>

***

## 按国家定向

国家根据设备的 IP 地址确定，每次用户打开您的应用时自动更新。值使用 ISO 3166-1 Alpha-2 两位字母国家代码（例如，`US`、`GB`、`CA`）。

使用[细分](./segmentation)中的 `country` 字段或[创建细分 API](/reference/create-segments) 的 `filters` 参数按国家定向：

```json theme={null}
"filters": [
  { "field": "country", "relation": "=", "value": "US" }
]
```

***

## 按位置定向（经度、纬度和半径）

如果您的移动应用收集 GPS 位置并与 OneSignal 共享，SDK 大约每 5 分钟更新一次用户的坐标（基于权限和系统规则）。如果应用被强制停止，在用户再次打开之前无法跟踪位置。

### 位置跟踪设置

位置跟踪在您的移动应用代码中配置，而不是在 OneSignal 控制台中配置。您的应用至少需要：

* 为 iOS 和 Android 添加原生位置权限和依赖项。
* 启用 `Location.isShared` 标志以与 OneSignal 共享坐标。
* 请求系统位置权限，或使用[应用内消息作为软预提示](./location-opt-in-prompt)以获得更高的选择率。

<Card title="移动 SDK 位置参考" icon="location-dot" href="./mobile-sdk-reference#location">
  iOS、Android、React Native、Flutter、Unity 和 Cordova/Ionic 的完整设置和各平台代码。
</Card>

<Check>
  启用位置跟踪后，您可以使用 `location` 过滤器通过我们的 API 创建细分或发送消息。
</Check>

<Frame caption="细分中的位置过滤器">
  <img src="https://mintcdn.com/onesignal/3zq1PvSaqvUE2bIx/images/docs/3109479-Screen_Shot_2021-02-09_at_8.28.43_AM.png?fit=max&auto=format&n=3zq1PvSaqvUE2bIx&q=85&s=13644c44bf75d4907e7fbda8641ae1bd" alt="OneSignal segment builder showing the location radius filter with latitude, longitude, and radius fields" width="1440" height="938" data-path="images/docs/3109479-Screen_Shot_2021-02-09_at_8.28.43_AM.png" />
</Frame>

***

## 网页推送经纬度跟踪

OneSignal **不收集**网页的经纬度数据。但是，您可以使用标签从您的网页应用设置位置，或使用[更新用户 API](/reference/update-user) 从您的服务器设置位置。

**打标签示例：**

1. 使用浏览器的 [Geolocation API](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API) 在您的网页应用中请求位置访问。
2. 使用 JavaScript 检测用户的坐标。
3. 使用[标签](./add-user-data-tags)将这些坐标发送到 OneSignal。

```javascript theme={null}
OneSignal.User.addTags({
  lat: "37.160",
  long: "-117.773"
});
```

一旦设置了标签，通过组合标签范围过滤器创建地理围栏细分。例如，要定向边界框 `37° ≤ lat < 38°` 和 `-118° ≤ long < -117°` 内的用户，在细分构建器中添加以下四个过滤器：

* 标签 `lat` 大于 `37`
* 标签 `lat` 小于 `38`
* 标签 `long` 大于 `-118`
* 标签 `long` 小于 `-117`

***

## 按城市或自定义位置定向

OneSignal 不会原生检测城市或区号。要按城市或自定义位置定向：

* 让用户在表单中输入城市或地区。
* 或使用 JavaScript 与反向地理编码（如 Google Maps API）从坐标推断城市。
* 将城市名称作为[数据标签](./add-user-data-tags)发送。

```javascript theme={null}
OneSignal.User.addTag("city", "San Francisco");
```

***

## 常见问题

### 位置跟踪在网页上有效吗？

不能原生实现。OneSignal 的 Web SDK 不收集 GPS 坐标。要在网页推送中使用基于位置的细分，请自行从浏览器的 [Geolocation API](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API) 收集坐标并将其作为[标签](./add-user-data-tags)发送到 OneSignal，然后在这些标签上构建范围过滤器细分。请参阅[网页推送经纬度跟踪](#网页推送经纬度跟踪)。

### 为什么我的应用没有跟踪位置？

验证所有三个设置条件是否满足：您的应用已安装正确的位置权限和依赖项，`Location.isShared` 已设置为 `true`，且用户已在系统提示中授予位置权限。有关各平台设置和常见修复（包括 Android `play-services-location` 依赖项）的详情，请参阅[移动 SDK 位置参考](./mobile-sdk-reference#location)。

### SDK 多久更新一次位置？

启用位置跟踪后，SDK 在应用使用期间大约每 5 分钟更新一次坐标。如果应用被强制停止，位置更新将暂停，直到用户再次打开应用。

### 我可以按城市定向用户吗？

不能原生实现。OneSignal 跟踪国家（通过 IP 地址）和 GPS 坐标（通过 SDK），但不跟踪城市或区号。您可以使用反向地理编码服务从坐标推断城市并将其存储为标签。请参阅[按城市或自定义位置定向](#按城市或自定义位置定向)。

***

## 相关页面

<Columns cols={2}>
  <Card title="位置选择提示" icon="message" href="./location-opt-in-prompt">
    在请求原生位置权限之前，使用应用内消息作为软预提示。
  </Card>

  <Card title="细分" icon="users" href="./segmentation">
    使用位置过滤器、标签和用户属性创建受众细分。
  </Card>
</Columns>
