Featured image of post uni-app怎么给ios添加隐私清单

uni-app怎么给ios添加隐私清单

uni-app 最近在问答社区发布公告1, 可以看到关于 App Store 提交的隐私更新,上架必须包含隐私清单

Apple 公告 2: 需要合理的理由列举你要使用的 API 和第三方 SDK 权限说明

什么情况需要隐私清单

DCloud 这边通常内置的 SDK 情况,你无需额外配置隐私清单,uni-app/uni-app x 框架中涉及隐私清单的功能模块 DCloud 会根据应用配置自动生成,更新到 HBuilderX 到最新版本重新提交云端打包即可

在以下情况可能需要你补充隐私清单:

  • 应用代码中包含并非三方 SDK 提供的收集用户信息相关的功能,比如:获取用户联系方式,信用卡信息,敏感信息、健康信息、浏览历史记录等等
  • 使用的原生语言插件包括三方的或uts插件未支持隐私清单,且提交审核时因隐私清单相关问题被拒

加入隐私清单

需要在项目根目录3中,在nativeResources/ios目录下搞个文件PrivacyInfo.xcprivacy 加入隐私清单
初始化成下面这样,不用担心看不懂,接下里会介绍这些分别是什么

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>NSPrivacyCollectedDataTypes</key>
  <array>
  </array>
  <key>NSPrivacyTrackingDomains</key>
  <array/>
  <key>NSPrivacyTracking</key>
  <false/>
  <key>NSPrivacyAccessedAPITypes</key>
  <array>
  </array>
</dict>
</plist>

隐私清单文件中键值对说明

参数名说明
NSPrivacyTracking布尔值,指示您的应用程序或第三方 SDK 是否使用应用程序跟踪透明度框架下定义的数据进行跟踪
NSPrivacyTrackingDomains一组字符串,列出您的应用程序或第三方 SDK 连接到的参与跟踪的互联网域。如果用户未通过应用程序跟踪透明度框架授予跟踪权限,则对这些域的网络请求将失败,您的应用程序将收到错误. 如果将 NSPrivacyTracking 设置为 true,则需要在 NSPrivaceTrackingDomains 中至少提供一个 internet 域
NSPrivacyCollectedDataTypes隐私数据使用描述,用于描述应用程序或第三方 SDK 隐私数据采集的数据类型。有关要在字典中使用的键和值的信息,请参阅 data use in privacy manifests4
NSPrivacyAccessedAPITypes必要理由 API,使用了苹果需要说明原因的 API 时需要填写,具体 API 的列表和原因请参阅 use of required reason API5

NSPrivacyTrackingNSPrivacyTrackingDomains 有需要再更改,一般是不用动的
重点是 NSPrivacyAccessedAPITypesNSPrivacyCollectedDataTypes,如果你看过 ios 官方的文档4,官方的数据是定死的,你只需要填写对应参数和使用原因

NSPrivacyCollectedDataTypes

NSPrivacyCollectedDataTypes 属性是数组你需要在相邻的<array></array>中填写应用或 SDK 收集的数据类型,详细可填写的内容可以看参考 44,需要填写官方声明的数据类型,举个例子,注意复制的时候请把注释删除

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>NSPrivacyCollectedDataTypes</key>
  <array>
    <dict>
      <!-- 数据类型 -->
      <key>NSPrivacyCollectedDataType</key>
      <!-- 数据类型是手机号码,更多详见官方枚举的内容填写  -->
      <string>NSPrivacyCollectedDataTypePhoneNumber</string>
      <key>NSPrivacyCollectedDataTypeLinked</key>
      <false/>
      <key>NSPrivacyCollectedDataTypeTracking</key>
      <false/>
      <!-- 收集数据的原因 -->
      <key>NSPrivacyCollectedDataTypePurposes</key>
      <!-- 理由,详见官方枚举的内容填写 -->
      <array>
        <!-- 理由是应用程序内功能 -->
        <string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
      </array>
    </dict>
    <dict>
      <!-- 数据类型 -->
      <key>NSPrivacyCollectedDataType</key>
      <!-- 数据类型是图片和视频,更多详见官方枚举的内容填写  -->
      <string>NSPrivacyCollectedDataTypePhotosorVideos</string>
      <key>NSPrivacyCollectedDataTypeLinked</key>
      <false/>
      <key>NSPrivacyCollectedDataTypeTracking</key>
      <false/>
      <!-- 收集数据的原因 -->
      <key>NSPrivacyCollectedDataTypePurposes</key>
      <!-- 理由,详见官方枚举的内容填写 -->
      <array>
        <!-- 理由是个性化推荐 -->
        <string>NSPrivacyCollectedDataTypePurposeProductPersonalization</string>
        <!-- 理由是应用程序内功能 -->
        <string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
      </array>
    </dict>
  </array>
  <key>NSPrivacyTrackingDomains</key>
  <array/>
  <key>NSPrivacyTracking</key>
  <false/>
  <key>NSPrivacyAccessedAPITypes</key>
  <array>
  </array>
