獎勵廣告自訂事件
透過集合功能整理內容
你可以依據偏好儲存及分類內容。
必要條件
完成自訂事件設定。
要求顯示獎勵廣告
當刊登序列中介服務鏈執行到自訂事件委刊項,系統會以您在建立自訂事件時指定的類別名稱,呼叫 loadRewarded:adConfiguration:completionHandler: 方法。在本例中,該方法位於 SampleCustomEvent
,會接著呼叫 SampleCustomEventRewarded
中的 loadRewarded:adConfiguration:completionHandler:
方法。
如要請求獎勵廣告,請建立或修改導入 GADMediationAdapter
和 loadRewarded:adConfiguration:completionHandler:
的類別。如果已有擴充 GADMediationAdapter
的類別,請在該處實作 loadRewarded:adConfiguration:completionHandler:
。此外,請建立新類別來導入 GADMediationRewardedAd
。
在我們的自訂事件範例中,SampleCustomEvent
會實作 GADMediationAdapter
介面,然後委派給 SampleCustomEventRewarded
。
Swift
import GoogleMobileAds
class SampleCustomEvent: NSObject, MediationAdapter {
fileprivate var rewardedAd: SampleCustomEventRewarded?
...
func loadRewarded(
for adConfiguration: MediationRewardedAdConfiguration,
completionHandler: @escaping GADMediationRewardedLoadCompletionHandler
) {
self.rewardedAd = SampleCustomEventRewarded()
self.rewardedAd?.loadRewarded(
for: adConfiguration, completionHandler: completionHandler)
}
}
Objective-C
#import "SampleCustomEvent.h"
@implementation SampleCustomEvent
...
SampleCustomEventRewarded *sampleRewarded;
- (void)loadRewardedForAdConfiguration:
(GADMediationRewardedAdConfiguration *)adConfiguration
completionHandler:
(GADMediationRewardedLoadCompletionHandler)
completionHandler {
sampleRewarded = [[SampleCustomEventRewarded alloc] init];
[sampleRewarded loadRewardedForAdConfiguration:adConfiguration
completionHandler:completionHandler];
}
SampleCustomEventRewarded
負責處理以下工作:
在 AdMob UI 中定義的選用參數會包含在廣告設定。
使用 adConfiguration.credentials.settings[@"parameter"]
即可存取。這項參數通常是廣告單元 ID,廣告聯播網 SDK 在例項化廣告物件時會用到。
Swift
class SampleCustomEventRewarded: NSObject, MediationRewardedAd {
/// The Sample Ad Network rewarded ad.
var nativeAd: SampleRewarded?
/// The ad event delegate to forward ad rendering events to Google Mobile Ads SDK.
var delegate: MediationRewardedAdEventDelegate?
/// Completion handler called after ad load.
var completionHandler: GADMediationRewardedLoadCompletionHandler?
func loadRewarded(
for adConfiguration: MediationRewardedAdConfiguration,
completionHandler: @escaping GADMediationRewardedLoadCompletionHandler
) {
rewarded = SampleRewarded.init(
adUnitID: adConfiguration.credentials.settings["parameter"] as? String)
rewarded?.delegate = self
let adRequest = SampleAdRequest()
adRequest.testMode = adConfiguration.isTestRequest
self.completionHandler = completionHandler
rewarded?.fetchAd(adRequest)
}
}
Objective-C
#import "SampleCustomEventRewarded.h"
@interface SampleCustomEventRewarded () <SampleRewardedAdDelegate,
GADMediationRewardedAd> {
/// The sample rewarded ad.
SampleRewarded *_rewardedAd;
/// The completion handler to call when the ad loading succeeds or fails.
GADMediationRewardedLoadCompletionHandler _loadCompletionHandler;
/// The ad event delegate to forward ad rendering events to Google Mobile Ads SDK.
id <GADMediationRewardedAdEventDelegate> _adEventDelegate;
}
@end
- (void)loadRewardedAdForAdConfiguration:(GADMediationRewardedAdConfiguration *)adConfiguration
completionHandler:
(GADMediationRewardedLoadCompletionHandler)completionHandler {
__block atomic_flag completionHandlerCalled = ATOMIC_FLAG_INIT;
__block GADMediationRewardedLoadCompletionHandler originalCompletionHandler =
[completionHandler copy];
_loadCompletionHandler = ^id<GADMediationRewardedAdEventDelegate>(
_Nullable id<GADMediationRewardedAd> ad, NSError *_Nullable error) {
// Only allow completion handler to be called once.
if (atomic_flag_test_and_set(&completionHandlerCalled)) {
return nil;
}
id<GADMediationRewardedAdEventDelegate> delegate = nil;
if (originalCompletionHandler) {
// Call original handler and hold on to its return value.
delegate = originalCompletionHandler(ad, error);
}
// Release reference to handler. Objects retained by the handler will also be released.
originalCompletionHandler = nil;
return delegate;
};
NSString *adUnit = adConfiguration.credentials.settings[@"parameter"];
_rewardedAd = [[SampleRewardedAd alloc] initWithAdUnitID:adUnit];
_rewardedAd.delegate = self;
SampleAdRequest *adRequest = [[SampleAdRequest alloc] init];
adRequest.testMode = adConfiguration.isTestRequest;
[_rewardedAd fetchAd:adRequest];
}
無論廣告擷取成功或發生錯誤,您都會呼叫 GADMediationRewardedLoadCompletionHandler
。如果成功,請傳遞實作 GADMediationRewardedAd
的類別,並為錯誤參數提供 nil
值;如果失敗,請傳遞您遇到的錯誤。
這些方法通常是在轉接程式導入的第三方 SDK 回呼中執行。以本例來說,範例 SDK 的 SampleRewardedAdDelegate
含有相關回呼:
Swift
func rewardedDidLoad(_ interstitial: SampleRewarded) {
if let handler = completionHandler {
delegate = handler(self, nil)
}
}
func rewarded(
rewarded: SampleRewarded, didFailToLoadAdWith errorCode: SampleErrorCode
) {
let error =
SampleCustomEventUtils.SampleCustomEventErrorWithCodeAndDescription(
code: SampleCustomEventErrorCode
.SampleCustomEventErrorAdLoadFailureCallback,
description:
"Sample SDK returned an ad load failure callback with error code: \(errorCode)"
)
if let handler = completionHandler {
delegate = handler(nil, error)
}
}
Objective-C
- (void)rewardedDidLoad:(SampleRewarded *)rewarded {
_adEventDelegate = _loadCompletionHandler(self, nil);
}
- (void)rewarded:(SampleInterstitial *)rewarded
didFailToLoadAdWithErrorCode:(SampleErrorCode)errorCode {
NSError *error = SampleCustomEventErrorWithCodeAndDescription(
SampleCustomEventErrorAdLoadFailureCallback,
[NSString stringWithFormat:@"Sample SDK returned an ad load failure "
@"callback with error code: %@",
errorCode]);
_adEventDelegate = _loadCompletionHandler(nil, error);
}
GADMediationrewardedAd
須導入 present(viewController:)
方法才能顯示廣告:
Swift
func present(from viewController: UIViewController) {
if let rewarded = rewarded, rewarded.isRewardedLoaded {
rewarded.show()
}
}
Objective-C
- (void)presentFromViewController:(UIViewController *)viewController {
if ([_rewardedAd isRewardedLoaded]) {
[_rewardedAd show];
} else {
NSError *error = SampleCustomEventErrorWithCodeAndDescription(
SampleCustomEventErrorAdNotLoaded,
[NSString stringWithFormat:
@"The rewarded ad failed to present because the ad was not loaded."]);
[_adEventDelegate didFailToPresentWithError:error]
}
}
將中介服務事件轉送至 Google Mobile Ads SDK
使用已載入的廣告呼叫 GADMediationRewardedLoadCompletionHandler
後,轉接程式可使用傳回的 GADMediationRewardedAdEventDelegate
委派物件,將呈現事件從第三方 SDK 轉送至 Google Mobile Ads SDK。SampleCustomEventRewarded
類別會實作 SampleRewardedAdDelegate
通訊協定,將回呼從範例廣告聯播網轉送到 Google Mobile Ads SDK。
自訂事件應盡量將這些回呼轉送至 Google Mobile Ads SDK,這樣應用程式才能收到相應的事件通知。以下是回呼使用範例:
Swift
func rewardedAdDidPresent(_ rewarded: SampleRewardedAd) {
delegate?.willPresentFullScreenVideo()
delegate?.didStartVideo()
}
func rewardedAdUserDidEarnReward(_ rewarded: SampleRewardedAd) {
AdReward aReward = AdReward("", rewarded)
delegate.didRewardUser()
}
Objective-C
- (void)rewardedAdDidPresent:(SampleRewardedAd *)rewardedAd {
[_adEventDelegate willPresentFullScreenView];
[_adEventDelegate didStartVideo];
}
- (void)rewardedAd:(nonnull SampleRewardedAd *)rewardedAd
userDidEarnReward:(NSUInteger)reward {
GADAdReward *aReward = [[GADAdReward alloc]
initWithRewardType:@""
rewardAmount:[NSDecimalNumber numberWithUnsignedInt:reward]];
[_adEventDelegate didRewardUserWithReward];
}
到這裡就完成獎勵廣告的自訂事件導入設定!GitHub 上有完整的範例可參考。範例可直接用於支援的廣告聯播網,您也可修改現有範例,顯示自訂事件獎勵廣告。
除非另有註明,否則本頁面中的內容是採用創用 CC 姓名標示 4.0 授權,程式碼範例則為阿帕契 2.0 授權。詳情請參閱《Google Developers 網站政策》。Java 是 Oracle 和/或其關聯企業的註冊商標。
上次更新時間:2025-09-02 (世界標準時間)。
[null,null,["上次更新時間:2025-09-02 (世界標準時間)。"],[[["\u003cp\u003eTo request a rewarded ad through a custom event, implement the \u003ccode\u003eGADMediationAdapter\u003c/code\u003e and \u003ccode\u003eloadRewarded:adConfiguration:completionHandler:\u003c/code\u003e methods.\u003c/p\u003e\n"],["\u003cp\u003eCreate a separate class that implements \u003ccode\u003eGADMediationRewardedAd\u003c/code\u003e to handle ad loading, the \u003ccode\u003eGADMediationRewardedAd\u003c/code\u003e protocol, and ad event callbacks to the Google Mobile Ads SDK.\u003c/p\u003e\n"],["\u003cp\u003eUse the \u003ccode\u003eGADMediationRewardedLoadCompletionHandler\u003c/code\u003e to notify the Google Mobile Ads SDK about ad load success or failure.\u003c/p\u003e\n"],["\u003cp\u003eForward ad events from the third-party ad network SDK to the Google Mobile Ads SDK using the \u003ccode\u003eGADMediationRewardedAdEventDelegate\u003c/code\u003e object.\u003c/p\u003e\n"],["\u003cp\u003eThe provided code snippets and the full example on GitHub can be used to create or modify custom events for rewarded ads.\u003c/p\u003e\n"]]],["To implement rewarded ads, create a class extending `GADMediationAdapter` and `GADMediationRewardedAd`, exemplified by `SampleCustomEvent` and `SampleCustomEventRewarded`. `SampleCustomEvent` calls `loadRewarded:` in `SampleCustomEventRewarded`, which loads the ad, implements `GADMediationRewardedAd`, and manages event callbacks. Ad configuration parameters, like ad unit IDs, can be accessed. After loading, `GADMediationRewardedLoadCompletionHandler` reports success or failure. `present(viewController:)` displays the ad. Forward relevant presentation events from the ad network SDK to the Google Mobile Ads SDK.\n"],null,["Prerequisites\n\nComplete the [custom events setup](/admob/ios/custom-events/setup).\n\nRequest a rewarded ad\n\nWhen the custom event line item is reached in the waterfall mediation chain,\nthe loadRewarded:adConfiguration:completionHandler: method is called on the\nclass name you provided when [creating a custom\nevent](/admob/ios/custom-events/setup#create). In this case,\nthat method is in `SampleCustomEvent`, which then calls\nthe `loadRewarded:adConfiguration:completionHandler:` method in\n`SampleCustomEventRewarded`.\n\nTo request a rewarded ad, create or modify a class that implements\n`GADMediationAdapter` and `loadRewarded:adConfiguration:completionHandler:`. If\na class that extends `GADMediationAdapter` already exists, implement\n`loadRewarded:adConfiguration:completionHandler:` there. Additionally,\ncreate a new class to implement `GADMediationRewardedAd`.\n\nIn our custom event example,\n[`SampleCustomEvent`](//github.com/googleads/googleads-mobile-ios-mediation/blob/main/example/CustomEvent/SampleCustomEvent.m) implements\nthe `GADMediationAdapter` interface and then delegates to\n`SampleCustomEventRewarded`. \n\nSwift \n\n```swift\nimport GoogleMobileAds\n\nclass SampleCustomEvent: NSObject, MediationAdapter {\n\n fileprivate var rewardedAd: SampleCustomEventRewarded?\n ...\n\n func loadRewarded(\n for adConfiguration: MediationRewardedAdConfiguration,\n completionHandler: @escaping GADMediationRewardedLoadCompletionHandler\n ) {\n self.rewardedAd = SampleCustomEventRewarded()\n self.rewardedAd?.loadRewarded(\n for: adConfiguration, completionHandler: completionHandler)\n }\n}\n```\n\nObjective-C \n\n```objective-c\n#import \"SampleCustomEvent.h\"\n\n@implementation SampleCustomEvent\n...\n\nSampleCustomEventRewarded *sampleRewarded;\n\n- (void)loadRewardedForAdConfiguration:\n (GADMediationRewardedAdConfiguration *)adConfiguration\n completionHandler:\n (GADMediationRewardedLoadCompletionHandler)\n completionHandler {\n sampleRewarded = [[SampleCustomEventRewarded alloc] init];\n [sampleRewarded loadRewardedForAdConfiguration:adConfiguration\n completionHandler:completionHandler];\n}\n```\n\n`SampleCustomEventRewarded` is responsible for the following tasks:\n\n- Loading the rewarded ad.\n\n- Implementing the `GADMediationRewardedAd` protocol.\n\n- Receiving and reporting ad event callbacks to Google Mobile Ads SDK.\n\nThe optional parameter defined in the AdMob UI is\nincluded in the ad configuration.\nThe parameter can be accessed through\n`adConfiguration.credentials.settings[@\"parameter\"]`. This parameter is\ntypically an ad unit identifier that an ad network SDK requires when\ninstantiating an ad object. \n\nSwift \n\n```swift\nclass SampleCustomEventRewarded: NSObject, MediationRewardedAd {\n /// The Sample Ad Network rewarded ad.\n var nativeAd: SampleRewarded?\n\n /// The ad event delegate to forward ad rendering events to Google Mobile Ads SDK.\n var delegate: MediationRewardedAdEventDelegate?\n\n /// Completion handler called after ad load.\n var completionHandler: GADMediationRewardedLoadCompletionHandler?\n\n func loadRewarded(\n for adConfiguration: MediationRewardedAdConfiguration,\n completionHandler: @escaping GADMediationRewardedLoadCompletionHandler\n ) {\n rewarded = SampleRewarded.init(\n adUnitID: adConfiguration.credentials.settings[\"parameter\"] as? String)\n rewarded?.delegate = self\n let adRequest = SampleAdRequest()\n adRequest.testMode = adConfiguration.isTestRequest\n self.completionHandler = completionHandler\n rewarded?.fetchAd(adRequest)\n }\n}\n```\n\nObjective-C \n\n```objective-c\n#import \"SampleCustomEventRewarded.h\"\n\n@interface SampleCustomEventRewarded () \u003cSampleRewardedAdDelegate,\n GADMediationRewardedAd\u003e {\n /// The sample rewarded ad.\n SampleRewarded *_rewardedAd;\n\n /// The completion handler to call when the ad loading succeeds or fails.\n GADMediationRewardedLoadCompletionHandler _loadCompletionHandler;\n\n /// The ad event delegate to forward ad rendering events to Google Mobile Ads SDK.\n id \u003cGADMediationRewardedAdEventDelegate\u003e _adEventDelegate;\n}\n@end\n\n- (void)loadRewardedAdForAdConfiguration:(GADMediationRewardedAdConfiguration *)adConfiguration\n completionHandler:\n (GADMediationRewardedLoadCompletionHandler)completionHandler {\n __block atomic_flag completionHandlerCalled = ATOMIC_FLAG_INIT;\n __block GADMediationRewardedLoadCompletionHandler originalCompletionHandler =\n [completionHandler copy];\n\n _loadCompletionHandler = ^id\u003cGADMediationRewardedAdEventDelegate\u003e(\n _Nullable id\u003cGADMediationRewardedAd\u003e ad, NSError *_Nullable error) {\n // Only allow completion handler to be called once.\n if (atomic_flag_test_and_set(&completionHandlerCalled)) {\n return nil;\n }\n\n id\u003cGADMediationRewardedAdEventDelegate\u003e delegate = nil;\n if (originalCompletionHandler) {\n // Call original handler and hold on to its return value.\n delegate = originalCompletionHandler(ad, error);\n }\n\n // Release reference to handler. Objects retained by the handler will also be released.\n originalCompletionHandler = nil;\n\n return delegate;\n };\n\n NSString *adUnit = adConfiguration.credentials.settings[@\"parameter\"];\n _rewardedAd = [[SampleRewardedAd alloc] initWithAdUnitID:adUnit];\n _rewardedAd.delegate = self;\n SampleAdRequest *adRequest = [[SampleAdRequest alloc] init];\n adRequest.testMode = adConfiguration.isTestRequest;\n [_rewardedAd fetchAd:adRequest];\n}\n```\n\nWhether the ad is successfully fetched or encounters an error, you\nwould call `GADMediationRewardedLoadCompletionHandler`. In the event of\nsuccess, pass through the class that implements `GADMediationRewardedAd`\nwith a `nil` value for the error parameter; in the event of failure, pass\nthrough the error you encountered.\n\nTypically, these methods are implemented inside callbacks from the\nthird-party SDK your adapter implements. For this example, the Sample SDK\nhas a `SampleRewardedAdDelegate` with relevant callbacks: \n\nSwift \n\n```swift\nfunc rewardedDidLoad(_ interstitial: SampleRewarded) {\n if let handler = completionHandler {\n delegate = handler(self, nil)\n }\n}\n\nfunc rewarded(\n rewarded: SampleRewarded, didFailToLoadAdWith errorCode: SampleErrorCode\n) {\n let error =\n SampleCustomEventUtils.SampleCustomEventErrorWithCodeAndDescription(\n code: SampleCustomEventErrorCode\n .SampleCustomEventErrorAdLoadFailureCallback,\n description:\n \"Sample SDK returned an ad load failure callback with error code: \\(errorCode)\"\n )\n if let handler = completionHandler {\n delegate = handler(nil, error)\n }\n}\n```\n\nObjective-C \n\n```objective-c\n- (void)rewardedDidLoad:(SampleRewarded *)rewarded {\n _adEventDelegate = _loadCompletionHandler(self, nil);\n}\n\n- (void)rewarded:(SampleInterstitial *)rewarded\n didFailToLoadAdWithErrorCode:(SampleErrorCode)errorCode {\n NSError *error = SampleCustomEventErrorWithCodeAndDescription(\n SampleCustomEventErrorAdLoadFailureCallback,\n [NSString stringWithFormat:@\"Sample SDK returned an ad load failure \"\n @\"callback with error code: %@\",\n errorCode]);\n _adEventDelegate = _loadCompletionHandler(nil, error);\n}\n```\n\n`GADMediationrewardedAd` requires implementing a `present(viewController:)`\nmethod to display the ad: \n\nSwift \n\n```swift\nfunc present(from viewController: UIViewController) {\n if let rewarded = rewarded, rewarded.isRewardedLoaded {\n rewarded.show()\n }\n}\n```\n\nObjective-C \n\n```objective-c\n- (void)presentFromViewController:(UIViewController *)viewController {\n if ([_rewardedAd isRewardedLoaded]) {\n [_rewardedAd show];\n } else {\n NSError *error = SampleCustomEventErrorWithCodeAndDescription(\n SampleCustomEventErrorAdNotLoaded,\n [NSString stringWithFormat:\n @\"The rewarded ad failed to present because the ad was not loaded.\"]);\n [_adEventDelegate didFailToPresentWithError:error]\n }\n}\n```\n\nForward mediation events to Google Mobile Ads SDK\n\nOnce you've called `GADMediationRewardedLoadCompletionHandler` with a loaded\nad, the returned `GADMediationRewardedAdEventDelegate` delegate object can\nthen be used by the adapter to forward presentation events from the third-party\nSDK to Google Mobile Ads SDK. The `SampleCustomEventRewarded` class\nimplements the `SampleRewardedAdDelegate` protocol to forward callbacks from\nthe sample ad network to Google Mobile Ads SDK.\n\nIt's important that your custom event forwards as many of these callbacks as\npossible, so that your app receives these equivalent events from Google Mobile Ads SDK.\nHere's an example of using callbacks: \n\nSwift \n\n```swift\nfunc rewardedAdDidPresent(_ rewarded: SampleRewardedAd) {\n delegate?.willPresentFullScreenVideo()\n delegate?.didStartVideo()\n}\n\nfunc rewardedAdUserDidEarnReward(_ rewarded: SampleRewardedAd) {\n AdReward aReward = AdReward(\"\", rewarded)\n delegate.didRewardUser()\n}\n```\n\nObjective-C \n\n```objective-c\n- (void)rewardedAdDidPresent:(SampleRewardedAd *)rewardedAd {\n [_adEventDelegate willPresentFullScreenView];\n [_adEventDelegate didStartVideo];\n}\n\n- (void)rewardedAd:(nonnull SampleRewardedAd *)rewardedAd\n userDidEarnReward:(NSUInteger)reward {\n GADAdReward *aReward = [[GADAdReward alloc]\n initWithRewardType:@\"\"\n rewardAmount:[NSDecimalNumber numberWithUnsignedInt:reward]];\n [_adEventDelegate didRewardUserWithReward];\n}\n```\n\nThis completes the custom events implementation for rewarded ads. The full\nexample is available on\n[GitHub](//github.com/googleads/googleads-mobile-ios-mediation/tree/master/example/CustomEvent).\nYou can use it with an ad network that is already supported or modify it to\ndisplay custom event rewarded ads."]]