隐私政策合规指引

一、引言

为保障终端用户的个人信息权益,确保您的应用程序符合《中华人民共和国网络安全法》、《中华人民共和国数据安全法》、《中华人民共和国个人信息保护法》、《信息安全技术 个人信息安全规范》以及相关法律法规和平台规则(如苹果App Store、国内各大应用商店的隐私合规要求),请您在集成和使用本广告SDK前,务必仔细阅读并遵守本说明。 本说明旨在明确我司SDK处理个人信息的行为,并指导您如何履行作为App开发者的合规义务。

二、SDK功能与获取的个人信息

1. SDK功能描述

本SDK为您的App提供广告展示与变现能力,包括但不限于:开屏广告、横幅广告、插屏广告、信息流广告、激励视频广告的请求、展示、点击监测以及收益管理。

2. SDK可能收集的个人信息类型

为提供上述服务、优化广告效果及反作弊,SDK在获得用户同意后可能会收集以下信息:

主体公司 SDK名称 涉及个人信息 收集方式 收集用户信息的用途说明 隐私政策链接
杭州互裕科技有限公司 RichMob Android SDK

必选信息:设备品牌、名称、型号、系统版本、网络类型、IP、UA

可选信息:设备标识符OAID、IMEI、IMSI,Android ID、MAC地址、WIFI SSID/BSSID、硬件序列号、MEID、ICCID、IDFA、IDFV、CAID

SDK 自行采集

基于用户设备信息进行广告投放与监测归因

通过崩溃信息,以此来优化代码缺陷,最大程度减少App崩溃

通过收集SDK运行过程中性能数据,以优化SDK的性能

统计广告数据,以用于广告主统计投放结果。包括不限于:请求、展示 、点击 、转化等,用于广告主统计投放结果

https://file.ssp.richmob.cn/privacy/privacy-policy.html

必选信息:屏幕方向、高宽、分辨率、系统更新时间、开机时间、运行内存、运营商

可选信息:传感器信息、总磁盘大小、剩余磁盘大小

必选信息:开发者应用名、应用版本号、应用包名

【可选】第三方开发者可以选择是否授权本SDK收集如下信息:应用安装列表

可选信息:地理位置信息

必选信息:崩溃日志、性能数据

RichMob iOS SDK

必选信息:设备品牌、名称、型号、系统版本、网络类型、IP、UA

可选信息:设备标识符IDFA、IDFV、CAID、WIFI SSID/BSSID

SDK 自行采集

基于用户设备信息进行广告投放与监测归因

通过崩溃信息,以此来优化代码缺陷,最大程度减少App崩溃

通过收集SDK运行过程中性能数据,以优化SDK的性能

统计广告数据,以用于广告主统计投放结果。包括不限于:请求、展示 、点击 、转化等,用于广告主统计投放结果

必选信息:屏幕方向、高宽、分辨率、系统更新时间、开机时间、运行内存

可选信息:传感器信息、总磁盘大小、剩余磁盘大小

必选信息:开发者应用名、应用版本号、应用包名

【可选】第三方开发者可以选择是否授权本SDK收集如下信息:应用安装列表

可选信息:地理位置信息

我们严格遵守“最小必要”原则(1)实际收集的个人信息类型不得超出隐私政策所述范围;

(2)App不应收集与业务功能无任何关系的个人信息;(3)在用户明确拒绝后不得继续频繁索要权限、打扰用户;(4)App更新升级后,不应更改原有的系统权限设置。

三、App开发者合规要求

1、隐私政策披露

隐私政策制定与展示:APP必须制定一份独立的《隐私政策》,并确保在产品界面中显著展示。隐私政策应单独成文,不应与用户协议或用户说明等文件合并。政策中需明确收集使用个人信息的目的、方式和范围,且链接应正常有效,便于用户访问和阅读。

信息收集和使用明示:APP应清晰列举每项业务功能及其所收集的个人信息类型,避免使用“等”或“例如”等模糊表述,特别是对敏感信息应加以显著标识。若APP通过第三方代码或插件收集信息,需通过弹窗等方式告知用户,并明确说明信息的传输至第三方。

用户自主同意:APP在收集个人信息前,必须获得用户的自主选择同意。用户应能自主选择同意或拒绝授权,不同意的情况下,仅会影响相关的功能或服务。APP不得将多个功能捆绑在一起,要求用户一并同意。

信息处理与用户权益保障:APP在隐私政策中需公开个人信息的处理规则,包括运营者信息、数据存储和超期处理方式、使用规则、信息出境情况、数据安全保护措施、外部共享规则、用户权益保障机制、申诉渠道等。同时,APP不得在协议中使用免除自身责任或加重用户责任的条款。

2、SDK 相关系统权限申请