</dict>
</plist>

NSPrivacyCollectedDataTypes不止举例那两项,根据自己的应用程序添加对应权限数据类型说明

NSPrivacyAccessedAPITypes

同理NSPrivacyAccessedAPITypes 也是一样的,详细可填写的内容可以看参考 55,举个例子

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>NSPrivacyCollectedDataTypes</key>
  <array>
    <!-- 为了更清楚查NSPrivacyAccessedAPITypes,看此处省略... -->
  </array>
  <key>NSPrivacyTrackingDomains</key>
  <array/>
  <key>NSPrivacyTracking</key>
  <false/>
  <key>NSPrivacyAccessedAPITypes</key>
  <array>
    <dict>
      <!-- API类型 -->
      <key>NSPrivacyAccessedAPIType</key>
      <!-- API类型是 用户默认信息 -->
      <string>NSPrivacyAccessedAPICategoryUserDefaults</string>
      <!-- 使用原因 -->
      <key>NSPrivacyAccessedAPITypeReasons</key>
      <!-- 列举 -->
      <array>
        <!-- 使用原因 CA92.1理由 -->
        <string>CA92.1</string>
        <!-- 使用原因 1C8F.1理由 -->
        <string>1C8F.1</string>
      </array>
    </dict>
    <dict>
      <!-- API类型 -->
      <key>NSPrivacyAccessedAPIType</key>
      <!-- API类型是 监听键盘 -->
      <string>NSPrivacyAccessedAPICategoryActiveKeyboards</string>
      <!-- 使用原因 -->
      <key>NSPrivacyAccessedAPITypeReasons</key>
      <!-- 列举 -->
      <array>
        <!-- 使用原因 CA92.1理由 -->
        <string>CA92.1</string>
      </array>
    </dict>
  </array>
</dict>
</plist>

Dcloud 插件市场三方插件适配隐私清单

我司使用的 Dcloud 插件市场很多三方 SDK 其实是没有隐私清单的

三方作者情况

我也联系了多个插件市场三方插件作者他们基本都是差不多的情况,没有优先适配,部分公司开发的插件市场 SDK 也是一样,并不是小作者才有

qq聊天截图1 qq聊天截图2 qq聊天截图3

解决办法

怎么找出他们隐私清单呢,怎么找到合适的 api 和描述呢

  • 直接问作者
  • 让作者适配
  • 如果作者适配的是三方的 sdk 转接过来的(如某厂的活体认证、一键登录、消息推送这些),可以问作者要原生 ios SDK 出处,里面解包出来搜索找到PrivacyInfo.xcprivacy

上面的方法都不行的话,只能看着插件预估需要使用的 api 试试审核,最笨方法不一定有效果,最好的还是让作者给你一份隐私清单

总结

由此可见 Dcloud 插件市场很多三方 SDK 没有隐私清单的

多去尝试和作者沟通适配,找到合适的 api 描述,然后提交审核

祝大家 Ios 应用商城 App 早日通过

参考