브레이킹 체인지: 기존 코드와 호환되지 않으므로 전면적인 코드 수정이 필요합니다.
설정 파일: 새로운 통합 설정 파일 형식으로 변경해야 합니다.
프로젝트 설정
1
설정 파일 변경
daro-service.json->ios-daro-key.txt변경되었습니다.- Info.plist:
DaroAppKey설정
ios-daro-key.txt는 DARO 대시보드에서 다운받을 수 있습니다.DaroAppKey는 DARO 대시보드에서 확인할 수 있습니다.코드 마이그레이션
1
SDK 초기화 변경
기존의 분리된 SDK 초기화 방식에서 통합된 방식으로 변경됩니다.
새로운 코드 (통합)
Show 기존 코드 - DaroAds non-reward SDK
Show 기존 코드 - DaroAds non-reward SDK
Copy
Ask AI
import DaroAds
// SDK 초기화
DaroMobileAds.shared.logLevel = .debug
DaroMobileAds.shared.start {
print("SDK 초기화 완료")
}
Show 기존 코드 - DaroMAds reward SDK
Show 기존 코드 - DaroMAds reward SDK
Copy
Ask AI
import DaroMAds
// SDK 초기화
DaroMMobileAds.shared.logLevel = .debug
DaroMMobileAds.shared.initialize {
print("SDK 초기화 완료")
}
Copy
Ask AI
non-reward 앱 >> import Daro
reward 앱 >> import DaroM
// SDK 초기화 (통합)
DaroAds.shared.logLevel = .debug
DaroAds.shared.userId = "user_id" // 선택사항
DaroAds.shared.initialized { error in
if let error = error {
print("SDK 초기화 실패: \(error)")
} else {
print("SDK 초기화 완료")
}
}
2
광고 단위 생성 방식 변경
기존의 각 광고 타입별 전용 구조체에서 통합된 구조체로 변경됩니다.
새로운 코드 (통합)
Show 기존 코드 - DaroAds non-reward SDK
Show 기존 코드 - DaroAds non-reward SDK
Copy
Ask AI
// 각 광고 타입별 전용 구조체
let appOpenUnit = DaroAdAppOpenUnit(id: "ad_unit_id")
let bannerUnit = DaroAdBannerViewUnit(id: "ad_unit_id")
let interstitialUnit = DaroAdInterstitialUnit(id: "ad_unit_id")
let rewardedUnit = DaroAdRewardedUnit(id: "ad_unit_id")
let nativeUnit = DaroNativeAdUnit(id: "ad_unit_id")
Show 기존 코드 - DaroMAds reward SDK
Show 기존 코드 - DaroMAds reward SDK
Copy
Ask AI
// 포맷 지정 방식
let appOpenUnit = DaroMAdUnit(adUnitID: "ad_unit_id", format: .appOpen)
let bannerUnit = DaroMAdUnit(adUnitID: "ad_unit_id", format: .banner)
let interstitialUnit = DaroMAdUnit(adUnitID: "ad_unit_id", format: .interstitial)
let rewardedUnit = DaroMAdUnit(adUnitID: "ad_unit_id", format: .rewarded)
let nativeUnit = DaroMAdUnit(adUnitID: "ad_unit_id", format: .native)
Copy
Ask AI
// 통합된 광고 유닛 구조체
let adUnit = DaroAdUnit(unitId: "ad_unit_id")
// 플레이스먼트 지정 (선택사항)
let adUnit = DaroAdUnit(unitId: "ad_unit_id", placement: "main_screen")
3
리스너 방식 변경
핵심 변경사항: 기존의 delegate 패턴에서 listener 클로저 기반 패턴으로 변경되었습니다.
Copy
Ask AI
// 모든 광고 타입에서 공통으로 사용되는 리스너들
ad.listener.onAdLoadSuccess = { ad, adInfo in
// 광고 로드 성공 시 호출
}
ad.listener.onAdLoadFail = { error in
// 광고 로드 실패 시 호출
}
ad.listener.onAdImpression = { adInfo in
// 광고 노출 시 호출
}
ad.listener.onAdClicked = { adInfo in
// 광고 클릭 시 호출
}
Copy
Ask AI
// 광고 표시 리스너 설정
(interstitialListener | rewardedAdListener | appOpenAdListener )
.onShown = { adInfo in
print("[DARO] Listener Sample Interstitial Ad shown: \(adInfo)")
}
(interstitialListener | rewardedAdListener | appOpenAdListener )
.onDismiss = { adInfo in
print("[DARO] Listener Sample Interstitial Ad dismissed: \(adInfo)")
}
(interstitialListener | rewardedAdListener | appOpenAdListener )
.onFailedToShow = { adInfo, error in
print("[DARO] Listener Sample Interstitial Ad failed to show: \(adInfo) \(error)")
}
Copy
Ask AI
rewardedAd.rewardedAdListener.onEarnedReward = { rewardItem, adInfo in
// 리워드 획득 시 호출
}
4
광고 타입별 코드 변경
Show 배너 광고
Show 배너 광고
Show 기존 코드 - DaroAds non-reward SDK
Show 기존 코드 - DaroAds non-reward SDK
Copy
Ask AI
let adUnit = DaroAdBannerViewUnit(id: "your_ad_unit_id")
let bannerView = DaroAdBannerView(adUnit: adUnit)
bannerView.adUnit = adUnit
bannerView.delegate = self
bannerView.loadAd()
// DaroAdBannerViewDelegate
func bannerViewDidReceiveAd(_ bannerView: DaroAdBannerView)
func bannerView(_ bannerView: DaroAdBannerView, didFailToReceiveAdWithError error: Error)
// ... 이외 delegate 메서드 구현
Show 기존 코드 - DaroMAds reward SDK
Show 기존 코드 - DaroMAds reward SDK
Copy
Ask AI
let adUnit = DaroMAdUnit(adUnitID: "your_ad_unit_id", format: .banner)
let bannerAdView = DaroMAdView(adUnit: adUnit)
bannerAdView.delegate = self
bannerAdView.impressionDelegate = self
bannerAdView.clickDelegate = self
bannerAdView.loadAd()
// DaroMAdViewDelegate, DaroMAdImpressionDelegate, DaroMAdClickDelegate
func didLoad(_ ad: DaroMAd)
func didFailToLoadAd(for adUnitIdentifier: String, with error: DaroMError)
// ... 이외 delegate 메서드 구현
Copy
Ask AI
let adUnit = DaroAdUnit(unitId: "your_ad_unit_id")
let bannerView = DaroAdBannerView(unit: adUnit, bannerSize: .banner)
bannerView.listener.onAdClicked = { adInfo in
print("[DARO] Listener Sample Banner Ad clicked: \(adInfo)")
}
bannerView.listener.onAdImpression = { adInfo in
print("[DARO] Listener Sample Banner Ad impression: \(adInfo)")
}
bannerView.listener.onAdLoadSuccess = { ad, adInfo in
print("[DARO] Listener Sample Banner Ad loaded: \(ad) \(adInfo)")
}
bannerView.listener.onAdLoadFail = { error in
print("[DARO] Listener Sample Banner Ad failed: \(error)")
}
bannerView.loadAd()
Show 인터스티셜 광고
Show 인터스티셜 광고
Show 기존 코드 - DaroAds non-reward SDK
Show 기존 코드 - DaroAds non-reward SDK
Copy
Ask AI
let adUnit = DaroAdInterstitialUnit(id: "your_ad_unit_id")
DaroInterstitialAd.load(adUnit: adUnit) { result in
switch result {
case .success(let interstitialAd):
interstitialAd.fullScreenDelegate = self
// 광고 표시
interstitialAd.present(from: viewController)
case .failure(let error):
print("인터스티셜 광고 로드 실패: \(error)")
}
}
// DaroFullScreenAdDelegate
func didFailToPresent(with error: Error)
func willPresentFullScreenContent()
func didDismissFullScreenContent()
// ... 이외 delegate 메서드 구현
Show 기존 코드 - DaroMAds reward SDK
Show 기존 코드 - DaroMAds reward SDK
Copy
Ask AI
let adUnit = DaroMAdUnit(adUnitID: "your_ad_unit_id", format: .interstitial)
let interstitialAd = DaroMInterstitialAd(adUnit: adUnit)
interstitialAd.loadingDelegate = self
interstitialAd.displayDelegate = self
interstitialAd.impressionDelegate = self
interstitialAd.clickDelegate = self
interstitialAd.load()
// DaroMAdLoadingDelegate, DaroMAdImpressionDelegate, DaroMAdDisplayDelegate, DaroMAdClickDelegate
func didLoad(_ ad: DaroMAd)
func didFailToLoadAd(for adUnitIdentifier: String, with error: DaroMError)
// ... 이외 delegate 메서드 구현
Copy
Ask AI
let adUnit = DaroAdUnit(unitId: "your_ad_unit_id")
let interstitialAdLoader = DaroInterstitialAdLoader(unit: adUnit)
interstitialAdLoader.listener.onAdLoadSuccess = { ad, adInfo in
print("[DARO] Listener Sample Interstitial Ad loaded: \(ad) \(adInfo)")
}
interstitialAdLoader.listener.onAdLoadFail = { error in
print("[DARO] Listener Sample Interstitial Ad failed: \(error)")
}
interstitialAdLoader.listener.onAdClicked = { adInfo in
print("[DARO] Listener Sample Interstitial Ad clicked: \(adInfo)")
}
interstitialAdLoader.listener.onAdImpression = { adInfo in
print("[DARO] Listener Sample Interstitial Ad impression: \(adInfo)")
}
// 광고 로드
self.daroInterstitialAd = try? await interstitialAdLoader.loadAd()
// 광고 표시 리스너 설정
self.daroInterstitialAd?.interstitialListener.onShown = { adInfo in
print("[DARO] Listener Sample Interstitial Ad shown: \(adInfo)")
}
self.daroInterstitialAd?.interstitialListener.onDismiss = { adInfo in
print("[DARO] Listener Sample Interstitial Ad dismissed: \(adInfo)")
}
self.daroInterstitialAd?.interstitialListener.onFailedToShow = { adInfo, error in
print("[DARO] Listener Sample Interstitial Ad failed to show: \(adInfo) \(error)")
}
Show 리워드 광고
Show 리워드 광고
Show 기존 코드 - DaroAds non-reward SDK
Show 기존 코드 - DaroAds non-reward SDK
Copy
Ask AI
let adUnit = DaroAdRewardedUnit(id: "your_ad_unit_id")
DaroRewardedAd.load(adUnit: adUnit) { result in
switch result {
case .success(let rewardedAd):
rewardedAd.fullScreenDelegate = self
// 광고 표시
rewardedAd.present(from: viewController) { rewardItem in
print("리워드 획득: \(rewardItem.amount) \(rewardItem.type)")
}
case .failure(let error):
print("리워드 광고 로드 실패: \(error)")
}
}
// DaroFullScreenAdDelegate
func didFailToPresent(with error: Error)
func willPresentFullScreenContent()
func didDismissFullScreenContent()
// ... 이외 delegate 메서드 구현
Show 기존 코드 - DaroMAds reward SDK
Show 기존 코드 - DaroMAds reward SDK
Copy
Ask AI
let adUnit = DaroMAdUnit(adUnitID: "your_ad_unit_id", format: .rewarded)
let rewardedAd = DaroMRewardedAd(adUnit: adUnit)
rewardedAd.loadingDelegate = self
rewardedAd.displayDelegate = self
rewardedAd.rewardDelegate = self
rewardedAd.impressionDelegate = self
rewardedAd.clickDelegate = self
rewardedAd.load()
// DaroMRewardedAdDelegate, DaroMAdLoadingDelegate, DaroMAdImpressionDelegate, DaroMAdDisplayDelegate, DaroMAdClickDelegate
func didLoad(_ ad: DaroMAd)
func didFailToLoadAd(for adUnitIdentifier: String, with error: DaroMError)
func didEarnReward(_ reward: DaroMReward)
// ... 이외 delegate 메서드 구현
Copy
Ask AI
let adUnit = DaroAdUnit(unitId: "your_ad_unit_id")
let rewardedAdLoader = DaroRewardedAdLoader(unit: adUnit)
rewardedAdLoader.listener.onAdClicked = { adInfo in
print("[DARO] Listener Sample Rewarded Ad clicked: \(adInfo)")
}
rewardedAdLoader.listener.onAdImpression = { adInfo in
print("[DARO] Listener Sample Rewarded Ad impression: \(adInfo)")
}
rewardedAdLoader.listener.onAdLoadSuccess = { ad, adInfo in
print("[DARO] Listener Sample Rewarded Ad loaded: \(ad) \(adInfo)")
}
rewardedAdLoader.listener.onAdLoadFail = { error in
print("[DARO] Listener Sample Rewarded Ad failed: \(error)")
}
self.daroRewardedAd = try? await rewardedAdLoader.loadAd()
self.daroRewardedAd?.rewardedAdListener.onEarnedReward = { adInfo, rewardedItem in
print("[DARO] Listener Sample Reward Ad earned: \(adInfo) \(rewardedItem)")
}
self.daroRewardedAd?.rewardedAdListener.onShown = { adInfo in
print("[DARO] Listener Sample Reward Ad shown: \(adInfo)")
}
self.daroRewardedAd?.rewardedAdListener.onDismiss = { adInfo in
print("[DARO] Listener Sample Reward Ad dismissed: \(adInfo)")
}
self.daroRewardedAd?.rewardedAdListener.onFailedToShow = { adInfo, error in
print("[DARO] Listener Sample Reward Ad failed to show: \(adInfo) \(error)")
}
Show 앱 오픈 광고
Show 앱 오픈 광고
Show 기존 코드 - DaroAds non-reward SDK
Show 기존 코드 - DaroAds non-reward SDK
Copy
Ask AI
let adUnit = DaroAdAppOpenUnit(id: "your_ad_unit_id")
DaroAppOpenAd.load(adUnit: adUnit) { result in
switch result {
case .success(let appOpenAd):
appOpenAd.fullScreenDelegate = self
// 광고 표시
appOpenAd.present(from: viewController)
case .failure(let error):
print("앱 오픈 광고 로드 실패: \(error)")
}
}
// DaroFullScreenAdDelegate
func didFailToPresent(with error: any Error)
func willPresentFullScreenContent()
func didDismissFullScreenContent()
// ... 이외 delegate 메서드 구현
Show 기존 코드 - DaroMAds reward SDK
Show 기존 코드 - DaroMAds reward SDK
Copy
Ask AI
let adUnit = DaroMAdUnit(adUnitID: "your_ad_unit_id", format: .appOpen)
let appOpenAd = DaroMAppOpenAd(adUnit: adUnit)
appOpenAd.loadingDelegate = self
appOpenAd.displayDelegate = self
appOpenAd.impressionDelegate = self
appOpenAd.clickDelegate = self
appOpenAd.load()
// DaroMAdLoadingDelegate, DaroMAdImpressionDelegate, DaroMAdDisplayDelegate, DaroMAdClickDelegate
func didLoad(_ ad: DaroMAd)
func didFailToLoadAd(for adUnitIdentifier: String, with error: DaroMError)
// ... 이외 delegate 메서드 구현
Copy
Ask AI
let adUnit = DaroAdUnit(unitId: "your_ad_unit_id")
let appOpenAdLoader = DaroAppOpenAdLoader(unit: .appOpenUnit)
appOpenAdLoader.listener.onAdLoadSuccess = { ad, adInfo in
print("[DARO] Listener AppOpenAd loaded: \(ad) \(adInfo)")
}
appOpenAdLoader.listener.onAdLoadFail = { error in
print("[DARO] Listener AppOpenAd failed: \(error)")
}
appOpenAdLoader.listener.onAdClicked = { adInfo in
print("[DARO] Listener AppOpenAd clicked: \(adInfo)")
}
appOpenAdLoader.listener.onAdImpression = { adInfo in
print("[DARO] Listener AppOpenAd impression: \(adInfo)")
}
let appOpenAd = try await appOpenAdLoader.loadAd()
appOpenAd.appOpenAdListener.onShown = { adInfo in
print("[DARO] Listener AppOpenAd shown: \(adInfo)")
}
appOpenAd.appOpenAdListener.onDismiss = { adInfo in
print("[DARO] Listener AppOpenAd dismissed: \(adInfo)")
}
appOpenAd.appOpenAdListener.onFailedToShow = { adInfo, error in
print("[DARO] Listener AppOpenAd failed to show: \(adInfo) \(error)")
}
Show 네이티브 광고
Show 네이티브 광고
Show 기존 코드 - DaroAds non-reward SDK
Show 기존 코드 - DaroAds non-reward SDK
Copy
Ask AI
// 커스텀 네이티브 뷰 생성
final class CustomNativeAdView: DaroNativeAdContentView {
private var titleLabel = UILabel()
private var bodyLabel = UILabel()
private var mediaView = DaroMediaView()
private var callToActionButton = UIButton()
required init() {
super.init()
layout()
bindViews(
headlineLabel: titleLabel,
callToActionButton: callToActionButton,
bodyLabel: bodyLabel,
mediaView: mediaView
)
}
// ... 레이아웃 코드
}
// 사용
let adUnit = DaroNativeAdUnit(id: "your_ad_unit_id")
let nativeAdView = DaroNativeAdView(
adUnit: adUnit,
nativeAdContentViewType: CustomNativeAdView.self
)
nativeAdView.delegate = self
nativeAdView.loadAd()
// DaroNativeAdDelegate
func nativeAdDidRecordClick(_ nativeAd: DaroNativeAd) { }
func nativeAdDidRecordImpression(_ nativeAd: DaroNativeAd) { }
Show 기존 코드 - DaroMAds reward SDK
Show 기존 코드 - DaroMAds reward SDK
Copy
Ask AI
// 커스텀 네이티브 뷰 생성
final class CustomNativeAdView: DaroMNativeAdContentView {
public override var titleLabel: UILabel? {
get { internalTitleLabel }
set { super.titleLabel = newValue }
}
let internalTitleLabel = UILabel()
public override var iconImageView: UIImageView? {
get { internalIconImageView }
set { super.iconImageView = newValue }
}
let internalIconImageView = UIImageView()
public override var callToActionButton: UIButton? {
get { internalCallToActionButton }
set { super.callToActionButton = newValue }
}
let internalCallToActionButton = UIButton()
required init() {
super.init()
layout()
let binder = DaroMNativeAdViewBinder { builder in
builder.titleLabelTag = 1001
builder.builder.iconImageViewTag = 1004
builder.callToActionButtonTag = 1007
}
bindViews(with: binder)
}
// ... 레이아웃 코드
}
// 사용
let adUnit = DaroMAdUnit(adUnitID: "your_ad_unit_id", format: .native)
let nativeAdView = CustomNativeAdView()
nativeAdView.loadAd()
Copy
Ask AI
// 커스텀 네이티브 뷰 생성
final class CustomNativeAdView: DaroAdNativeView {
private var titleLabel = UILabel()
private var advertiserLabel = UILabel()
private var bodyLabel = UILabel()
private var iconImageView = UIImageView()
private var mediaContentView = UIView()
private var callToActionButton = UIButton()
override init(unit: DaroAdUnit) {
super.init(unit: unit)
layout()
// 뷰 바인딩
bindViews(
titleLabel: titleLabel,
advertiserLabel: advertiserLabel,
bodyLabel: bodyLabel,
iconImageView: iconImageView,
mediaContentView: mediaContentView,
callToActionButton: callToActionButton
)
}
// ... 레이아웃 코드
}
// 사용
let adUnit = DaroAdUnit(unitId: "your_ad_unit_id")
let nativeAdView = CustomNativeAdView(unit: adUnit)
view.addSubview(nativeAdView)
// 리스너 설정
nativeAdView.listener.onAdLoadSuccess = { ad, adInfo in
print("[DARO] Native Ad loaded: \(ad) \(adInfo)")
}
nativeAdView.listener.onAdLoadFail = { error in
print("[DARO] Native Ad failed: \(error)")
}
nativeAdView.listener.onAdClicked = { adInfo in
print("[DARO] Native Ad clicked: \(adInfo)")
}
nativeAdView.listener.onAdImpression = { adInfo in
print("[DARO] Native Ad impression: \(adInfo)")
}
nativeAdView.loadAd()
Show 라이트 팝업 광고 (신규)
Show 라이트 팝업 광고 (신규)
라이트 팝업 광고는 새로운 SDK에서 추가된 기능입니다.
Copy
Ask AI
let adUnit = DaroAdUnit(unitId: "your_ad_unit_id")
// 라이트 팝업 설정
let configuration = DaroLightPopupConfiguration()
// 원하는 설정 수정
let lightPopupAdLoader = DaroLightPopupAdLoader(unit: adUnit)
lightPopupAdLoader.listener.onAdClicked = { adInfo in
print("[DARO] Listener Sample LightPopup Ad clicked: \(adInfo)")
}
lightPopupAdLoader.listener.onAdImpression = { adInfo in
print("[DARO] Listener Sample LightPopup Ad impression: \(adInfo)")
}
lightPopupAdLoader.listener.onAdLoadSuccess = { [weak self] ad, adInfo in
print("[DARO] Listener Sample Light Popup Ad loaded: \(ad) \(adInfo)")
self?.daroLightPopupAd = ad
self?.daroLightPopupAd?.lightPopupAdListener.onShown = { adInfo in
print("[DARO] Listener Sample Light Popup Ad shown: \(adInfo)")
}
self?.daroLightPopupAd?.lightPopupAdListener.onDismiss = { adInfo in
print("[DARO] Listener Sample Light Popup Ad dismissed: \(adInfo)")
}
self?.daroLightPopupAd?.lightPopupAdListener.onFailedToShow = { adInfo, error in
print("[DARO] Listener Sample Light Popup Ad failed to show: \(adInfo) \(error)")
}
}
lightPopupAdLoader.listener.onAdLoadFail = { error in
print("[DARO] Listener Sample LightPopup Ad failed: \(error)")
}
lightPopupAdLoader.loadAd()
마이그레이션 체크리스트
1
프로젝트 설정 변경 확인
- 현재 사용 중인 SDK 버전 확인 (
DaroAds또는DaroMAds) - 기존 광고 단위 ID 목록 정리
- 설정 파일 적용 (
daro-service.json->ios-daro-key.txt) - Info.plist 에 DaroAppKey 추가 ( 다로 대시보드에서 App ID 확인 )
2
코드 변경사항
- Podfile 업데이트
- SDK 초기화 코드 수정
- 광고 단위 생성 코드 수정
- 델리게이트 메서드 -> 리스너 등록 방식 변경
- 광고 포멧별 코드 변경 사항 반영
3
테스트 항목
- SDK 초기화 성공 확인
- 각 광고 타입별 로드/표시 테스트
- 광고 상호작용 (클릭, 노출) 테스트
- 리스너 호출 확인
문제 해결
1
자주 발생하는 문제
Show SDK 초기화 실패
Show SDK 초기화 실패
문제: DaroAppKey가 Info.plist에 없음
Copy
Ask AI
<key>DaroAppKey</key>
<string>your_app_key_here</string>
Show 설정 파일 오류
Show 설정 파일 오류
문제: ios-daro-key.txt 파일을 찾을 수 없음
Show 광고 로드 실패
Show 광고 로드 실패
문제: 광고 단위 ID가 올바르지 않음
이 마이그레이션 가이드를 따라 진행하시면 기존 SDK에서 새로운 통합 SDK로 성공적으로 마이그레이션할 수 있습니다. 추가 질문이나 문제가 있으시면 DARO 기술 지원팀에 문의해 주세요.