为实现本SDK产品的相应功能,我们可能通过第三方开发者的应用申请开启终端用户设备操作系统的特定权限。具体的使用场景和申请目的如下:

系统平台

权限

功能说明

使用场景和目的

申请时机

Android

READ_PHONE_STATE

【可选】获取设备标识,如IMEI

广告投放策略、广告归因、反作弊

开发者在调用需要该权限的SDK功能时进行调用。例如初始化、进行广告请求、监测归因。

INTERNET

【必选】网络权限,用于SDK实现和服务器通信

网络通信,如广告请求、数据上报等

网络通信

ACCESS_COARSE_LOCATION

【可选】获取粗略地理位置信息

广告投放策略及广告归因

开发者在调用需要该权限的SDK功能时进行调用。例如进行广告请求、监测归因。

ACCESS_FINE_LOCATION

【可选】获取精确地理位置信息

广告投放策略及广告归因

开发者在调用需要该权限的SDK功能时进行调用。例如进行广告请求、监测归因。

ACCESS_NETWORK_STATE

【可选】获取网络状态

检查网络状态,确保广告请求链路连通

开发者在调用需要该权限的SDK功能时进行调用,例如进行广告请求。

ACCESS_WIFI_STATE

【可选】获取 Wi-Fi 网络的连接信息及其状态

检查网络状态,确保广告请求链路连通

开发者在调用需要该权限的SDK功能时进行调用,例如进行广告请求。

READ_EXTERNAL_STORAGE

【可选】读取应用程序外部存储

应用下载、广告投放及广告素材存储

开发者在调用需要该权限的SDK功能时进行调用。例如下载App包体等功能。

WRITE_EXTERNAL_STORAGE

【可选】写入应用程序外部存储

应用下载、广告投放及广告素材存储

开发者在调用需要该权限的SDK功能时进行调用。例如下载App包体等功能。

VIBRATE

【可选】允许应用控制马达振动

触发振动。为广告交互提供反馈

开发者在调用需要该权限的SDK功能时进行调用,例如请求广告、监测归因与反作弊。

QUERY_ALL_PACKAGES

【可选】获取应用软件列表

广告投放及反作弊

开发者在调用需要该权限的SDK功能且用户已授权相应权限时。例如根据应用软件列表情况进行广告投放、广告反作弊。

REQUEST_INSTALL_PACKAGES

【可选】允许应用程序安装弹窗申请

下载类广告下载apk后安装

开发者在调用需要该权限的SDK功能时进行调用。例如下载安装App包体等功能。

iOS

NSLocationWhenInUseUsageDescription

【可选】仅App被使用时获取地理位置

广告投放及反作弊

开发者在调用需要该权限的SDK功能时进行调用,例如进行广告请求、监测归因与反作弊。

NSUserTrackingUsageDescription

【可选】获取设备标识,以识别设备信息

广告投放及反作弊

开发者在调用需要该权限的SDK功能时进行调用,例如进行广告请求、监测归因与反作弊。

网络权限

【必选】网络权限,用于SDK实现和服务器通信

网络通信,如广告请求、数据上报等

网络通信

NSAppTransportSecurity

【可选】添加http权限

http网络请求

开发者在调用需要该权限的SDK功能时进行调用,例如进行广告请求、图片加载。

3、APP使用RichMob SDK时的合规要求

SDK初始化及业务功能调用时机:APP必须确保在用户登录注册页面或首次启动时,通过明显且易于访问的方式(如弹窗、文本链接等)提示用户阅读《隐私政策》,告知个人信息处理规则,包括处理主体、目的、方式、类型及保存期限等内容。 在用户同意《隐私政策》后方可初始化 RichMob 广告 SDK 进行个人信息的收集与处理。如果用户不同意《隐私政策》,则不能初始化 SDK,也无法使用相关功能。

SDK隐私政策披露要求:开发者在集成并使用 RichMob SDK 时,应在 App 的《隐私政策》中通过“第三方 SDK 目录”“第三方信息共享清单”或类似章节,向终端用户清晰披露 RichMob SDK 的基本信息、收集使用的个人信息类型、使用目的、收集方式及隐私政策链接。 以下内容仅为参考示例,开发者应结合 App 实际集成版本、实际启用功能及用户授权情况进行调整。

SDK 披露示例

SDK名称:RichMob SDK

SDK提供方:杭州互裕科技有限公司

涉及个人信息:设备品牌、名称、型号、系统版本、网络类型、IP、UA、设备标识符OAID、IMEI、IMSI,Android ID、MAC地址、WIFI SSID/BSSID、硬件序列号、MEID、ICCID、屏幕方向、高宽、分辨率、系统更新时间、开机时间、运行内存、运营商、传感器信息、总磁盘大小、剩余磁盘大小、开发者应用名、应用版本号、应用包名、 应用安装列表、地理位置信息、崩溃日志、性能数据

