SDK 集成

SDK 集成

工程设置导入framework

申请应用的AppId

请找运营人员获取应用ID和广告位ID。

导入package

  • pubspec.yaml接入方式,优缺点: 桥接已写好,开发者只需导入package即可。 适用: 适用于大多数flutter开发者,集成、使用简单,省时省力。
zjsdk_flutter: ^0.2.0

Xcode编译选项设置

添加HTTP权限

  • 在项目路径下 -> ios -> 打开Runner.xcworkspace, 在Runner项目 -> TARGETS -> Info -> Custom iOS Target Properties 添加 App Transport Security Settings,先点击左侧展开箭头,再点右侧加号,Allow Arbitrary Loads 选项自动加入,修改值为 YES。 SDK API 已经全部支持HTTPS,但是广告主素材存在非HTTPS情况。
<key>NSAppTransportSecurity</key>
  <dict>
     <key>NSAllowsArbitraryLoads</key>
   <true/>
</dict>

切记

千万不要在NSAllowsArbitraryLoads这个属性 之后 再去设置 Allow Arbitrary Loads in Web Content 这个属性,否则影响某些正常功能的使用

  • Build SettingsOther Linker Flags 增加参数 -ObjC,字母o和c 大写

添加位置权限

  • SDK 需要位置权限以更精准的匹配广告,需要在应用的 info.plist 添加相应配置信息,避免 App Store 审核被拒:
Privacy - Location When In Use Usage Description
Privacy - Location Always and When In Use Usage Description
Privacy - Location Always Usage Description
Privacy - Location Usage Description

scheme列表添加以下内容

  • 用于判断用户设备使用环境,提高安全性,增加收益
<key>LSApplicationQueriesSchemes</key>
    <array>
<string>alipayauth</string>
    <string>alipays</string>
    <string>alipay</string>
    <string>wechat</string>
    <string>weixin</string>
    <string>taobao</string>
    <string>tbopen</string>
    <string>openapp.jdmobile</string>
    <string>pinduoduo</string>
    <string>meituanwaimai</string>
    <string>imeituan</string>
    <string>snssdk1128</string>
    <string>kwai</string>
    <string>cydia</string>
    <string>cainiao</string>
    <string>bytedance</string>
    <string>soul</string>
    <string>weixinULAPI</string>
    <string>mqq</string>
    <string>mqqapi</string>
    <string>mqqopensdkapiV2</string>
    <string>mqqopensdkapiV4</string>
    <string>jdmobile</string>
    <string>openjdlite</string>
    <string>openapp.jdpingou</string>
    <string>taobaolite</string>
    <string>taobaolive</string>
    <string>taobaotravel</string>
    <string>tmall</string>
    <string>ctrip</string>
    <string>palfish-read</string>
    <string>douyutv</string>
    <string>fleamarket</string>
    <string>youku</string>
    <string>sinaweibohd</string>
    <string>weibosdk</string>
    <string>sinaweibo</string>
    <string>baidumobads</string>
    <string>itms-beta</string>
    <string>pddopen</string>
    <string>snssdk35</string>
    <string>snssdk1112</string>
    <string>snssdk2329</string>
    <string>vipshop</string>
    <string>dewuapp</string>
    <string>suning</string>
    <string>suningebuy</string>
    <string>iting</string>
    <string>baiduhaokan</string>
    <string>lianjia</string>
    </array>

iOS 14 注意事项

  1. iOS 14.5及以上版本ATT权限申请 App Tracking Transparency(ATT) 框架向用户提出应用程序跟踪授权请求,并提供跟踪授权状态。自iOS14.5 开始,在应用程序调用 ATT 向用户提跟踪授权请求之前,IDFA 将不可用。如果应用未提出此请求,应用获取到的 IDFA 将为0,建议您在应用启动时调用,以便我们能够提供更精准的进行广告投放和收入优化。

要获取 ATT 权限,请更新您的 Info.plist,添加 NSUserTrackingUsageDescription 字段和自定义文案描述。代码示例:

<key>NSUserTrackingUsageDescription</key>
<string>该标识符将用于向您投放个性化广告</string>

请先确保项目中已经正确引入AdSupport.framework和AppTrackingTransparency.framework,可在TARGETS -> Link Binary With Libraries下查看。

