কাস্টম বিজ্ঞাপন ফর্ম্যাট
সিস্টেম-সংজ্ঞায়িত বিজ্ঞাপনগুলোর মতোই, কাস্টম নেটিভ বিজ্ঞাপন ফরম্যাটগুলোও GADAdLoader অবজেক্ট ব্যবহার করে লোড করা হয়। একটি GADAdLoader ইনিশিয়ালাইজ করার সময় adTypes অ্যারেতে GADAdLoaderAdTypeCustomNative কনস্ট্যান্টটি অন্তর্ভুক্ত করলে, এটি বিজ্ঞাপন লোড করার সময় কাস্টম নেটিভ ফরম্যাটের জন্য অনুরোধ করতে কনফিগার করা হবে।
GADCustomNativeAdLoaderDelegate
কাস্টম ফরম্যাট লোড করার প্রোটোকলের দুটি পদ্ধতি রয়েছে। প্রথমটি GADAdLoader ব্যবহার করে এটি খুঁজে বের করার জন্য যে, কোন ফরম্যাট আইডিগুলোর জন্য অনুরোধ করা উচিত:
সুইফট
public func customNativeAdFormatIDs(for adLoader: AdLoader) -> [Any]
উদ্দেশ্য-সি
- (NSArray *)customNativeAdFormatIDsForAdLoader:(AdLoader *)adLoader;
প্রতিটি কাস্টম নেটিভ বিজ্ঞাপন ফরম্যাটের একটি সংশ্লিষ্ট ফরম্যাট আইডি থাকে যা এটিকে শনাক্ত করে। যখন এই মেথডটি কল করা হয়, তখন আপনার অ্যাপের উচিত একটি অ্যারে রিটার্ন করা, যাতে এটি প্রদর্শন করতে প্রস্তুত বিজ্ঞাপনগুলোর ফরম্যাট আইডিগুলো থাকবে।
কাস্টম নেটিভ বিজ্ঞাপনটি লোড হয়ে গেলে দ্বিতীয় বার্তাটি পাঠানো হয়, অনেকটা সিস্টেম-সংজ্ঞায়িত ফরম্যাটগুলোর মতোই:
সুইফট
public func adLoader(_ adLoader: AdLoader, didReceive customNativeAd: CustomNativeAd)
উদ্দেশ্য-সি
- (void)adLoader:(AdLoader *)adLoader didReceiveCustomNativeAd:(CustomNativeAd *)customNativeAd;
ফরম্যাট আইডি
কাস্টম নেটিভ অ্যাড ফরম্যাটগুলিকে স্বতন্ত্রভাবে চিহ্নিত করতে ব্যবহৃত ফরম্যাট আইডিগুলি অ্যাড ম্যানেজার UI-এর নেটিভ সেকশনের ডেলিভারি ড্রপডাউনের ভিতরে পাওয়া যাবে:

প্রতিটি কাস্টম নেটিভ অ্যাডের ফরম্যাট আইডি তার নামের পাশে দেখা যায়। নামগুলোর কোনো একটিতে ক্লিক করলে একটি ডিটেইলস স্ক্রিনে নিয়ে যাওয়া হয়, যেখানে ফরম্যাটটির ফিল্ডগুলো সম্পর্কে তথ্য দেখানো হয়:

এখান থেকে স্বতন্ত্র ফিল্ড যোগ, সম্পাদনা এবং অপসারণ করা যায়। প্রতিটি অ্যাসেটের নামটি নোট করুন। আপনার কাস্টম নেটিভ বিজ্ঞাপন ফরম্যাট প্রদর্শন করার সময় প্রতিটি অ্যাসেটের ডেটা পাওয়ার জন্য এই নামটিই হলো মূল চাবিকাঠি।
কাস্টম নেটিভ বিজ্ঞাপন ফর্ম্যাট প্রদর্শন করা হচ্ছে
কাস্টম নেটিভ বিজ্ঞাপন ফরম্যাটগুলো সিস্টেম-সংজ্ঞায়িত ফরম্যাট থেকে এই কারণে আলাদা যে, প্রকাশকদের একটি বিজ্ঞাপন তৈরির জন্য প্রয়োজনীয় অ্যাসেটগুলোর নিজস্ব তালিকা নির্ধারণ করার ক্ষমতা থাকে। এই কারণে, কাস্টম নেটিভ বিজ্ঞাপন প্রদর্শনের প্রক্রিয়াটি সিস্টেম-সংজ্ঞায়িত ফরম্যাটের প্রক্রিয়া থেকে কয়েকটি দিক দিয়ে ভিন্ন হয়:
- যেহেতু
GADCustomNativeAdআপনার তৈরি করা যেকোনো কাস্টম নেটিভ অ্যাড ফরম্যাট পরিচালনা করার জন্য ডিজাইন করা হয়েছে, তাই এতে কোনো নেমড অ্যাসেট অ্যাক্সেসর নেই। এর পরিবর্তে, এটিimageForKey:এবংstringForKey:এর মতো মেথড অফার করে, যেগুলো আর্গুমেন্ট হিসেবে ফিল্ডের নামটি গ্রহণ করে। -
GADCustomNativeAdসাথে ব্যবহারের জন্যGADNativeAdViewমতো কোনো ডেডিকেটেড অ্যাড ভিউ ক্লাস নেই। আপনার ইউজার এক্সপেরিয়েন্সের জন্য যেটা সুবিধাজনক, আপনি সেই ভিউটিই ব্যবহার করতে পারেন। - যেহেতু কোনো ডেডিকেটেড অ্যাড ভিউ ক্লাস নেই, তাই বিজ্ঞাপনের অ্যাসেটগুলো দেখানোর জন্য ব্যবহৃত কোনো ভিউ রেজিস্টার করার প্রয়োজন নেই।
এখানে একটি বিজ্ঞাপন দৃশ্যের উদাহরণ দেওয়া হল যা একটি সাধারণ কাস্টম নেটিভ বিজ্ঞাপন প্রদর্শন করতে সক্ষম:
MySimpleNativeAdView.h
সুইফট
import UIKit import GoogleMobileAds /// Custom native ad view class with format ID 10063170. class MySimpleNativeAdView: UIView { /// Weak references to this ad's asset views. @IBOutlet weak var headlineView: UILabel! @IBOutlet weak var mainImageView: UIImageView! @IBOutlet weak var captionView: UILabel! ... /// Populates the ad view with the custom native ad object. func populateWithCustomNativeAd(_ customNativeAd: CustomNativeAd) { ... } }
উদ্দেশ্য-সি
@import UIKit; @import GoogleMobileAds; /// View representing a custom native ad format with format ID 10063170. @interface MySimpleNativeAdView : UIView // Weak references to this ad's asset views. @property(weak, nonatomic) IBOutlet UILabel *headlineView; @property(weak, nonatomic) IBOutlet UIImageView *mainImageView; @property(weak, nonatomic) IBOutlet UILabel *captionView; /// Populates the ad view with the custom native ad object. - (void)populateWithCustomNativeAd:(GADCustomNativeAd *)customNativeAd; @end
MySimpleNativeAdView.m (উদ্ধৃতাংশ)
সুইফট
... func populateWithCustomNativeAd(_ customNativeAd: CustomNativeAd) { self.customNativeAd = customNativeAd // Populate the custom native ad assets. headlineView.text = self.customNativeAd.stringForKey("Headline") mainImageView.image = self.customNativeAd.imageForKey("MainImage")?.image captionView.text = self.customNativeAd.stringForKey("Caption") } ...
উদ্দেশ্য-সি
... - (void)populateWithCustomNativeAd:(GADCustomNativeAd *)customNativeAd { self.customNativeAd = customNativeAd; // Populate the custom native ad assets. self.headlineView.text = [customNativeAd stringForKey:@"Headline"]; self.mainImageView.image = [customNativeAd imageForKey:@"MainImage"].image; self.captionView.text = [customNativeAd stringForKey:@"Caption"]; } ...
AdChoices আইকনটি রেন্ডার করুন
ডিজিটাল পরিষেবা আইন (DSA) সমর্থনের অংশ হিসেবে, ইউরোপীয় অর্থনৈতিক অঞ্চলে (EEA) পরিবেশিত রিজার্ভেশন বিজ্ঞাপনগুলিতে একটি AdChoices আইকন এবং Google-এর 'এই বিজ্ঞাপন সম্পর্কে' পৃষ্ঠার একটি লিঙ্ক থাকা আবশ্যক। কাস্টম নেটিভ বিজ্ঞাপন প্রয়োগ করার সময়, AdChoices আইকনটি রেন্ডার করার দায়িত্ব আপনার। মূল বিজ্ঞাপন অ্যাসেটগুলি রেন্ডার করার সময় AdChoices আইকনটি রেন্ডার করা এবং এর জন্য ক্লিক লিসেনার সেট করার পদক্ষেপ নেওয়া গুরুত্বপূর্ণ।
নিম্নলিখিত উদাহরণটি AdChoices আইকনটি রেন্ডার করে এবং উপযুক্ত ক্লিক আচরণ কনফিগার করে।
সুইফট
class MySimpleNativeAdView: UIView {
@IBOutlet weak var adChoicesView: UIImageView!
override func awakeFromNib() {
super.awakeFromNib()
// Enable clicks on AdChoices.
adChoicesView.addGestureRecognizer(
UITapGestureRecognizer(
target: self,
action: #selector(performClickOnAdChoices(_:))))
adChoicesView.isUserInteractionEnabled = true
}
@objc func performClickOnAdChoices(_ sender: UIImage!) {
customNativeAd.performClickOnAsset(withKey:
NativeAssetIdentifier.adChoicesViewAsset.rawValue)
}
func populate(withCustomNativeAd customNativeAd: CustomNativeAd) {
// Render the AdChoices image.
let adChoicesKey = NativeAssetIdentifier.adChoicesViewAsset.rawValue
let adChoicesImage = customNativeAd.image(forKey: adChoicesKey)?.image
adChoicesView.image = adChoicesImage
adChoicesView.isHidden = adChoicesImage == nil
...
}
}
উদ্দেশ্য-সি
@interface MySimpleNativeAdView ()
@property(nonatomic, weak) IBOutlet UIImageView *adChoicesView;
@end
@implementation MySimpleNativeAdView
- (void)awakeFromNib {
[super awakeFromNib];
// Enable clicks on AdChoices.
[self.adChoicesView addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(performClickOnAdChoices:)]];
self.adChoicesView.userInteractionEnabled = YES;
}
- (void)performClickOnAdChoices:(UITapGestureRecognizer *)sender {
[self.customNativeAd performClickOnAssetWithKey:GADNativeAdChoicesViewAsset];
}
- (void)populateWithCustomNativeAd:(GADCustomNativeAd *)customNativeAd {
// Render the AdChoices image.
GADNativeAdImage *adChoicesAsset = [customNativeAd
imageForKey:GADNativeAdChoicesViewAsset];
self.adChoicesView.image = adChoicesAsset.image;
self.adChoicesView.hidden = (adChoicesAsset == nil);
...
}
কাস্টম নেটিভ বিজ্ঞাপন ফরম্যাটের জন্য নেটিভ ভিডিও
কাস্টম ফরম্যাট তৈরি করার সময়, আপনার কাছে ফরম্যাটটিকে ভিডিওর জন্য উপযুক্ত করে তোলার বিকল্প থাকে।
আপনার অ্যাপ বাস্তবায়নে, ভিডিওটির ভিউ পেতে আপনি GADCustomNativeAd.mediaView প্রপার্টিটি ব্যবহার করতে পারেন। এরপর এই ভিউটিকে আপনার ভিউ হায়ারার্কিতে যুক্ত করুন। যদি বিজ্ঞাপনটিতে ভিডিও কন্টেন্ট না থাকে, তবে ভিডিও ছাড়া বিজ্ঞাপনটি দেখানোর জন্য বিকল্প পরিকল্পনা করুন।
নীচের উদাহরণটি পরীক্ষা করে দেখে যে বিজ্ঞাপনটিতে ভিডিও কন্টেন্ট আছে কিনা, এবং ভিডিও না থাকলে তার জায়গায় একটি ছবি প্রদর্শন করে:
সুইফট
... /// Populates the ad view with the custom native ad object. func populate(withCustomNativeAd customNativeAd: CustomNativeAd) { if customNativeAd.videoController.hasVideoContent(), let mediaView = customNativeAd.mediaView { updateMainView(mediaView) } else { // Assumes your native format has an image asset with the name MainImage. let image: UIImage? = customNativeAd.image(forKey: "MainImage")?.image updateMainView(UIImageView(image: image)) } } private func updateMainView(_ mainView:UIView) { // Assumes you have a placeholder view for your media content. // Remove all the placeholder's subviews. for subview: UIView in mainPlaceholder.subviews { subview.removeFromSuperview() } mainPlaceholder.addSubview(mainView) // Size the media view to fill our container size. mainView.translatesAutoresizingMaskIntoConstraints = false let viewDictionary: [AnyHashable: Any] = ["mainView":mainView] mainPlaceholder.addConstraints(NSLayoutConstraint.constraints( withVisualFormat: "H:|[mainView]|", options: [], metrics: nil, views: viewDictionary as? [String : Any] ?? [String : Any]())) mainPlaceholder.addConstraints(NSLayoutConstraint.constraints( withVisualFormat: "V:|[mainView]|", options: [], metrics: nil, views: viewDictionary as? [String : Any] ?? [String : Any]())) } ...
উদ্দেশ্য-সি
... - (void)populateWithCustomNativeAd:(GADCustomNativeAd *)ad { UIView *mainView = nil; if (ad.videoController.hasVideoContent) { mainView = ad.mediaView; } else { // Assumes your native format has an image asset with the name MainImage. UIImage *image = [ad imageForKey:@"MainImage"].image; mainView = [[UIImageView alloc] initWithImage:image]; } // Assumes you have a placeholder view for your media content. for (UIView *subview in self.mainPlaceholder.subviews) { [subview removeFromSuperview]; } [self.mainPlaceholder addSubview:mainView]; // Size the main view to fill our container size. [mainView setTranslatesAutoresizingMaskIntoConstraints:NO]; NSDictionary *viewDictionary = NSDictionaryOfVariableBindings(mainView); [self.mainPlaceholder addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[mainView]|" options:0 metrics:nil views:viewDictionary]]; } ...
একটি কাস্টম নেটিভ বিজ্ঞাপনের ভিডিও অভিজ্ঞতা কীভাবে কাস্টমাইজ করা যায়, সে সম্পর্কে আরও তথ্যের জন্য GADVideoController দেখুন।
নেটিভ ভিডিওর একটি কার্যকরী উদাহরণ দেখতে অ্যাড ম্যানেজার কাস্টম রেন্ডারিং উদাহরণটি ডাউনলোড করুন।
কাস্টম নেটিভ বিজ্ঞাপনের ক্লিক এবং ইম্প্রেশন পরিচালনা করা
কাস্টম নেটিভ বিজ্ঞাপন ফরম্যাটের ক্ষেত্রে, আপনার অ্যাপ ইম্প্রেশন রেকর্ড করার এবং SDK-কে ক্লিক ইভেন্ট রিপোর্ট করার জন্য দায়ী থাকবে।
ছাপ রেকর্ড করা
একটি কাস্টম নেটিভ অ্যাডের জন্য ইম্প্রেশন রেকর্ড করতে, সংশ্লিষ্ট GADCustomNativeAd এর recordImpression মেথডটি কল করুন:
সুইফট
myCustomNativeAd.recordImpression()
উদ্দেশ্য-সি
[myCustomNativeAd recordImpression];
যদি আপনার অ্যাপ ভুলবশত একই বিজ্ঞাপনের জন্য একাধিকবার মেথডটি কল করে, তাহলে SDK একটিমাত্র অনুরোধের জন্য ডুপ্লিকেট ইম্প্রেশন রেকর্ড হওয়া প্রতিরোধ করে।
ক্লিক রিপোর্ট করা
কোনো অ্যাসেট ভিউতে ক্লিক হয়েছে তা SDK-কে জানানোর জন্য, সংশ্লিষ্ট GADCustomNativeAd এর performClickOnAssetWithKey: মেথডটি কল করুন এবং যে অ্যাসেটটিতে ক্লিক করা হয়েছে তার নামটি পাস করুন। উদাহরণস্বরূপ, যদি আপনার কাস্টম ফরম্যাটে "MainImage" নামে একটি অ্যাসেট থাকে এবং আপনি সেই অ্যাসেটের সাথে সম্পর্কিত ভিউতে একটি ক্লিকের রিপোর্ট করতে চান, তাহলে আপনার কোডটি দেখতে এইরকম হবে:
সুইফট
myCustomNativeAd.performClickOnAsset(withKey: "MainImage")
উদ্দেশ্য-সি
[myCustomNativeAd performClickOnAssetWithKey:@"MainImage"];
মনে রাখবেন, আপনার বিজ্ঞাপনের সাথে যুক্ত প্রতিটি অ্যাসেট ভিউয়ের জন্য এই মেথডটি কল করার প্রয়োজন নেই। উদাহরণস্বরূপ, যদি আপনার "ক্যাপশন" নামে আরেকটি অ্যাসেট থাকে, যা শুধু প্রদর্শনের জন্য কিন্তু ব্যবহারকারীর দ্বারা ক্লিক বা ট্যাপ করার জন্য নয়, তাহলে আপনার অ্যাপকে সেই ভিউটির জন্য performClickOnAssetWithKey: কল করার প্রয়োজন হবে না।
কাস্টম ক্লিক অ্যাকশনের প্রতিক্রিয়া জানানো
GADCustomNativeAd একটি customClickHandler প্রপার্টি আছে, যা GADNativeAdCustomClickHandler টাইপের।
সুইফট
typealias NativeAdCustomClickHandler = (assetID: String) -> Void
উদ্দেশ্য-সি
typedef void (^GADNativeAdCustomClickHandler)(NSString *assetID);
এটি একটি ব্লক (অবজেক্টিভ-সি) / ক্লোজার (সুইফট) যা ইনপুট প্যারামিটার হিসেবে একটি assetID গ্রহণ করে, যা ক্লিক করা অ্যাসেটটিকে শনাক্ত করে।
যখন কোনো কাস্টম নেটিভ অ্যাডে ক্লিক করা হয়, তখন SDK থেকে তিনটি সম্ভাব্য প্রতিক্রিয়া আসতে পারে, যা এই ক্রমে চেষ্টা করা হয়:
- Objective-C-তে
customClickHandlerব্লক অথবা Swift-এ ক্লোজার কল করুন, যদি কোনোটি সেট করা থাকে। - বিজ্ঞাপনটির ডিপলিঙ্ক ইউআরএলগুলো একের পর এক দেখতে থাকুন এবং প্রথম যেটির জন্য একটি উপযুক্ত অ্যাপ খুঁজে পাওয়া যায়, সেটি খুলুন।
- একটি ব্রাউজার খুলুন এবং বিজ্ঞাপনটির প্রচলিত গন্তব্য ইউআরএল-এ যান।
customClickHandler প্রপার্টিটি `Objective-C`-তে একটি `block` এবং `Swift`-এ একটি `closure` গ্রহণ করে। আপনি যদি একটি `block` বা `closure` সেট করেন, তাহলে SDK সেটি চালাবে এবং আর কোনো পদক্ষেপ নেবে না। কিন্তু, আপনি যদি একটি `nil` ভ্যালু সেট করেন, তাহলে SDK বিজ্ঞাপনের সাথে রেজিস্টার করা `deeplink` এবং/অথবা গন্তব্য URL-গুলোতে ফিরে যাবে।
কাস্টম ক্লিক হ্যান্ডলার আপনার অ্যাপকে কোনো ক্লিকের প্রতিক্রিয়ায় সেরা পদক্ষেপটি নিজে থেকেই বেছে নেওয়ার সুযোগ দেয়, তা হতে পারে UI আপডেট করা, অন্য কোনো ভিউ কন্ট্রোলার দেখানো, অথবা শুধু ক্লিকটি লগ করা। এখানে একটি অ্যালার্ট দেখানোর উদাহরণ দেওয়া হলো:
সুইফট
myCustomNativeAd.customClickHandler = { assetID in if assetID == "MainImage" { let alertView = UIAlertView(title: "Custom Click", message: "You just clicked on the image!", delegate: self, cancelButtonTitle: "OK") alertView.alertViewStyle = .default alertView.show() } } myCustomNativeAd.performClickOnAsset(withKey: "MainImage")
উদ্দেশ্য-সি
[self.customNativeAd setCustomClickHandler:^(NSString *assetID){ if ([assetID isEqualToString:@"MainImage"]) { [[[UIAlertView alloc] initWithTitle:@"Custom Click" message:@"You just clicked on the image!" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; } }]; [self.customNativeAd performClickOnAssetWithKey:@"MainImage"];
নেটিভ বিজ্ঞাপন কোড পরীক্ষা করা হচ্ছে
সরাসরি বিক্রিত বিজ্ঞাপন
সরাসরি বিক্রি হওয়া নেটিভ বিজ্ঞাপনগুলো কেমন হয় তা পরীক্ষা করে দেখতে চাইলে, আপনি এই অ্যাড ম্যানেজার অ্যাড ইউনিট আইডিটি ব্যবহার করতে পারেন:
/21775744923/example/native
এটি নমুনা অ্যাপ ইনস্টল ও কন্টেন্ট বিজ্ঞাপন, এবং সেইসাথে নিম্নলিখিত অ্যাসেটসহ একটি কাস্টম নেটিভ বিজ্ঞাপন ফরম্যাট পরিবেশন করার জন্য কনফিগার করা হয়েছে:
- শিরোনাম (পাঠ্য)
- মূল ছবি (ছবি)
- ক্যাপশন (টেক্সট)
নেটিভ ব্যাকফিল বিজ্ঞাপন
নেটিভ ব্যাকফিল অ্যাডের আচরণ পরীক্ষা করতে, এই অ্যাড ম্যানেজার অ্যাড ইউনিটটি ব্যবহার করুন:
/21775744923/example/native-backfill
এটি নমুনা অ্যাপ ইনস্টল এবং কন্টেন্ট বিজ্ঞাপন দেখাবে, যেগুলিতে AdChoices ওভারলে অন্তর্ভুক্ত থাকবে।
লাইভ হওয়ার আগে আপনার কোডটি আপডেট করে প্রকৃত অ্যাড ইউনিট এবং ফরম্যাট আইডিগুলো উল্লেখ করতে ভুলবেন না!