使用目的:用于广告请求、广告展示、广告点击监测、广告效果统计、广告投放优化、广告归因、 反作弊及 SDK 运行安全保障。

收集方式:经用户授权后SDK自行采集,或由开发者通过隐私配置接口传入。

官网链接:https://richmob.cn

隐私政策链接:https://file.ssp.richmob.cn/privacy/privacy-policy.html

SDK扩展业务功能配置:个性化推荐功能用于提升广告匹配效果。开发者可通过 setPersonalRecommendEnabled 配置是否开启个性化推荐,默认开启。若用户拒绝个性化推荐或 APP 业务侧需要关闭该能力,应将该参数设置为 false。

				
				AdSdk.init(this, new AdInitConfig.Builder()
				         //appId媒体id
				        .appId("100000")
				        //隐私合规设置
				        .customController(getRichCustomController())
				        //是否开启个性化推荐,默认 true;false 表示关闭个性化推荐
				        .setPersonalRecommendEnabled(true)
				        .build());
				
			

SDK可选个人信息的配置说明:开发者可以根据需求配置 RichMob 广告 SDK 中可选收集的个人信息。由于不收集某些信息可能影响相关功能的正常使用, 因此开发者应根据业务需要合理配置。

				
				//函数返回值表示隐私开关开启状态,未重写函数使用默认值
				private RichCustomController getRichCustomController() {
				    return new RichCustomController() {
				        /**
				         * 是否允许SDK主动获取地理位置信息
				         */
				        @Override
				        public boolean isCanUseLocation() {
				            return super.isCanUseLocation();
				        }
				
				        /**
				         * isCanUseLocation为false时,可传入地理位置信息
				         */
				        @Nullable
				        @Override
				        public RichLocationProvider getLocation() {
				            return super.getLocation();
				        }
				
				        /**
				         * 是否允许SDK查询已安装应用列表
				         */
				        @Override
				        public boolean isCanUseAppList() {
				            return super.isCanUseAppList();
				        }
				        
				        /**
				         * 开发者可以传入已安装应用列表(应用包名)
				         */
				        @Nullable
				        @Override
				        public List getCustomAppList() {
				            return super.getCustomAppList();
				        }
				        
				        /**
				         * 是否允许SDK主动获取IMEI
				         */
				        @Override
				        public boolean isCanUsePhoneState() {
				            return super.isCanUsePhoneState();
				        }
				
				        /**
				         * 当isCanUsePhoneState为false时,可传入IMEI信息
				         */
				        @Nullable
				        @Override
				        public String getDevImei() {
				            return super.getDevImei();
				        }
				
				        /**
				         * 是否允许SDK主动获取MAC地址
				         */
				        @Override
				        public boolean isCanUseWifiState() {
				            return super.isCanUseWifiState();
				        }
				
				        /**
				         * 当isCanUseWifiState为false时,可传入Mac地址信息
				         */
				        @Nullable
				        @Override
				        public String getMacAddress() {
				            return super.getMacAddress();
				        }
				
				        /**
				         * 是否可以使用oaid
				         */
				        @Override
				        public boolean isCanUseOaid() {
				            return super.isCanUseOaid();
				        }
				
				        /**
				         * 开发者可以传入OAID
				         */
				        @Nullable
				        @Override
				        public String getDevOaid() {
				            return super.getDevOaid();
				        }
				
				        /**
				         * 是否允许SDK主动获取AndroidId
				         */
				        @Override
				        public boolean isCanUseAndroidId() {
				            return super.isCanUseAndroidId();
				        }
				
				        /**
				         * 开发者可以传入android ID
				         */
				        @Nullable
				        @Override
				        public String getAndroidId() {
				            return super.getAndroidId();
				        }
				
				        /**
				         * 是否允许SDK主动获取 WIFI SSID/BSSID
				         */
				        public boolean isCanUseWifiSsid() {
				            return super.isCanUseWifiSsid();
				        }
				        
				        /**
				         * 开发者可以传入WIFI SSID/BSSID
				         */
				        @Nullable
				        public String getWifiSsid() {
				            return super.getWifiSsid();
				        }
				
				        /**
				         * 是否允许SDK主动获取IMSI
				         */
				        @Override
				        public boolean isCanUseImsi() {
				            return super.isCanUseImsi();
				        }
				        
				        /**
				         * 开发者可以传入IMSI
				         */
				        @Override
				        public String getImsi() {
				            return super.getImsi();
				        }
				        
				        /**
				         * 是否允许SDK主动获取硬件序列号
				         */
				        @Override
				        public boolean isCanUseSerial() {
				            return super.isCanUseSerial();
				        }
				        
				        /**
				         * 开发者可以传入硬件序列号
				         */
				        @Override
				        public String getSerial() {
				            return super.getSerial();
				        }
				
				        /**
				         * 是否允许SDK主动获取传感器信息
				         */
				        @Override
				        public boolean isCanUseSensor() {
				            return super.isCanUseSensor();
				        }
				        
				        /**
				         * 是否允许SDK主动获取ICCID
				         */
				        public boolean isCanUseIccid() {
				            return true;
				        }
				        
				        /**
				         * 是否允许SDK主动获取MEID
				         */
				        public boolean isCanUseMeid() {
				            return true;
				        }
					/**
					 * 是否允许SDK获取磁盘空间大小
					 */
					public boolean isCanUseSpaceSize() {
					    return true;
					}
				    };
				}
				
			

