接入前创建好应用ID和广告位ID
https://pub.dev/packages/adsjmsdk
dependencies:
adsjmsdk: any
1.解压后,把 adsjmsdk_safe 文件夹复制到工程目录下
2.pubspec.yaml 导入 plugin
dependencies:
adsjmsdk:
# 本地导入方式,设置好 plugin 所在路径
path: ../
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
从 iOS 14.5 开始,只有在获得用户明确许可的前提下,应用才可以访问用户的 IDFA 数据并向用户投放定向广告。在应用程序调用 App Tracking Transparency 框架向最终用户提出应用程序跟踪授权请求之前,IDFA 将不可用。如果某个应用未提出此请求,则读取到的 IDFA 将返回全为0的字符串。
1.获取 ATT 权限,请更新您的 Info.plist,添加 NSUserTrackingUsageDescription 字段和自定义文案描述。代码示例:
<key>NSUserTrackingUsageDescription</key>
<string>需要获取您设备的广告标识符,以为您提供更好的广告体验</string>
2.向用户申请权限时,请调用 requestTrackingAuthorizationWithCompletionHandler:方法。
#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <AdSupport/AdSupport.h>
- (void)requestIDFA {
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
// [self loadAd];
}];
}
iOS 15.0 中,如果是在启动方法中调用授权,不会弹出授权提示框,可以参考:https://juejin.cn/post/7018126149553225741
支持了 Apple 官方的 SKAdNetwork 框架的渠道,会在获取不到 IDFA 的时候,正常获取转化。为了实现这个功能,需要在 info.plist 添加对应的 SKAdNetworkItems。
部分常用 SKAdNetworkIdentifier:
SKAdNetworkIdentifier |
---|
238da6jt44.skadnetwork |
x2jnk7ly8j.skadnetwork |
22mmun2rn5.skadnetwor |
f7s53z58qe.skadnetwork |
r3y5dwb26t.skadnetwork |
58922nb4gd.skadnetwork |
f7s53z58qe.skadnetwork |
27a282f54n.skadnetwork |
kbd757ywx3.skadnetwork |
mls7yz5dvl.skadnetwork |
4fzdc2evr5.skadnetwork |
4pfyvq9l8r.skadnetwork |
ydx93a7ass.skadnetwork |
cg4yq2srnc.skadnetwork |
p78axxw29g.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>22mmun2rn5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>f7s53z58qe.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>r3y5dwb26t.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>58922nb4gd.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>f7s53z58qe.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>27a282f54n.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>kbd757ywx3.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>mls7yz5dvl.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>4fzdc2evr5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>4pfyvq9l8r.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>ydx93a7ass.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>cg4yq2srnc.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>p78axxw29g.skadnetwork</string>
</dict>
</array>
注意点
注册AppId触发需要较早的时机,所以最好放在原生的 AppDelegate 中调用
#import <LUYSDK/LUYSDK.h>
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//注册AppId
[LUYSDKConfig registerAppId:@"sjm_ios123"];
[GeneratedPluginRegistrant registerWithRegistry:self];
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
import LUYSDK
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
//注册AppId
LUYSDKConfig.registerAppId("sjm_ios123")
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
SjmAdSdk.init("sjm_ios123");
广告接入具体示范可以参照 Demo
第一种方式(推荐使用)
//第一个参数:广告id
//第二个参数:超时时间
SjmAdSdk.showSplashAd(
"SJM_S002",5,
onSjmAdLoaded: (String id) {
print("SplashAd 加载成功");
},
onSjmAdShow: (String id) {
print("SplashAd 展示");
},
onSjmAdClicked: (String id) {
print("SplashAd 点击");
},
onSjmAdClosed: (String id) {
print("SplashAd 关闭");
},
onSjmAdError: (String id, int code, String message) {
print("SplashAd 错误 "+message);
},
);
第二种方式
//第一个参数:广告id
SplashAdView(
adId: "SJM_S002",
width: width,
height: height,
onSjmAdLoaded: (String id) {
print("SplashAd 加载成功");
},
onSjmAdShow: (String id) {
print("SplashAd 开屏展示");
},
onSjmAdClicked: (String id) {
print("SplashAd 开屏点击");
},
onSjmAdClosed: (String id) {
print("SplashAd 开屏关闭");
},
onSjmAdError: (String id, int code, String message) {
print("SplashAd 加载失败");
}
)
//第一个参数:广告id
//第二个参数:用户ID
SjmAdSdk.showRewardVideoAd(
"广告位id","用户id",
onSjmAdTradeId:(String id){
print("RewardVideoAd onSjmAdTradeId");
},
onSjmAdLoaded: (String id) {
print("RewardVideoAd onSjmAdLoad");
},
onSjmAdShow: (String id) {
print("RewardVideoAd onSjmAdShow");
},
onSjmAdReward: (String id) {
print("RewardVideoAd onReward");
},
onSjmAdClicked: (String id) {
print("RewardVideoAd onSjmAdClick");
},
onSjmAdVideoComplete: (String id) {
print("RewardVideoAd onVideoComplete");
},
onSjmAdClosed: (String id) {
print("RewardVideoAd onSjmAdClose");
},
onSjmAdError: (String id, int code, String message) {
print("RewardVideoAd onSjmAdError");
},
);
//第一个参数:广告id
SjmAdSdk.loadInterstitalAd(
"广告位id",
onSjmAdLoaded: (String id) {
print("InterstitalAd onSjmAdLoad");
},
onSjmAdShow: (String id) {
print("InterstitalAd onSjmAdShow");
},
onSjmAdClicked: (String id) {
print("InterstitalAd onSjmAdClick");
},
onSjmAdClosed: (String id) {
print("InterstitalAd onSjmAdClose");
},
onSjmAdError: (String id, int code, String message) {
print("InterstitalAd onSjmAdError");
},
);
//adId:广告ID
//width: 期望宽度
//height: 期望高度
NativeExpressAdView(
adId: "广告位id",
width: 350,
height: 300,
onSjmAdLoaded: (String id) {
print("native_express onSjmAdLoad");
},
onSjmAdShow: (String id) {
print("native_express onSjmAdShow");
},
onSjmAdClicked: (String id) {
print("native_express onSjmAdClick");
},
onSjmAdClosed: (String id) {
print("native_express onSjmAdClose");
},
onSjmAdError: (String id, int code, String message) {
print("native_express onError");
},
)
//adId:广告ID
//width: 期望宽度
//height: 期望高度
BannerAdView(
adId: "广告位id",
width: 400,
height: 60,
onSjmAdLoaded: (String id) {
print("BannerAd onSjmAdLoad");
},
onSjmAdShow: (String id) {
print("BannerAd onSjmAdShow");
},
onSjmAdClicked: (String id) {
print("BannerAd onSjmAdClick");
},
onSjmAdClosed: (String id) {
print("BannerAd onSjmAdClose");
},
onSjmAdError: (String id, int code, String message) {
print("BannerAd onError");
},
)
//第一个参数:广告id
SjmAdSdk.showFullVideoAd(
"SJMKS_FV001",
onSjmAdLoaded: (String id) {
print("RewardVideoAd onSjmAdLoad");
},
onSjmAdShow: (String id) {
print("RewardVideoAd onSjmAdShow");
},
onSjmAdClicked: (String id) {
print("RewardVideoAd onSjmAdClick");
},
onSjmAdVideoComplete: (String id) {
print("RewardVideoAd onVideoComplete");
},
onSjmAdClosed: (String id) {
print("RewardVideoAd onSjmAdClose");
},
onSjmAdError: (String id, int code, String message) {
print("RewardVideoAd onSjmAdError");
},
);
名称 | 备注 |
---|---|
onSjmAdLoaded | 广告加载成功 |
SjmAd_VideoCached | 广告视频下载或读取缓存 |
onSjmAdShow | 广告展示 |
onSjmAdClicked | 广告点击回调 |
onSjmAdClosed | 广告关闭回调 |
onSjmAdError | 广告错误和错误信息 |
onSjmAdReward | 触发广告奖励(激励视频) |