说明:
从 iOS 14 开始,若开发者设置 App Tracking Transparency 向用户申请跟踪授权,在用户授权之前IDFA 将不可用。 如果用户拒绝此请求,应用获取到的 IDFA 将自动清零,可能会导致您的广告收入的降低
应用编译环境升级至 Xcode 12.0 及以上版本
报错信息
Showing All Messages
Arm64 function not 4-byte aligned: _unwind_tester from /Users/yz/Desktop/CSJ_Test/Build/CSJ_TestXCode/Libraries/libiPhone-lib.a(unwind_test_arm64.o)
Showing All Messages
Undefined symbol: _OBJC_CLASS_$_ATTrackingManager
解决方法:
原因是缺少了一个 Libraries 引用 “AppTrackingTransparency.framework"
在XCode中配置即可: Build Phases -> Link Binary With Libraries
穿山甲SDK
最近接入穿山甲广告SDK时遇到的这个错误问题:
后得到穿山甲官方回应:
对于国内的媒体,ATT相关的目前苹果未做强制要求。
SKAdNetworkIdentifier对海外媒体的,国内媒体也可不设置
--------------
穿山甲SDK需求:
需要 App Tracking Transparency(ATT)适用于请求用户授权,访问与应用相关的数据以跟踪用户或设备。
访问 https://developer.apple.com/documentation/apptrackingtransparency了解更多信息。
海外流量开发者需要注意: SKAdNetwork(SKAN)是 Apple 的归因解决方案,可帮助广告客户在保持用户隐私的同时衡量广告活动。
使用 Apple 的 SKAdNetwork 后,即使 IDFA 不可用,广告网络也可以正确获得应用安装的归因结果。 访问 https://developer.apple.com/documentation/storekit/skadnetwork 了解更多信息。
Checklist
- 应用编译环境升级至
Xcode 12.0 及以上版本
- 升级穿山甲 iOS
SDK 3.2.5.0 及以上版本
,穿山甲提供了 iOS 14 与 SKAdNetwork 支持 - 海外流量开发者需要检查: 将穿山甲的 SKAdNetwork ID 添加到 info.plist 中,以保证
SKAdNetwork
的正确运行
<key>SKAdNetworkItems</key>
<array>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>238da6jt44.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>22mmun2rn5.skadnetwork</string>
</dict>
</array>
- 持苹果 ATT:从 iOS 14 开始,若开发者设置 App Tracking Transparency 向用户申请跟踪授权,在用户授权之前IDFA 将不可用。 如果用户拒绝此请求,应用获取到的 IDFA 将自动清零,可能会导致您的广告收入的降低
<key>NSUserTrackingUsageDescription</key>
<string>该标识符将用于向您投放个性化广告</string>
- 要获取 App Tracking Transparency 权限,请更新您的 Info.plist,添加 NSUserTrackingUsageDescription 字段和自定义文案描述。代码示例:
要向用户申请权限时,请调用 requestTrackingAuthorizationWithCompletionHandler:
,我们建议您申请权限后在请求广告,以便获得穿山甲准确获得用户的授权。
Objective-C 代码示例
#import <AdSupport/AdSupport.h>
#import <AppTrackingTransparency/AppTrackingTransparency.h>
- (void)getIDFA {
if (@available(iOS 14, *)) {
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
if (status == ATTrackingManagerAuthorizationStatusAuthorized) {
NSString *idfaStr = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString;
NSLog(@"idfaStr - %@", idfaStr);
}
}];
} else {
// 使用原方式访问 IDFA
if ([[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) {
NSString *idfaStr = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString;
NSLog(@"idfaStr - %@", idfaStr);
}
}
}
其它参考:https://blog.csdn.net/wuwei54321/article/details/107581070