Skip to content

Commit 1875a60

Browse files
author
niuweili
committed
docs(rum): 完善 SDK 合规指南文案与字段准确性
- 网络信息字段对照源码修正:移除"运营商名称/蜂窝制式",补充"上下行带宽/信号强度",并在"明确不收集"中显式声明不采集 SIM 运营商信息 - 延迟初始化补全各端写法(Android Kotlin/Java、iOS Swift/Objective-C),并引导至各端 SDK 接入文档 - 全文按监管文书口吻增补文案:委托处理关系、最小必要、权限最小化、告知—同意、数据全生命周期安全措施 - 隐私政策披露改写为更正式的告知要求与版本差异提示 - 联系我们改为首页同款 CardGroup(企微/控制台/邮件)
1 parent 98237ce commit 1875a60

2 files changed

Lines changed: 205 additions & 25 deletions

File tree

en/rum/others/compliance-guide.mdx

Lines changed: 102 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ After integrating the SDK, you (the app operator) must complete the following **
2121
</Card>
2222
</CardGroup>
2323

24+
Going live without completing these actions may cause your app to be flagged for "illegal collection and use of personal information" during app-store review or regulatory privacy-compliance scans. The rest of this guide explains the factual basis behind these two requirements and the concrete steps to implement them.
25+
2426
## Division of compliance responsibilities
2527

2628
The SDK runs as a third-party component embedded in your app. The responsibility boundary is as follows:
@@ -30,13 +32,15 @@ The SDK runs as a third-party component embedded in your app. The responsibility
3032
| Personal information processor | **You (the app operator)** | Disclose and obtain consent for your app's overall collection and use of personal information, including the integrated SDK |
3133
| Entrusted processor | **Beijing Flashcat Cloud Technology Co.,Ltd. (Flashduty)** | Process data only within the scope necessary to provide RUM services, never for purposes beyond what is agreed |
3234

35+
Under Article 21 of China's Personal Information Protection Law, you and Flashduty form an entrusted-processing relationship: you determine the purpose, means, and categories of personal information processed, while Flashduty only processes data as agreed, takes the necessary measures to safeguard it, does not use it beyond the agreed scope, and does not sub-entrust the processing. The rights and obligations of both parties are governed by the [Data protection agreement](/en/compliance/data-security).
36+
3337
## How the SDK processes personal information
3438

3539
The following is the factual basis for completing your privacy policy disclosure.
3640

3741
### Personal information collected
3842

