# 数据存储与上报

> 来源：https://help.gravity-engine.com/docs/client-sdk/ios/advanced/storage-and-upload
> 说明 Gravity Engine iOS SDK 的本地缓存与上报机制，以及手动上报、关键事件和缓存阈值等触发方式。





## 1. 概述 [#1-概述]

为保证数据采集的可靠性和优化设备性能，GravityEngine SDK 在 **iOS 平台** 上采用"先存储，后上报"的策略。所有事件触发后首先在本地持久化存储，待服务器确认上报成功后方才删除对应的本地数据。

## 2. 上报触发条件 [#2-上报触发条件]

### 网络类型控制 [#网络类型控制]

您可以根据业务需求设置数据上报的网络环境：

<Tabs items="['Objective-C', 'Swift']">
  <Tab value="Objective-C">
    ```objective-c
    [[GravityEngineSDK sharedInstance] setNetworkType:GENetworkTypeALL];
    ```
  </Tab>

  <Tab value="Swift">
    ```swift
    instance?.setNetworkType(.all)
    ```
  </Tab>
</Tabs>

**可选配置：**

* **GENetworkTypeALL/GENetworkTypeDefault**：所有网络类型（移动网络、WiFi）下均上报
* **GENetworkTypeOnlyWIFI**：仅在 WiFi 网络环境下上报（不推荐开启，可能会导致事件上报延迟或漏报）

### 手动立即上报 [#手动立即上报]

支持主动触发数据上报，适用于需要确保数据及时上报的场景：

<Tabs items="['Objective-C', 'Swift']">
  <Tab value="Objective-C">
    ```objective-c
    [instance flush];
    ```
  </Tab>

  <Tab value="Swift">
    ```swift
    instance?.flush()
    ```
  </Tab>
</Tabs>

### 关键事件触发上报 [#关键事件触发上报]

当以下重要业务事件发生时，SDK 会自动触发全量数据上报：

**应用生命周期事件：**

* 应用启动（`$AppStart`）
* 应用进入后台（`$AppEnd`）

**核心业务事件：**

* 付费事件（`$PayEvent`）
* 用户提现（`$UserWithdraw`）
* 广告展示（`$AdShow`）
* 用户注册（`$AppRegister`）

### 缓存数量触发上报 [#缓存数量触发上报]

为防止本地数据积压，SDK 会在缓存事件达到 30 条时自动触发上报：

**上报限制：** 单次 API 请求最多上传 50 条事件，超出的数据会自动分批上报。

### 定时触发上报 [#定时触发上报]

每 30 秒自动检查一次，如存在缓存数据立即触发上报。

## 3. 数据存储管理 [#3-数据存储管理]

### 存储容量配置 [#存储容量配置]

SDK 提供灵活的存储空间管理机制，防止本地数据过度占用设备存储。

#### **默认配置** [#默认配置]

* 最大存储事件数：10,000 条
* 最低保障存储：5,000 条（防止设置过小影响数据可靠性）

**存储清理策略：** 当数据量超过上限时，系统会自动清理最早的 100 条历史数据。

#### **自定义配置** [#自定义配置]

> **注意：如设置值低于 5,000，系统将自动调整为 5000 以保证基本功能**

在 `info.plist` 文件中配置：

```xml
<key>GEConfigInfo</key>
	<dict>
		<key>maxNumEvents</key>
		<string>1000</string>
	</dict>
```

### 数据有效期管理 [#数据有效期管理]

为确保数据时效性，SDK 会定期清理过期数据。

#### **默认配置** [#默认配置-1]

* 数据有效期：10 天
* 清理时机：每次应用启动时自动检测并清理

#### **自定义配置** [#自定义配置-1]

> **有效期设置范围：0-10 天，超出范围的设置将自动调整为 10 天**

在 `info.plist` 文件中配置：

```xml
<key>GEConfigInfo</key>
	<dict>
		<key>expirationDays</key>
		<string>10</string>
	</dict>
```
