🦺 厂商 SDK 配置

💡 小提示
  • 穿山甲基础配置已包含在插件内,广点通、百度、快手等需要按需导入配置
  • 下面以广点通为例,每增加一个厂商都必须重复如下的步骤,否则可能出现广告加载异常等情况
  • Pro 版客户,如 SDK 下载和配置有问题随时联系我,提供集成指导支持
  • 最新版本 SDK 请参考插件包中附带的示例 example 中的配置

Android 配置

引入依赖

添加对应厂商的 AdapterSDK

example/android/app/build.gradle
dependencies {
    //GroMore_sdk adapter
    implementation "com.pangle.cn:mediation-gdt-adapter:xxx" //gdt adapter
    implementation "com.qq.e.union:union:xxx"// 广点通广告 SDK
    implementation "com.pangle.cn:mediation-ks-adapter:xxx"//ks adapter
    implementation files('libs/kssdk-ad-xxx.aar')// 快手广告 SDK
    // 这里通过远程仓库导入你也可以按照官方示例中的 `aar` 导入依赖
}

添加配置

本插件已将基础配置内置,大幅简化了繁琐的配置流程,这里只需要添加厂商特有的配置即可

example/android/app/src/main/AndroidManifest.xml
<!-- GDT start================== -->
<!-- targetSDKVersion >= 24时才需要添加这个provider。provider的authorities属性的值为${applicationId}.fileprovider,请开发者根据自己的${applicationId}来设置这个值,例如本例中applicationId为"com.qq.e.union.demo"。 -->
<provider
    android:name="com.qq.e.comm.GDTFileProvider"
    android:authorities="${applicationId}.gdt.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/gdt_file_path" />
</provider>

<activity
    android:name="com.qq.e.ads.PortraitADActivity"
    android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
    android:screenOrientation="portrait" />
<activity
    android:name="com.qq.e.ads.LandscapeADActivity"
    android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
    android:screenOrientation="landscape"
    tools:replace="android:screenOrientation" />

<!-- 声明SDK所需要的组件 -->
<service
    android:name="com.qq.e.comm.DownloadService"
    android:exported="false" />
<!-- 请开发者注意字母的大小写,ADActivity,而不是AdActivity -->

<activity
    android:name="com.qq.e.ads.ADActivity"
    android:configChanges="keyboard|keyboardHidden|orientation|screenSize" />
<!-- GDT end================== -->

<!-- 其他广告配置参考官方文档添加即可================== -->

权限请求

必要权限已添加,其他权限参考示例官方文档酌情添加即可。

example/pages/home_page.dart
bool result = await FlutterGromoreAds.requestPermissionIfNecessary;

iOS 配置

引入依赖

修改 ios/Podfile 引入厂商 SDK

example/ios/Podfile
1target 'Runner' do
2  # 广点通/优量汇
3  pod 'CSJMGdtAdapter', 'xxx'
4  pod 'GDTMobSDK','xxx'
5  # 快手
6  pod 'CSJMKsAdapter', 'xxx'
7  pod 'KSAdSDK', '3.3.65.0'
8  # 这里快手 SDK 一定要用 '3.3.65.0' 及以上版本,不然 iOS 隐私清单无法通过
9  # 其他厂商按需求添加

添加配置

example/ios/Runner/Info.plist
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
<key>NSUserTrackingUsageDescription</key>
<string>为了向您提供更优质、安全的个性化服务及内容,需要您允许使用相关权限</string>

ATT 授权

此步骤必须要做,不然上架审核时候会被拒绝。以往广告归因依赖于IDFA。从iOS 14开始,只有在获得用户明确许可的前提下,应用才可以访问用户的IDFA数据并向用户投放定向广告。

example/pages/home_page.dart
bool result = await FlutterGromoreAds.requestIDFA;

隐私清单文件

  • 苹果从 2024 年 5 月 1 日开始,上传或更新应用要求有效的隐私清单文件申明,具体查看这个官方文档《Apple-隐私清单文件》
  • 如果没有配置过隐私清单文件,建议直接将 example/ios/Runner/PrivacyInfo.xcprivacy 复制到你的项目中
  • 如果已经配置过,就需要手动合并一下,因为很多都是相似的内容
example/ios/Runner/PrivacyInfo.xcprivacy
<?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">
<!--
   PrivacyInfo.xcprivacy
   Runner

   Created by zero on 2024/7/4.
   Copyright (c) 2024 FlutterAds. All rights reserved.
-->
<plist version="1.0">
<dict>
	<key>NSPrivacyCollectedDataTypes</key>
	<array>
		<dict>
			<key>NSPrivacyCollectedDataType</key>
			<string>NSPrivacyCollectedDataTypeDeviceID</string>
			<key>NSPrivacyCollectedDataTypeLinked</key>
			<false/>
			<key>NSPrivacyCollectedDataTypeTracking</key>
			<true/>
			<key>NSPrivacyCollectedDataTypePurposes</key>
			<array>
				<string>NSPrivacyCollectedDataTypePurposeThirdPartyAdvertising</string>
			</array>
		</dict>
		<dict>
			<key>NSPrivacyCollectedDataType</key>
			<string>NSPrivacyCollectedDataTypePerformanceData</string>
			<key>NSPrivacyCollectedDataTypeLinked</key>
			<false/>
			<key>NSPrivacyCollectedDataTypeTracking</key>
			<false/>
			<key>NSPrivacyCollectedDataTypePurposes</key>
			<array>
				<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
			</array>
		</dict>
	</array>
	<key>NSPrivacyAccessedAPITypes</key>
	<array>
		<dict>
			<key>NSPrivacyAccessedAPIType</key>
			<string>NSPrivacyAccessedAPICategorySystemBootTime</string>
			<key>NSPrivacyAccessedAPITypeReasons</key>
			<array>
				<string>35F9.1</string>
			</array>
		</dict>
		<dict>
			<key>NSPrivacyAccessedAPIType</key>
			<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
			<key>NSPrivacyAccessedAPITypeReasons</key>
			<array>
				<string>C617.1</string>
			</array>
		</dict>
		<dict>
			<key>NSPrivacyAccessedAPIType</key>
			<string>NSPrivacyAccessedAPICategoryDiskSpace</string>
			<key>NSPrivacyAccessedAPITypeReasons</key>
			<array>
				<string>7D9E.1</string>
				<string>E174.1</string>
			</array>
		</dict>
		<dict>
			<key>NSPrivacyAccessedAPIType</key>
			<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
			<key>NSPrivacyAccessedAPITypeReasons</key>
			<array>
				<string>CA92.1</string>
			</array>
		</dict>
	</array>
</dict>
</plist>

常见问题

Undefined symbol: _OBJC_CLASS_$_ABUSDKConfig
  • 按照上方【iOS 引入依赖】或示例中的引入厂商依赖即可解决
ShrinkProtoResourcesAction ParseError at [row,col]:[1,1]

添加一个配置文件即可,参考示例中 example/android/gradle.properties

example/android/gradle.properties
android.enableNewResourceShrinker=false