IMA SDK से, आपकी वेबसाइट और ऐप्लिकेशन में मल्टीमीडिया विज्ञापनों को जोड़ना आसान हो जाता है. IMA SDK, VAST-अनुपालन वाले किसी भी विज्ञापन सर्वर से विज्ञापन का अनुरोध कर सकता है और आपके ऐप्लिकेशन में विज्ञापन की प्लेबैक को मैनेज कर सकता है. IMA क्लाइंट-साइड SDK टूल की मदद से, कॉन्टेंट वीडियो चलाने की सुविधा पर आपका कंट्रोल बना रहता है. हालांकि, SDK टूल विज्ञापन प्लेबैक को मैनेज करता है. विज्ञापन, ऐप्लिकेशन के कॉन्टेंट वीडियो प्लेयर के ऊपर एक अलग वीडियो प्लेयर में चलते हैं.
इस गाइड में IMA SDK को एक आसान वीडियो प्लेयर ऐप्लिकेशन में जोड़ने का तरीका बताया गया है. अगर आपको पूरा सैंपल इंटिग्रेट करना है, तो इसे देखने या फ़ॉलो करने के लिए, GitHub से basicExample को डाउनलोड करें.
IMA क्लाइंट-साइड की खास जानकारी
IMA क्लाइंट-साइड को लागू करने में, SDK टूल के चार मुख्य कॉम्पोनेंट शामिल होते हैं. इनकी जानकारी इस गाइड में दी गई है:
IMAAdDisplayContainer
: एक कंटेनर ऑब्जेक्ट, जहां विज्ञापन दिखाए जाते हैं.IMAAdsLoader
: ऐसा ऑब्जेक्ट जो विज्ञापनों का अनुरोध करता है और विज्ञापनों के अनुरोध के रिस्पॉन्स से इवेंट मैनेज करता है. आपको केवल एक विज्ञापन लोड करने की सुविधा को इंस्टैंशिएट करना होगा, जिसे ऐप्लिकेशन के पूरे जीवनकाल के दौरान फिर से इस्तेमाल किया जा सके.IMAAdsRequest
: ऐसा ऑब्जेक्ट जो विज्ञापन अनुरोध के बारे में बताता है. विज्ञापनों के अनुरोधों में, VAST (वीडियो विज्ञापन देने के लिए टेम्पलेट) विज्ञापन टैग के यूआरएल के साथ-साथ, विज्ञापन डाइमेंशन जैसे दूसरे पैरामीटर भी शामिल होते हैं.IMAAdsManager
: ऐसा ऑब्जेक्ट जिसमें विज्ञापन अनुरोध का जवाब दिया जाता है, विज्ञापन को कंट्रोल किया जाता है, और SDK टूल से सक्रिय किए गए विज्ञापन इवेंट को सुना जाता है.
ज़रूरी शर्तें
शुरू करने से पहले, आपको इन चीज़ों की ज़रूरत होगी:
- Xcode 9.2 या उसके बाद का वर्शन
- CocoaPods (इसका सुझाव दिया जाता है) या iOS के लिए IMA SDK टूल की डाउनलोड की गई कॉपी
1. नया Xcode प्रोजेक्ट बनाएं
Xcode में, Objective-C या Swift का इस्तेमाल करके नया iOS प्रोजेक्ट बनाएं. प्रोजेक्ट के नाम के तौर पर basicExample का इस्तेमाल करें.
2. Xcode प्रोजेक्ट में IMA SDK जोड़ें
CocoaPods (पसंदीदा) का इस्तेमाल करके SDK टूल इंस्टॉल करना
CocoaPods, Xcode प्रोजेक्ट के लिए एक डिपेंडेंसी मैनेजर है और IMA SDK इंस्टॉल करने का सुझाया गया तरीका है. CocoaPods इंस्टॉल या इस्तेमाल करने के बारे में ज़्यादा जानकारी के लिए, CocoaPods का दस्तावेज़ देखें. CocoaPods इंस्टॉल करने के बाद, IMA SDK इंस्टॉल करने के लिए इन निर्देशों का पालन करें:
उसी डायरेक्ट्री में, जैसे कि आपकी basicExample.xcodeproj फ़ाइल, Podfile नाम की एक टेक्स्ट फ़ाइल बनाएं और नीचे दिया गया कॉन्फ़िगरेशन जोड़ें:
source 'https://github.com/CocoaPods/Specs.git' platform :ios, '10' target "BasicExample" do pod 'GoogleAds-IMA-iOS-SDK', '~> 3.18.4' end
Podfile वाली डायरेक्ट्री से,
pod install --repo-update
चलाएंपुष्टि करें कि ऐप्लिकेशन इंस्टॉल करने की प्रक्रिया पूरी हो गई है. इसके लिए, basicExample.xcworkspace फ़ाइल को खोलें और पुष्टि करें कि इस प्रोजेक्ट में दो प्रोजेक्ट हैं: basicExample और Pods (CocoaPods का इंस्टॉल किया गया डिपेंडेंसी).
SDK टूल को मैन्युअल तरीके से डाउनलोड और इंस्टॉल करना
अगर आप CocoaPods का इस्तेमाल नहीं करना चाहते हैं, तो आप IMA SDK डाउनलोड कर सकते हैं और उसे अपने प्रोजेक्ट में मैन्युअल रूप से जोड़ सकते हैं.
3. आसान वीडियो प्लेयर बनाना
सबसे पहले, बेसिक वीडियो प्लेयर लागू करें. शुरुआत में, यह प्लेयर IMA SDK का इस्तेमाल नहीं करता है. इसके अलावा, इसमें वीडियो चलाने के लिए कोई तरीका नहीं होता.
ViewController.m
Objective-C
#import "ViewController.h" #import <AVKit/AVKit.h> NSString *const kContentURLString = @"https://storage.googleapis.com/interactive-media-ads/media/bipbop.m3u8"; @interface ViewController () @property(nonatomic) AVPlayerViewController *contentPlayerViewController; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = UIColor.blackColor; [self setupContentPlayer]; } - (void)setupContentPlayer { // Create a content video player. NSURL *contentURL = [NSURL URLWithString:kContentURLString]; AVPlayer *player = [AVPlayer playerWithURL:contentURL]; self.contentPlayerViewController = [[AVPlayerViewController alloc] init]; self.contentPlayerViewController.player = player; self.contentPlayerViewController.view.frame = self.view.bounds; // Attach content video player to view hierarchy. [self showContentPlayer]; } // Add the content video player as a child view controller. - (void)showContentPlayer { [self addChildViewController:self.contentPlayerViewController]; self.contentPlayerViewController.view.frame = self.view.bounds; [self.view insertSubview:self.contentPlayerViewController.view atIndex:0]; [self.contentPlayerViewController didMoveToParentViewController:self]; } // Remove and detach the content video player. - (void)hideContentPlayer { // The whole controller needs to be detached so that it doesn't capture events from the remote. [self.contentPlayerViewController willMoveToParentViewController:nil]; [self.contentPlayerViewController.view removeFromSuperview]; [self.contentPlayerViewController removeFromParentViewController]; } @end
Swift
import AVFoundation import UIKit class ViewController: UIViewController { static let ContentURLString = "https://storage.googleapis.com/interactive-media-ads/media/bipbop.m3u8" var playerViewController: AVPlayerViewController! override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.black; setUpContentPlayer() } func setUpContentPlayer() { // Load AVPlayer with path to your content. let contentURL! = URL(string: ViewController.ContentURLString) let player = AVPlayer(url: contentURL) playerViewController = AVPlayerViewController() playerViewController.player = player showContentPlayer() } func showContentPlayer() { self.addChild(playerViewController) playerViewController.view.frame = self.view.bounds self.view.insertSubview(playerViewController.view, at: 0) playerViewController.didMove(toParent:self) } func hideContentPlayer() { // The whole controller needs to be detached so that it doesn't capture events from the remote. playerViewController.willMove(toParent:nil) playerViewController.view.removeFromSuperview() playerViewController.removeFromParent() } }
4. IMA SDK इंपोर्ट करें
इसके बाद, मौजूदा इंपोर्ट के नीचे इंपोर्ट स्टेटमेंट का इस्तेमाल करके IMA फ़्रेमवर्क जोड़ें.
ViewController.m
Objective-C
#import "ViewController.h" #import <AVKit/AVKit.h> #import <GoogleInteractiveMediaAds/GoogleInteractiveMediaAds.h> NSString *const kContentURLString = @"https://storage.googleapis.com/interactive-media-ads/media/bipbop.m3u8";
Swift
import AVFoundation import GoogleInteractiveMediaAds import UIKit class ViewController: UIViewController { static let ContentURLString = "https://devstreaming-cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_fmp4/master.m3u8"
5. कॉन्टेंट प्लेहेड ट्रैकर और स्ट्रीम खत्म होने के दौरान निगरानी करने वाला टूल लागू करें
वीडियो के बीच में विज्ञापन दिखाने के लिए, IMA SDK को आपके वीडियो के कॉन्टेंट की मौजूदा जगह को ट्रैक करना होगा. ऐसा करने के लिए, एक क्लास बनाएं जो
IMAContentPlayhead
को लागू करती हो. AVPlayer
का इस्तेमाल करने पर, जैसा कि इस उदाहरण में दिखाया गया है, SDK टूल यह IMAAVPlayerContentPlayhead
क्लास उपलब्ध कराता है, जो आपके लिए यह काम करता है.
अगर आप AVPlayer
का इस्तेमाल नहीं कर रहे हैं, तो आपको अपनी क्लास के लिए IMAContentPlayhead
को लागू करना होगा.
साथ ही, वीडियो अपलोड होने के बाद, आपको SDK टूल को इसकी जानकारी देनी होगी. इससे, वीडियो के खत्म होने के बाद दिखने वाले विज्ञापन दिखाए जा सकते हैं. ऐसा करने के लिए, IMAAdsLoader
पर AVPlayerItemDidPlayToEndTimeNotification
का इस्तेमाल करके contentComplete
को कॉल करें.
ViewController.m
Objective-C
... @interface ViewController () @property(nonatomic) IMAAVPlayerContentPlayhead *contentPlayhead; @property(nonatomic) AVPlayerViewController *contentPlayerViewController; @end ... - (void)setupContentPlayer { // Create a content video player. NSURL *contentURL = [NSURL URLWithString:kContentURLString]; AVPlayer *player = [AVPlayer playerWithURL:contentURL]; self.contentPlayerViewController = [[AVPlayerViewController alloc] init]; self.contentPlayerViewController.player = player; self.contentPlayerViewController.view.frame = self.view.bounds; self.contentPlayhead = [[IMAAVPlayerContentPlayhead alloc] initWithAVPlayer:self.contentPlayerViewController.player]; // Track end of content. AVPlayerItem *contentPlayerItem = self.contentPlayerViewController.player.currentItem; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(contentDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:contentPlayerItem]; // Attach content video player to view hierarchy. [self showContentPlayer]; } ... - (void)contentDidFinishPlaying:(NSNotification *)notification {} - (void)dealloc { [NSNotificationCenter.defaultCenter removeObserver:self]; } @end
Swift
... class ViewController: UIViewController { static let ContentURLString = "https://devstreaming-cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_fmp4/master.m3u8" var contentPlayhead: IMAAVPlayerContentPlayhead? var playerViewController: AVPlayerViewController! deinit { NotificationCenter.default.removeObserver(self) } ... func setUpContentPlayer() { // Load AVPlayer with path to your content. let contentURL! = URL(string: ViewController.ContentURLString) let player = AVPlayer(url: contentURL) playerViewController = AVPlayerViewController() playerViewController.player = player // Set up your content playhead and contentComplete callback. contentPlayhead = IMAAVPlayerContentPlayhead(avPlayer: player) NotificationCenter.default.addObserver( self, selector: #selector(ViewController.contentDidFinishPlaying(_:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem); showContentPlayer() } ... @objc func contentDidFinishPlaying(_ notification: Notification) { adsLoader.contentComplete() } }
6. विज्ञापन लोड करना शुरू करें और विज्ञापन अनुरोध करें
विज्ञापनों के सेट का अनुरोध करने के लिए, आपको एक IMAAdsLoader
इंस्टेंस बनाना होगा.
इस लोड करने वाले टूल का इस्तेमाल, तय किए गए विज्ञापन टैग के यूआरएल से जुड़े IMAAdsRequest
ऑब्जेक्ट को प्रोसेस करने के लिए किया जा सकता है.
सबसे सही तरीका यह है कि अपने ऐप्लिकेशन की पूरी लाइफ़साइकल के लिए, IMAAdsLoader
में से सिर्फ़ एक इंस्टेंस रखें. अतिरिक्त विज्ञापन अनुरोध करने के लिए, एक नया
IMAAdsRequest
ऑब्जेक्ट बनाएं, लेकिन उसी IMAAdsLoader
का फिर से इस्तेमाल करें. ज़्यादा जानकारी के लिए, IMA SDK के बारे में अक्सर पूछे जाने वाले सवाल देखें.
ViewController.m
Objective-C
... NSString *const kContentURLString = @"https://devstreaming-cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_fmp4/" @"master.m3u8"; NSString *const kAdTagURLString = @"https://pubads.g.doubleclick.net/gampad/ads?" @"iu=/21775744923/external/vmap_ad_samples&sz=640x480&" @"cust_params=sample_ar%3Dpremidpostlongpod&" @"ciu_szs=300x250&gdfp_req=1&ad_rule=1&output=vmap&unviewed_position_start=1&" @"env=vp&impl=s&cmsid=496&vid=short_onecue&correlator="; @interface ViewController () @property(nonatomic) IMAAdsLoader *adsLoader; @property(nonatomic) IMAAVPlayerContentPlayhead *contentPlayhead; @property(nonatomic) AVPlayerViewController *contentPlayerViewController; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = UIColor.blackColor; [self setupContentPlayer]; [self setupAdsLoader]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self requestAds]; } - (void)setupAdsLoader { self.adsLoader = [[IMAAdsLoader alloc] init]; } - (void)requestAds { // Pass the main view as the container for ad display. IMAAdDisplayContainer *adDisplayContainer = [[IMAAdDisplayContainer alloc] initWithAdContainer:self.view]; IMAAdsRequest *request = [[IMAAdsRequest alloc] initWithAdTagUrl:kAdTagURLString adDisplayContainer:adDisplayContainer contentPlayhead:self.contentPlayhead userContext:nil]; [self.adsLoader requestAdsWithRequest:request]; } ... - (void)contentDidFinishPlaying:(NSNotification *)notification { // Notify the SDK that the postrolls should be played. [self.adsLoader contentComplete]; } ... @end
Swift
... class ViewController: UIViewController { static let ContentURLString = "https://devstreaming-cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_fmp4/master.m3u8" static let AdTagURLString = "https://pubads.g.doubleclick.net/gampad/ads?iu=/21775744923/external/single_ad_samples&sz=640x480&cust_params=sample_ct%3Dlinear&ciu_szs=300x250%2C728x90&gdfp_req=1&output=vast&unviewed_position_start=1&env=vp&impl=s&correlator=" var adsLoader: IMAAdsLoader! var contentPlayhead: IMAAVPlayerContentPlayhead? var playerViewController: AVPlayerViewController! ... override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.black; setUpContentPlayer() setUpAdsLoader() } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated); requestAds() } ... func setUpAdsLoader() { adsLoader = IMAAdsLoader(settings: nil) } func requestAds() { // Create ad display container for ad rendering. let adDisplayContainer = IMAAdDisplayContainer(adContainer: self.view) // Create an ad request with our ad tag, display container, and optional user context. let request = IMAAdsRequest( adTagUrl: ViewController.AdTagURLString, adDisplayContainer: adDisplayContainer, contentPlayhead: contentPlayhead, userContext: nil) adsLoader.requestAds(with: request) } @objc func contentDidFinishPlaying(_ notification: Notification) { adsLoader.contentComplete() } }
7. विज्ञापन लोड करने की प्रक्रिया के लिए, प्रतिनिधि सेट अप करें
लोड हो जाने पर, IMAAdsLoader
अपने असाइन किए गए डेलिगेट के adsLoadedWithData
तरीके को IMAAdsManager
कॉल करता है. इसके बाद,
विज्ञापन मैनेजर को शुरू किया जा सकता है, जो अलग-अलग विज्ञापनों को लोड करता है,
जैसा कि विज्ञापन टैग के यूआरएल के रिस्पॉन्स में बताया गया है.
इसके अलावा, लोड होने के दौरान होने वाली सभी गड़बड़ियों को ठीक करें. अगर विज्ञापन लोड नहीं होते हैं, तो पक्का करें कि विज्ञापन के बिना मीडिया प्लेबैक जारी रहे, ताकि उपयोगकर्ता के अनुभव में कोई रुकावट न आए.
ViewController.m
Objective-C
... @interface ViewController () <IMAAdsLoaderDelegate> @property(nonatomic) IMAAdsLoader *adsLoader; @property(nonatomic) IMAAdsManager *adsManager; @property(nonatomic) IMAAVPlayerContentPlayhead *contentPlayhead; @property(nonatomic) AVPlayerViewController *contentPlayerViewController; @end @implementation ViewController ... - (void)setupAdsLoader { self.adsLoader = [[IMAAdsLoader alloc] init]; self.adsLoader.delegate = self; } ... #pragma mark - IMAAdsLoaderDelegate - (void)adsLoader:(IMAAdsLoader *)loader adsLoadedWithData:(IMAAdsLoadedData *)adsLoadedData { // Initialize and listen to the ads manager loaded for this request. self.adsManager = adsLoadedData.adsManager; [self.adsManager initializeWithAdsRenderingSettings:nil]; } - (void)adsLoader:(IMAAdsLoader *)loader failedWithErrorData:(IMAAdLoadingErrorData *)adErrorData { // Fall back to playing content. NSLog(@"Error loading ads: %@", adErrorData.adError.message); [self.contentPlayerViewController.player play]; } @end
Swift
... class ViewController: UIViewController, IMAAdsLoaderDelegate { ... var adsLoader: IMAAdsLoader! var adsManager: IMAAdsManager! var contentPlayhead: IMAAVPlayerContentPlayhead? var playerViewController: AVPlayerViewController! ... func setUpAdsLoader() { adsLoader = IMAAdsLoader(settings: nil) adsLoader.delegate = self } ... // MARK: - IMAAdsLoaderDelegate func adsLoader(_ loader: IMAAdsLoader!, adsLoadedWith adsLoadedData: IMAAdsLoadedData!) { adsManager = adsLoadedData.adsManager adsManager.initialize(with: nil) } func adsLoader(_ loader: IMAAdsLoader!, failedWith adErrorData: IMAAdLoadingErrorData!) { print("Error loading ads: " + adErrorData.adError.message) showContentPlayer() playerViewController.player?.play() } }
8. विज्ञापन मैनेजर का प्रतिनिधि सेट अप करना
आखिर में, इवेंट और स्थिति में बदलाव को मैनेज करने के लिए, विज्ञापन मैनेजर को अपने प्रतिनिधि की ज़रूरत होगी. IMAAdManagerDelegate
में विज्ञापन इवेंट और गड़बड़ियों को मैनेज करने के तरीके दिए गए हैं. साथ ही, इसमें आपके वीडियो कॉन्टेंट को चलाने और रोकने पर भी कार्रवाई होती है.
वीडियो चलाना शुरू किया जा रहा है
ऐसे कई इवेंट हैं जिनका इस्तेमाल didReceiveAdEvent
मेथड का इस्तेमाल करने के लिए किया जा सकता है, लेकिन इस
उदाहरण के लिए, विज्ञापन और कॉन्टेंट मैनेजर को कॉन्टेंट और विज्ञापनों का प्लेबैक शुरू करने के बारे में बताने के लिए, बस LOADED
इवेंट सुनें.
ViewController.m
Objective-C
@interface ViewController () <IMAAdsLoaderDelegate, IMAAdsManagerDelegate> ... - (void)adsLoader:(IMAAdsLoader *)loader adsLoadedWithData:(IMAAdsLoadedData *)adsLoadedData { // Initialize and listen to the ads manager loaded for this request. self.adsManager = adsLoadedData.adsManager; self.adsManager.delegate = self; [self.adsManager initializeWithAdsRenderingSettings:nil]; } ... #pragma mark - IMAAdsManagerDelegate - (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdEvent:(IMAAdEvent *)event { // Play each ad once it has loaded. if (event.type == kIMAAdEvent_LOADED) { [adsManager start]; } } ...
Swift
... class ViewController: UIViewController, IMAAdsLoaderDelegate, IMAAdsManagerDelegate { ... func adsLoader(_ loader: IMAAdsLoader!, adsLoadedWith adsLoadedData: IMAAdsLoadedData!) { // Grab the instance of the IMAAdsManager and set yourself as the delegate. adsManager = adsLoadedData.adsManager adsManager.delegate = self adsManager.initialize(with: nil) } ... // MARK: - IMAAdsManagerDelegate func adsManager(_ adsManager: IMAAdsManager!, didReceive event: IMAAdEvent!) { // Play each ad once it has been loaded if event.type == IMAAdEventType.LOADED { adsManager.start() } } ...
गड़बड़ियों को ठीक करना
विज्ञापन की गड़बड़ियों के लिए हैंडलर जोड़ें. अगर कोई गड़बड़ी होती है, जैसे कि पिछले चरण में, तो फिर से वीडियो चलाएं.
ViewController.m
Objective-C
... - (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdError:(IMAAdError *)error { // Fall back to playing content. NSLog(@"AdsManager error: %@", error.message); [self showContentPlayer]; [self.contentPlayerViewController.player play]; } @end
Swift
... func adsManager(_ adsManager: IMAAdsManager!, didReceive error: IMAAdError!) { // Fall back to playing content print("AdsManager error: " + error.message) showContentPlayer() playerViewController.player?.play() }
चलाने और रोकने के इवेंट ट्रिगर करना
आखिरी दो तरीके हैं जिनका इस्तेमाल आपको लागू करना होता है. इनका इस्तेमाल वीडियो कॉन्टेंट पर इवेंट को ट्रिगर करने और उसे ट्रिगर करने के लिए किया जाता है. ऐसा तब किया जाता है, जब IMA SDK से अनुरोध किया जाता है. अनुरोध करने पर रोकने और चलाने को ट्रिगर करने से, विज्ञापन दिखाए जाने पर उपयोगकर्ता को वीडियो सामग्री के कुछ हिस्से नहीं मिल पाएंगे.
ViewController.m
Objective-C
... - (void)adsManagerDidRequestContentPause:(IMAAdsManager *)adsManager { // Pause the content for the SDK to play ads. [self.contentPlayerViewController.player pause]; [self hideContentPlayer]; } - (void)adsManagerDidRequestContentResume:(IMAAdsManager *)adsManager { // Resume the content since the SDK is done playing ads (at least for now). [self showContentPlayer]; [self.contentPlayerViewController.player play]; } @end
Swift
... func adsManagerDidRequestContentPause(_ adsManager: IMAAdsManager!) { // Pause the content for the SDK to play ads. playerViewController.player?.pause() hideContentPlayer() } func adsManagerDidRequestContentResume(_ adsManager: IMAAdsManager!) { // Resume the content since the SDK is done playing ads (at least for now). showContentPlayer() playerViewController.player?.play() } }
हो गया! अब IMA SDK से विज्ञापनों का अनुरोध किया जा रहा है और उन्हें दिखाया जा रहा है. SDK टूल से जुड़ी अन्य सुविधाओं के बारे में जानने के लिए, अन्य गाइड या GitHub पर मौजूद सैंपल देखें.
अगले चरण
iOS प्लैटफ़ॉर्म पर विज्ञापन से होने वाली आय बढ़ाने के लिए, IDFA का इस्तेमाल करने के लिए ऐप्लिकेशन की पारदर्शिता और ट्रैकिंग की अनुमति का अनुरोध करें.