RichMob iOS SDK 隐私设置

				
				RichmobAdSDKConfiguration.shared.isDisabledAppList = true
				RichmobAdSDKConfiguration.shared.isDisabledIDFA = true
				RichmobAdSDKConfiguration.shared.isDisabledIDFV = true
				RichmobAdSDKConfiguration.shared.isDisabledPersonalized = true
				RichmobAdSDKConfiguration.shared.isDisabledLocation = true
				RichmobAdSDKConfiguration.shared.isDisabledCA_ID = true
				RichmobAdSDKConfiguration.shared.isDisabledSpaceSize = true
				RichmobAdSDKConfiguration.shared.isDisabledSensor = true
				        
				let loc = CLLocation(latitude: 30, longitude: 120)
				RichmobAdSDKConfiguration.shared.location = loc
				RichmobAdSDKConfiguration.shared.IDFA = "AAAAA"
				RichmobAdSDKConfiguration.shared.IDFV = "VVVVV"
				RichmobAdSDKConfiguration.shared.CA_ID = [["id": "xxxxx", "version": "20230330"], ["id": "xxxxx", "version": "20250325"]]
				
				/// 隐私信息开关需要在SDK初始化之前设置,否则可能已经获取了隐私信息。
				@objc public class RichmobAdSDKConfiguration : NSObject {
				
				    @objc public static let shared: RichmobAdSDK.RichmobAdSDKConfiguration
				
				    /// 是否禁用IDFA,默认不禁用
				    @objc public var isDisabledIDFA: Bool
				
				    /// 是否禁用IDFV,默认不禁用
				    @objc public var isDisabledIDFV: Bool
				
				    /// 是否禁用CA_ID,默认不禁用
				    @objc public var isDisabledCA_ID: Bool
				
				    /// 是否禁用定位,默认不禁用
				    @objc public var isDisabledLocation: Bool
				
				    /// 是否禁用个性化,默认不禁用
				    @objc public var isDisabledPersonalized: Bool
				    
				    /// 是否禁用SSID,默认不禁用
				    @objc public var isDisabledSSID: Bool
				    
				    /// 是否禁用安装列表,默认不禁用
				    @objc public var isDisabledAppList: Bool
				    
				    /// 是否禁止获取磁盘大小,默认不禁用
				    @objc public var isDisabledSpaceSize = false
				
				    /// 是否禁用传感器 摇一摇,默认不禁用
				    @objc public var isDisabledSensor = false
				
				    /// 当isDisabledIDFA = true时,可传入IDFA,SDK使用您传入的信息
				    @objc public var IDFA: String?
				
				    /// 当isDisabledCA_ID = true时,可传入CA_ID,SDK使用您传入的信息
				    /// 格式为:
				    /// [
				    ///     {
				    ///         "id": "xxxxxx",
				    ///         "version": "20230330"
				    ///     },
				    ///     {
				    ///         "id": "xxxxxx",
				    ///         "version": "20250325"
				    ///     }
				    /// ]
				    @objc public var CA_ID: [[String : String]]?
				
				    /// 当isDisabledIDFV = true时,可传入IDFV,SDK使用您传入的信息
				    @objc public var IDFV: String?
				
				    /// 当isDisabledLocation = true时,可传入location,SDK使用您传入的信息
				    @objc public var location: CLLocation?
				    
				    /// 当isDisabledSSID = true时,可传入SSID,SDK使用您传入的信息
				    @objc public var SSID: String?
				    
				    /// 当isDisabledAppList = true时,可传入已安装APP的包名,SDK使用您传入的信息
				    /// 例如 ["com.baidu.app", "com.douyin.app"]
				    @objc public var bundleIdArray: [String]?
				    
				    /// 当isDisabledAppList = true时,可传入已安装APP的UrlScheme,SDK使用您传入的信息
				    /// 例如 ["tbopen://", "weixin://"]
				    @objc public var urlSchemeArray: [String]?
				    
				}