向用户申请权限时,请调用 requestTrackingAuthorizationWithCompletionHandler:方法。我们建议您申请权限后再请求广告,以便广告能准确的获得用户授权状态。

  • objc申请广告权限
#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <AdSupport/AdSupport.h>

- (void)applicationDidBecomeActive:(UIApplication *)application { 
    if (@available(iOS 14.0, *)) {
        // iOS14及以上版本需要先请求权限
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
                // 获取到权限后,依然使用老方法获取idfa
                if (status == ATTrackingManagerAuthorizationStatusAuthorized) {
                    NSString *idfa = [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString];
                } else {
                    NSLog(@"请在设置-隐私-跟踪中允许App请求跟踪");
                }
            }];
        });
    } else {
        // iOS14以下版本依然使用老方法
        // 判断在设置-隐私里用户是否打开了广告跟踪
        if ([[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) {
            NSString *idfa = [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString];
        } else {
            NSLog(@"请在设置-隐私-广告中打开广告跟踪功能");
        }
    } 
}
  • Swift申请广告权限
import AdSupport
import AppTrackingTransparency

override func applicationDidBecomeActive(_ application: UIApplication) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        if #available(iOS 14.0, *) {
            AppTrackingManager.requestTrackingAuthorization { status in 
                switch status {
                    case .authorized:
                        print("用户授权跟踪")
                    case .denied:
                        print("用户拒绝授权")
                    case .restricted:
                        print("跟踪被限制")
                    case .notDetermined:
                        print("用户尚未决定")
                    @unknown default:
                        print("未知的跟踪状态")
                }
            }
        }
    }
}

注意

请求idfa权限的这个方法需要在applicationDidBecomeActive中调用,如果在 didFinishLaunchingWithOptions这个方法中调用,那么可能不会弹出授权弹窗,最终导致获取不到idfa。 上架AppStore时,有些系统无法弹出授权弹窗,请把申请权限代码延迟2秒左右加载即可。

SKAdNetwork 接入

  • 使用Apple的转化跟踪SKAdNetwork,这意味着即使IDFA不可用,也可以将应用安装归因。 1.在Xcode项目导航器中,选择Info.plist。 2.单击属性列表编辑器中任何键旁边的添加按钮(+),以创建一个新的属性键。 3.输入密钥名称SKAdNetworkItems。选择Array。 4.将SKAdNetworkId以字典的形式添加到数组中。
//将SKAdNetwork ID 添加到 info.plist 中,以保证 SKAdNetwork 的正确运行
//广点通
SKAdNetworkIdentifier : f7s53z58qe.skadnetwork
//快手
SKAdNetworkIdentifier : r3y5dwb26t.skadnetwork
//sigmob
SKAdNetworkIdentifier : 58922NB4GD.skadnetwork
//MTG
SKAdNetworkIdentifier : kbd757ywx3.skadnetwork
//穿山甲
SKAdNetworkIdentifier : 238da6jt44.skadnetwork
SKAdNetworkIdentifier : x2jnk7ly8j.skadnetwork
SKAdNetworkIdentifier : 22mmun2rn5.skadnetwork
//Google
SKAdNetworkIdentifier : cstr6suwn9.skadnetwork
<key>SKAdNetworkItems</key>
<array>
    <dict>
        <key>SKAdNetworkIdentifier</key>
        <string>238da6jt44.skadnetwork</string>
    </dict>
    <dict>
        <key>SKAdNetworkIdentifier</key>
        <string>x2jnk7ly8j.skadnetwork</string>
    </dict>
    <dict>
        <key>SKAdNetworkIdentifier</key>
        <string>f7s53z58qe.skadnetwork</string>
    </dict>
    <dict>
        <key>SKAdNetworkIdentifier</key>
        <string>58922NB4GD.skadnetwork</string>
    </dict>
    <dict>
        <key>SKAdNetworkIdentifier</key>
        <string>kbd757ywx3.skadnetwork</string>
    </dict>
    <dict>
        <key>SKAdNetworkIdentifier</key>
        <string>22mmun2rn5.skadnetwork</string>
    </dict>
    <dict>
        <key>SKAdNetworkIdentifier</key>
        <string>r3y5dwb26t.skadnetwork</string>
    </dict>
    <dict>
        <key>SKAdNetworkIdentifier</key>
        <string>cstr6suwn9.skadnetwork</string>
    </dict>
</array>