광고 피드
광고 피드는 일련의 광고로 구성된 단위입니다. 피드는 앱의 주요 콘텐츠로 추가되거나 기존 콘텐츠 이후에 표시될 수 있습니다. 피드에는 수십 개의 광고가 포함되어 순차적으로 로드됩니다(여러 광고가 한 번에 로드됨).
이 가이드는 iOS 앱에 광고 피드를 통합하는 방법을 설명합니다. 코드 예시와 단계 외에도 형식 사용 권장 사항과 추가 리소스 링크를 포함합니다.
표시 예
사전 준비
- 빠른 시작에 설명된 SDK 통합 단계를 수행하세요.
- 광고 SDK를 미리 초기화하세요.
- 최신 Yandex Mobile Ads SDK 버전을 사용하고 있는지 확인하세요. 미디에이션을 사용하는 경우, 최신 통합 빌드 버전을 실행하고 있는지도 확인하세요.
실행
광고 피드 통합의 주요 단계:
FeedAdAppearance로 피드 외관을 구성합니다.FeedAd객체를 만들고 delegate를 설정한 뒤 필요한FeedAdDelegate메서드를 구현합니다.- 광고를 로드합니다.
FeedAdCollectionViewAdapter를 만들어UICollectionView에 연결합니다.
광고 피드 통합 시 유의 사항
- 모든 Yandex Mobile Ads SDK 메서드 호출은 메인 스레드에서 수행하세요.
- 피드를 표시하는 화면이 보이는 동안
FeedAd와FeedAdCollectionViewAdapter에 강한 참조를 유지하세요.
외관
FeedAdAppearance 구성 객체를 만듭니다.
사용 가능한 매개변수:
cardWidth(필수): 표시되는 광고의 너비(point). 화면 너비에서 좌우 여백을 뺀 값을 기준으로 합니다.cardCornerRadius: 표시되는 광고의 모서리 반경(point).
let feedMargin: CGFloat = 24
let cardWidth = view.bounds.width - 2 * feedMargin
let appearance = FeedAdAppearance(cardWidth: cardWidth, cardCornerRadius: 16)
광고 로드
Yandex Advertising Network 인터페이스에서 받은 광고 단위 ID(adUnitId)로 FeedAd를 만듭니다.
AdRequest로 요청을 확장해 사용자 관심사, 페이지 컨텍스트, 위치 등을 전달할 수 있으며, 이는 광고 품질 향상에 도움이 됩니다. 자세한 내용은 광고 타겟팅을 참고하세요.
delegate를 설정하고 FeedAdDelegate를 구현해 로드 및 광고 이벤트를 처리합니다:
final class FeedAdViewController: UIViewController {
private var feedAd: FeedAd?
func loadAd() {
let request = AdRequest(adUnitID: "R-M-XXXXXX-Y")
let appearance = FeedAdAppearance(cardWidth: view.bounds.width)
let feedAd = FeedAd(requestConfiguration: request, appearance: appearance)
feedAd.delegate = self
self.feedAd = feedAd
feedAd.loadAd()
}
}
extension FeedAdViewController: FeedAdDelegate {
func feedAdDidLoad(_ feedAd: FeedAd) {
// Called when an ad is successfully loaded
}
func feedAd(_ feedAd: FeedAd, didFailToLoadWithError error: Error) {
// Called when ad loading fails
}
func feedAdDidClick(_ feedAd: FeedAd) {
// Called when the user taps the ad
}
func feedAd(_ feedAd: FeedAd, didTrackImpression impressionData: ImpressionData?) {
// Called when an impression is tracked
}
func feedAdDidUpdateDataSource(_ feedAd: FeedAd) {
// Called when new ads are available — reload collection view
collectionView.reloadData()
}
}
피드 표시
FeedAdCollectionViewAdapter를 UICollectionView의 dataSource와 delegate로 사용합니다.
어댑터를 연결하기 전에 registerCells(in:)으로 셀 타입을 등록하고, dataSource와 delegate를 설정하기 전에 수행합니다.
메인 목록으로 사용
어댑터의 dataSource와 delegate를 UICollectionView에 지정합니다:
final class FeedAdViewController: UIViewController {
private let collectionView = UICollectionView(
frame: .zero,
collectionViewLayout: UICollectionViewFlowLayout()
)
private var feedAdAdapter: FeedAdCollectionViewAdapter?
func setupAdapter() {
guard let feedAd else { return }
let adapter = FeedAdCollectionViewAdapter(feedAd: feedAd)
adapter.registerCells(in: collectionView)
collectionView.dataSource = adapter.dataSource
collectionView.delegate = adapter.delegate
feedAdAdapter = adapter
}
}
기존 콘텐츠와 함께
이미 UICollectionViewDataSource를 구현한 경우 피드 섹션을 어댑터에 위임합니다:
final class FeedAdViewController: UIViewController {
private enum Section: Int, CaseIterable {
case content
case feed
}
private var contentItems: [ContentItem] = []
private var feedAdAdapter: FeedAdCollectionViewAdapter?
func setupAdapter() {
guard let feedAd else { return }
let adapter = FeedAdCollectionViewAdapter(feedAd: feedAd)
adapter.registerCells(in: collectionView)
feedAdAdapter = adapter
collectionView.dataSource = self
collectionView.delegate = self
}
}
extension FeedAdViewController: UICollectionViewDataSource {
func numberOfSections(in collectionView: UICollectionView) -> Int {
Section.allCases.count
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
switch Section(rawValue: section) {
case .content:
return contentItems.count
case .feed:
return feedAdAdapter?.dataSource.collectionView(collectionView, numberOfItemsInSection: section) ?? 0
case .none:
return 0
}
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
switch Section(rawValue: indexPath.section) {
case .content:
// Return your content cell
return dequeueContentCell(for: indexPath)
case .feed:
return feedAdAdapter?.dataSource.collectionView(collectionView, cellForItemAt: indexPath)
?? UICollectionViewCell()
case .none:
return UICollectionViewCell()
}
}
}
extension FeedAdViewController: UICollectionViewDelegateFlowLayout {
func collectionView(
_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath
) -> CGSize {
switch Section(rawValue: indexPath.section) {
case .feed:
return feedAdAdapter?.delegate.collectionView?(
collectionView,
layout: collectionViewLayout,
sizeForItemAt: indexPath
) ?? .zero
default:
return CGSize(width: collectionView.bounds.width, height: 80)
}
}
}
광고 피드 통합 테스트
데모 광고 단위 사용
광고 피드 통합을 확인하고 앱을 테스트하려면 테스트 광고를 사용하세요.
모든 광고 요청에 테스트 광고가 반환되도록 데모 광고 단위 ID를 제공합니다. 통합이 올바른지 확인할 때 사용하세요.
데모 adUnitId: demo-feed-yandex.
Важно
스토어에 앱을 출시하기 전에 데모 광고 단위 ID를 Yandex Advertising Network 인터페이스에서 받은 실제 ID로 바꾸세요.
데모 광고 단위 ID 전체 목록은 테스트용 데모 광고 단위를 참고하세요.
통합 확인
네이티브 콘솔 도구를 사용하여 광고 통합을 테스트할 수 있습니다.
자세한 로그를 보려면 YMAMobileAds 클래스의 enableLogging 메서드를 호출하세요.
YMAMobileAds.enableLogging()
SDK 로그를 보려면 콘솔 도구로 이동하여 Subsystem = com.mobile.ads.ads.sdk를 설정하세요. 카테고리와 오류 수준별로 로그를 필터링할 수도 있습니다.
광고 통합에 문제가 있는 경우, 문제에 대한 상세한 보고서와 해결 방법에 대한 권장 사항을 받게 됩니다.
추가 리소스
-
GitHub 링크.