39-
To support crash analysis, performance diagnostics, and user experience monitoring, the SDK automatically collects the following information. Apart from "app runtime information", all collection items can be disabled or masked via configuration (see [Data handling rules and commitments](#data-handling-rules-and-commitments)).
43+
Following the principle of data minimization, the SDK collects only information directly related to implementing crash analysis, performance diagnostics, and user experience monitoring, and does not collect personal information unrelated to these functions. The table below itemizes the information types, fields, purposes, and collection methods. Apart from "app runtime information", all collection items can be disabled or masked via configuration (see [Data handling rules and commitments](#data-handling-rules-and-commitments)).
4044

4145
| Information type | Specific fields | Purpose | Collection method | Can be disabled |
4246
| --- | --- | --- | --- | --- |
@@ -60,13 +64,15 @@ To minimize privacy impact, the SDK does **not** collect the following, and does
6064
- SIM carrier name / carrier ID (`simCarrierIdName` / `simCarrierId`), and telephony identifiers such as IMSI or SIM serial number.
6165
- Directly identifiable information such as phone numbers or ID numbers (unless you actively pass it in via the API — see the note below).
6266

67+
The SDK commits not to collect the above information through covert, misleading, or deceptive means, and does not read or transmit device data unrelated to monitoring.
68+
6369
<Note>
6470
If you actively pass personally identifiable information to the SDK via `setUserInfo` (user ID, name, email) or custom attributes, this information is reported along with events. Make sure such collection is disclosed in your privacy policy and consented to, and **avoid passing in sensitive personal information**.
6571
</Note>
6672

6773
### Device permissions requested
6874

69-
The SDK only requests the network permissions necessary for monitoring; it requests no sensitive permissions.
75+
Following the principle of least privilege, the SDK only requests the network permissions necessary for monitoring. It does not request sensitive permissions such as location, camera, microphone, contacts, phone, or storage, and does not present runtime sensitive-permission prompts to the user.
7076

7177
| Platform | Permission | Purpose | Required |
7278
| --- | --- | --- | --- |
@@ -76,6 +82,8 @@ The SDK only requests the network permissions necessary for monitoring; it reque
7682

7783
### Data handling rules and commitments
7884

85+
Beyond collecting data on a minimal, as-needed basis, the SDK provides the following data-handling mechanisms and commitments to help you further control the collection scope and reduce privacy risk:
86+
7987
<AccordionGroup>
8088
<Accordion title="Data minimization and de-identification">
8189
The SDK collects only the information necessary for monitoring. Sessions are identified by a random `session.id` and user identity is not tracked by default, anonymizing the data while preserving trend analysis.
@@ -106,7 +114,11 @@ This section details how to implement the [two key requirements](#two-key-requir
106114

107115
### 1. Privacy policy disclosure
108116

109-
Add the SDK to the "third-party SDK information sharing list" in your app's privacy policy. Reference text:
117+
Make sure the app you develop or operate has a privacy policy that meets regulatory requirements, and be sure to clearly inform end users that your app integrates third-party SDK services. In your privacy policy, you should state the purpose, methods, and scope of this SDK's collection and use of personal information, and indicate the SDK's developer/operator name (**Beijing Flashcat Cloud Technology Co.,Ltd.**) along with a link to its privacy policy.
118+
119+
On the app's login/registration page and on first launch, you should inform the user of the privacy policy in clear, plain language through simple, prominent, and easily accessible means such as a pop-up, a text link, or an attachment, so that the user gives a voluntary and explicit indication of consent on a fully informed basis. Where personal information is provided to a third party, you should also list it separately in the "third-party SDK information sharing list".
120+
121+
We provide the following disclosure text as a reference; you may inform users in text or table form (for the table form, refer directly to [Personal information collected](#personal-information-collected) above). Please note that the features and the fields required may differ across SDK versions depending on your choices and configuration; therefore, inform users fully and obtain their consent based on this guide and the actual behavior of the SDK as you integrate and use it. The reference text can be used directly — adjust it to match your actual integration:
110122

111123
<CodeGroup>
112124
```text
@@ -124,35 +136,92 @@ privacy policy: http://docs.flashcat.cloud/en/compliance/data-security
124136

125137
### 2. Deferred initialization
126138

127-
Do **not** call SDK initialization before the user accepts your privacy policy; or initialize with the `PENDING` state (collect but do not report), then switch to `GRANTED` after consent.
139+
To meet legal and regulatory requirements, make sure you **initialize the SDK only after the user has consented**. To prevent the SDK from starting to collect and use personal information before consent, the SDK provides a deferred-initialization API and a compliant initialization approach — see [Android SDK integration](/en/rum/sdk/android/sdk-integration) and [iOS SDK integration](/en/rum/sdk/ios/sdk-integration) for detailed instructions.
140+
141+
The specific requirements are:
142+
143+
1. **Authorize first, then initialize**: only call the initialization API after the user has read your app's privacy policy and granted authorization, at an appropriate time per your app's needs; if the user declines the privacy policy, you **must not call the initialization API**. When you initialize with the `PENDING` / `.pending` state, the call only completes initialization and buffers data locally — it **sends no personal information to the server** — and reporting starts only after the state is switched to granted.
144+
145+
2. **No permissions, collection, or reporting before consent**: do not dynamically request sensitive device permissions involving personal information before the user accepts the privacy policy; do not collect or report personal information before consent (pay special attention to **Android ID, OAID, IMEI, MAC address, hardware serial number, and the installed-app list**). The SDK does not collect these identifiers by default — see [Information explicitly not collected](#information-explicitly-not-collected).
128146

129147
| Consent state | SDK behavior | Scenario |
130148
| --- | --- | --- |
131-
| `GRANTED` | Collect and report | The user has consented |
132-
| `NOT_GRANTED` | Collect no data | The user declined or withdrew |
133-
| `PENDING` | Collect but defer reporting until the state changes to `GRANTED` | Awaiting user confirmation |
149+
| Android `GRANTED` / iOS `.granted` | Collect and report | The user has consented |
150+
| Android `NOT_GRANTED` / iOS `.notGranted` | Collect no data | The user declined or withdrew |
151+
| Android `PENDING` / iOS `.pending` | Collect but defer reporting until the state is switched to granted | Awaiting user confirmation |
152+
153+
The following shows the "deferred initialization + consent change" code for each platform:
134154

135155
<CodeGroup>
136156
```kotlin Android (Kotlin)
137157
import com.datadog.android.Datadog
138158
import com.datadog.android.privacy.TrackingConsent
139159

140-
// Before consent: do not initialize, or initialize with PENDING
160+
// Before consent: initialize with PENDING (collect but do not report)
141161
Datadog.initialize(this, configuration, TrackingConsent.PENDING)
142162

143-
// After the user taps "Agree" in the privacy dialog:
163+
// After consent: start reporting
144164
Datadog.setTrackingConsent(TrackingConsent.GRANTED)
145165

146-
// When the user withdraws consent in settings:
166+
// On withdrawal: stop collecting
147167
Datadog.setTrackingConsent(TrackingConsent.NOT_GRANTED)
148168
```
169+
170+
```java Android (Java)
171+
import com.datadog.android.Datadog;
172+
import com.datadog.android.privacy.TrackingConsent;
173+
174+
// Before consent: initialize with PENDING (collect but do not report)
175+
Datadog.initialize(this, configuration, TrackingConsent.PENDING);
176+
177+
// After consent: start reporting
178+
Datadog.setTrackingConsent(TrackingConsent.GRANTED);
179+
180+
// On withdrawal: stop collecting
181+
Datadog.setTrackingConsent(TrackingConsent.NOT_GRANTED);
182+
```
183+
184+
```swift iOS (Swift)
185+
import DatadogCore
186+
187+
// Before consent: initialize with .pending (collect but do not report)
188+
Datadog.initialize(with: configuration, trackingConsent: .pending)
189+
190+
// After consent: start reporting
191+
Datadog.set(trackingConsent: .granted)
192+
193+
// On withdrawal: stop collecting
194+
Datadog.set(trackingConsent: .notGranted)
195+
```
196+
197+
```objective-c iOS (Objective-C)
198+
@import DatadogObjc;
199+
200+
// For initialization, see the iOS SDK integration doc; change consent as follows:
201+
// After consent: start reporting
202+
[DDDatadog setWithTrackingConsent:DDTrackingConsentGranted];
203+
204+
// On withdrawal: stop collecting
205+
[DDDatadog setWithTrackingConsent:DDTrackingConsentNotGranted];
206+
```
149207
</CodeGroup>
150208
151-
For the full consent-state usage per platform, see [Android advanced configuration · User tracking consent](/en/rum/sdk/android/advanced-config#user-tracking-consent) and the corresponding docs.
209+
<Note>
210+
The snippets above show only the minimal code needed for deferred initialization. For the full initialization parameters, integration steps, and consent APIs per platform, see the corresponding docs:
211+
- Android: [SDK integration](/en/rum/sdk/android/sdk-integration) · [Advanced configuration · User tracking consent](/en/rum/sdk/android/advanced-config#user-tracking-consent)
212+
- iOS: [SDK integration](/en/rum/sdk/ios/sdk-integration) · [Advanced configuration](/en/rum/sdk/ios/advanced-config)
213+
</Note>
152214
153215
## Data storage and security
154216
155-
Data collected by the SDK is reported only to the Flashduty server you configure and is used solely to provide monitoring services to you. It is **not shared with any other third party** and is **not used for** advertising, user profiling, or cross-app tracking. Data is stored on compliant servers within mainland China, transmitted over HTTPS/TLS, and protected by access control and auditing. For the full security measures, retention periods, and cross-border transfer terms, see the [Data protection agreement](/en/compliance/data-security) and the RUM [Data security](/en/rum/others/data-security) doc.
217+
Data collected by the SDK is reported only to the Flashduty server you configure and is used solely to provide monitoring services to you. It is **not shared with any other third party** and is **not used for** advertising, user profiling, or cross-app tracking. Throughout the data lifecycle, Flashduty applies the following safeguards:
218+
219+
- **Transport security**: all reported data is transmitted over HTTPS/TLS.
220+
- **Storage security**: data is stored on compliant servers within mainland China, with encryption, access control, and security auditing.
221+
- **Retention and deletion**: data is stored for the agreed retention period and deleted or anonymized after expiry.
222+
- **Cross-border transfer**: no cross-border transfer occurs without your explicit consent or unless otherwise required by laws and regulations.
223+
224+
For the full security measures, retention periods, and cross-border transfer terms, see the [Data protection agreement](/en/compliance/data-security) and the RUM [Data security](/en/rum/others/data-security) doc.
156225
157226
## Compliant integration checklist
158227
@@ -173,3 +242,24 @@ Data collected by the SDK is reported only to the Flashduty server you configure
173242
Review `setUserInfo` and custom attributes to ensure no sensitive personal information is passed to the SDK.
174243
</Step>
175244
</Steps>
245+
246+
## Contact us
247+
248+
This SDK is provided by **Beijing Flashcat Cloud Technology Co.,Ltd.** If you have any questions, feedback, or complaints about how this SDK processes personal information, or if you need to exercise your data-subject rights, you can contact us via:
249+
250+
<CardGroup cols={2}>
251+
<Card title="Technical Support" icon="headset">
252+
Scan to add our WeCom for one-on-one technical support
253+
<img src="https://api.apifox.com/api/v1/projects/4386769/resources/447591/image-preview" alt="Technical Support WeCom" width="100" />
254+
</Card>
255+
<Card title="Business Inquiries" icon="handshake">
256+
Scan to add our business manager on WeCom
257+
<img src="https://api.apifox.com/api/v1/projects/4386769/resources/447590/image-preview" alt="Business Manager WeCom" width="100" />
258+
</Card>
259+
<Card title="Console Feedback" icon="comment" href="https://console.flashcat.cloud">
260+
Sign in to the console and submit feedback in the bottom left corner
261+
</Card>
262+
<Card title="Email" icon="envelope" href="mailto:support@flashcat.cloud">
263+
support@flashcat.cloud
264+
</Card>
265+
</CardGroup>

0 commit comments

Comments
 (0)