blog
blog copied to clipboard
网站和App流量变现(广告接入)
App和网站需要接入广告来进行变现的话,一般都会选择 Google。
写在前面
自己网站和APP的广告,开发阶段千万不要在自己手机去点击广告,不然很有可能会因 “无效流量” 而导致账号被封。 我之前就在一个 APP 接入广告的时候使用了真实广告 ID 开发,然后点击了几下广告,导致好长一段时间广告都不展示了。

开发阶段需要测试的话,要用官方提供的测试ID或者添加测试设备进行测试。
App 广告接入
Google 的 App 广告平台叫 Google AdMob:
iOS 接入步骤简述
步骤1:Google-Mobile-Ads-SDK
下载安装
我个人喜欢手动安装,别忘了添加 -ObjC
。
目前已经有了 Swift Package Manager 的方式,就更方便了。
步骤2:info.plist
添加对应字段
- 广告ID:
GADApplicationIdentifier
- 广告联盟合作伙伴列表:
SKAdNetworkItems
- 权限说明:
NSUserTrackingUsageDescription
- 应用传输安全:
NSAppTransportSecurity
步骤3:广告初始化
SwiftUI 可以在 App
入口文件 init()
里进行初始化:
struct exampleApp: App {
init() {
if #available(iOS 14, *) {
DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
ATTrackingManager.requestTrackingAuthorization { status in
GADMobileAds.sharedInstance().start(completionHandler: nil)
}
})
} else {
GADMobileAds.sharedInstance().start(completionHandler: nil)
}
}
var body: some Scene {
WindowGroup {
ContentView()
// FIXED: 这里是针对 iOS15 的
.onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in
ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in })
}
}
}
}
UIKit 的用户需要在 AppDelegate.swift
的 didFinishLaunchingWithOptions
里初始化,代码一样:
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: {
ATTrackingManager.requestTrackingAuthorization { status in
GADMobileAds.sharedInstance().start(completionHandler: nil)
}
})
return true
}
...
}
接入成功的话,第一次打开 App 会有弹窗:
步骤4:具体广告展示
按【这里】的教程,封装好几个广告的展示组件,即可直接使用。

切记,别点击自己的广告
再次提醒,千万别点击自己的广告,另外,开发过程中请使用测试单元ID。 Swiftui 里可以这样定义你的广告单元ID:
class GoogleAdMobIds {
static let test_banner: String = "ca-app-pub-3940256099942544/2934735716"
static let test_rewarded: String = "ca-app-pub-3940256099942544/1712485313"
#if DEBUG // 开发测试环境
static let banner_homepage: String = GoogleAdMobIds.test_banner
static let banner_page1: String = GoogleAdMobIds.test_banner
#else // 生产环境
static let banner_homepage: String = "ca-app-pub-2849990666xxxxxx/xxxxxxxxxx"
static let banner_page1: String = "ca-app-pub-2849990666xxxxxx/yyyyyyyyyy"
#endif
}
网站广告接入
Google 的网站广告平台叫 Google AdSense
接入方式还是挺简单的,看看官方文档一般都没问题,就是在官网获取一段 <script>
代码加到 <head>
里而已。
ads.txt 和 app-ads.txt 文件
链接:
授权应用卖方(或 app-ads.txt) 是一项 IAB 计划,可帮助保护你的应用广告资源免遭广告欺诈。你可以创建 app-ads.txt 文件来指明有权销售你的广告资源的卖方。通过指明授权卖方,你可以避免那些原本可能流向欺诈应用的仿冒广告资源的广告客户支出。
app-ads.txt 文件是公开的,可供广告交易平台、供应方平台 (SSP) 以及其他买方和第三方供应商抓取。
授权应用卖方 (app-ads.txt) 是授权数字卖方 (ads.txt) 计划的延伸和扩展,后者最初设计用于保护网络广告资源。app-ads.txt 在 ads.txt 的基础上扩展了兼容性, 使之支持移动应用中展示的广告。
通俗来说,有了app-ads.txt像是有了保障,可以保证广告来源的质量。
应用的话,必须在开发者网站添加请注意以下两点:
- 应用必须在 Google Play 或 Apple App Store 中注册上架。
- 应用的商品详情必须添加开发者网站
App Store 里的字段是:Marketing URL
:

有添加开发者网站的,应用详情页里会有展示:

AdMob 里验证通过 app-ads.txt 之后是长这样的:

XCode 项目兼容 iOS 和 OSX,广告SDK处理
Google AdMob SDK 并不支持 OSX,所以在代码里也要做区别对待,不然编译不通过。
广告相关的组件代码文件以及Google AdMob SDK都需要设置成只对 iOS
有效,如图:

上传 AppStore 出错

The app references non-public selectors in Payload/xxx.app/xxx: callWithArguments:, estimatedProgress, frameInfo, initWithFrame:configuration:, isMainFrame, navigationType, setNavigationDelegate:, setProcessPool:, toDouble, toString, userContentController With error code STATE_ERROR.VALIDATION_ERROR.50 for id 3c74c4d0-e222-4a4a-ba92-6161594ec147
目前还在解决中!
把 package
里的包更新一下,然后退出 XCode 后,重新打开一下就好了,也不知道为什么。
iPad 真机会出现 crash

但是在模拟机上怎么都发现不了问题,经对比发现,这个 App 打开了 Supports multiple windows
,而广告请求上没有传递场景参数而导致的。其实在模拟机上也显示不了广告。
解决:要不把多窗口关闭,要不在广告请求上增加场景请求,具体参考相关文档。
