IMA SDK की मदद से, अपनी वेबसाइटों और ऐप्लिकेशन में मल्टीमीडिया विज्ञापन आसानी से इंटिग्रेट किए जा सकते हैं. IMA SDK, VAST के साथ काम करने वाले किसी भी विज्ञापन सर्वर से विज्ञापनों का अनुरोध कर सकते हैं. साथ ही, आपके ऐप्लिकेशन में विज्ञापन चलाने की सुविधा को मैनेज कर सकते हैं. IMA के क्लाइंट-साइड SDK टूल की मदद से, कॉन्टेंट वीडियो के प्लेबैक को कंट्रोल किया जा सकता है. वहीं, SDK टूल विज्ञापन के प्लेबैक को मैनेज करता है. विज्ञापन, ऐप्लिकेशन के कॉन्टेंट वीडियो प्लेयर के ऊपर मौजूद किसी अलग वीडियो प्लेयर में चलते हैं.
इस गाइड में, वीडियो प्लेयर ऐप्लिकेशन में IMA SDK को इंटिग्रेट करने का तरीका बताया गया है. अगर आपको इंटिग्रेशन का पूरा सैंपल देखना है या साथ-साथ इंटिग्रेट करना है, तो GitHub से BasicExample डाउनलोड करें.
IMA क्लाइंट-साइड की खास जानकारी
IMA के क्लाइंट-साइड को लागू करने के लिए, एसडीके के चार मुख्य कॉम्पोनेंट का इस्तेमाल किया जाता है. इनके बारे में इस गाइड में बताया गया है:
IMAAdDisplayContainer: यह एक कंटेनर ऑब्जेक्ट है. इससे यह तय होता है कि IMA, विज्ञापन के यूज़र इंटरफ़ेस (यूआई) एलिमेंट कहां रेंडर करेगा और विज्ञापन दिखने से जुड़े आंकड़ों को कहां मेज़र करेगा. इसमें ऐक्टिव व्यू और ओपन मेज़रमेंट शामिल हैं.IMAAdsLoader: यह एक ऐसा ऑब्जेक्ट है जो विज्ञापन का अनुरोध करता है और विज्ञापन के अनुरोध के जवाबों से इवेंट हैंडल करता है. आपको सिर्फ़ एक विज्ञापन लोडर को इंस्टैंशिएट करना चाहिए. इसका इस्तेमाल, ऐप्लिकेशन के पूरे लाइफ़टाइम में किया जा सकता है.IMAAdsRequest: यह एक ऐसा ऑब्जेक्ट है जो विज्ञापन अनुरोध को तय करता है. विज्ञापन अनुरोधों में, वीएएसटी विज्ञापन टैग के लिए यूआरएल के साथ-साथ अन्य पैरामीटर भी शामिल होते हैं. जैसे, विज्ञापन के डाइमेंशन.IMAAdsManager: यह एक ऐसा ऑब्जेक्ट है जिसमें विज्ञापन के अनुरोध का जवाब होता है. यह विज्ञापन चलाने की सुविधा को कंट्रोल करता है और एसडीके से ट्रिगर होने वाले विज्ञापन इवेंट को सुनता है.
ज़रूरी शर्तें
शुरू करने से पहले, आपके पास ये चीज़ें होनी चाहिए:
- Xcode 13 या इसके बाद का वर्शन
- Swift Package Manager, CocoaPods या tvOS के लिए IMA SDK की डाउनलोड की गई कॉपी
1. नया Xcode प्रोजेक्ट बनाना
Xcode में, Objective-C या Swift का इस्तेमाल करके नया tvOS प्रोजेक्ट बनाएं. प्रोजेक्ट के नाम के तौर पर, BasicExample का इस्तेमाल करें.
2. Xcode प्रोजेक्ट में IMA SDK जोड़ना
Swift Package Manager का इस्तेमाल करके IMA SDK इंस्टॉल करना
Interactive Media Ads SDK, Swift Package Manager के साथ काम करता है. इसके लिए, SDK का वर्शन 4.8.2 या उसके बाद का होना ज़रूरी है. Swift पैकेज इंपोर्ट करने के लिए, यह तरीका अपनाएं.
Xcode में, IMA SDK Swift Package इंस्टॉल करें. इसके लिए, File > Add Packages... पर जाएं.
दिखने वाले प्रॉम्प्ट में, IMA SDK Swift Package GitHub repository खोजें:
https://github.com/googleads/swift-package-manager-google-interactive-media-ads-tvosIMA SDK Swift Package का वह वर्शन चुनें जिसका आपको इस्तेमाल करना है. हमारा सुझाव है कि नए प्रोजेक्ट के लिए, अगले मुख्य वर्शन तक का इस्तेमाल करें.
इसके बाद, Xcode आपके पैकेज की डिपेंडेंसी से जुड़ी समस्या को हल करता है और उन्हें बैकग्राउंड में डाउनलोड करता है. पैकेज डिपेंडेंसी जोड़ने के बारे में ज़्यादा जानने के लिए, Apple का लेख पढ़ें.
CocoaPods का इस्तेमाल करके IMA SDK इंस्टॉल करना
IMA SDK इंस्टॉल करने के लिए, CocoaPods का इस्तेमाल करें. CocoaPods को इंस्टॉल करने या इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, CocoaPods का दस्तावेज़ देखें. CocoaPods इंस्टॉल करने के बाद, यह तरीका अपनाएं:
अपनी BasicExample.xcodeproj फ़ाइल वाली डायरेक्ट्री में, Podfile नाम की टेक्स्ट फ़ाइल बनाएं और यह कॉन्फ़िगरेशन जोड़ें:
source 'https://github.com/CocoaPods/Specs.git' platform :tvos, '15' target "BasicExample" do pod 'GoogleAds-IMA-tvOS-SDK', '~> 4.16.0' endPodfile वाले डायरेक्ट्री से,
pod install --repo-updateचलाएंपुष्टि करें कि इंस्टॉलेशन पूरा हो गया है. इसके लिए, BasicExample.xcworkspace फ़ाइल खोलें और पुष्टि करें कि इसमें दो प्रोजेक्ट शामिल हैं: BasicExample और Pods (CocoaPods से इंस्टॉल की गई डिपेंडेंसी).
IMA SDK को मैन्युअल तरीके से डाउनलोड और इंस्टॉल करना
अगर आपको CocoaPods का इस्तेमाल नहीं करना है, तो IMA SDK डाउनलोड करें और उसे अपने प्रोजेक्ट में मैन्युअल तरीके से जोड़ें.
3. IMA SDK इंपोर्ट करना
इंपोर्ट स्टेटमेंट का इस्तेमाल करके, IMA फ़्रेमवर्क जोड़ें.
Objective-C
#import "ViewController.h"
#import <AVKit/AVKit.h>
@import GoogleInteractiveMediaAds;
Swift
import AVFoundation
import GoogleInteractiveMediaAds
import UIKit
4. वीडियो प्लेयर बनाना और IMA SDK टूल को इंटिग्रेट करना
यहां दिए गए उदाहरण में, IMA SDK को शुरू करने का तरीका बताया गया है:
Objective-C
NSString *const kContentURLString =
@"https://storage.googleapis.com/interactive-media-ads/media/stock.mp4";
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&cmsid=496&vid=short_onecue&correlator=";
@interface ViewController () <IMAAdsLoaderDelegate, IMAAdsManagerDelegate>
@property(nonatomic) IMAAdsLoader *adsLoader;
@property(nonatomic) IMAAdDisplayContainer *adDisplayContainer;
@property(nonatomic) IMAAdsManager *adsManager;
@property(nonatomic) IMAAVPlayerContentPlayhead *contentPlayhead;
@property(nonatomic) AVPlayerViewController *contentPlayerViewController;
@property(nonatomic, getter=isAdBreakActive) BOOL adBreakActive;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor blackColor];
[self setupAdsLoader];
[self setupContentPlayer];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self requestAds];
}
// 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 resume events from the
// remote and play content underneath the ad.
[self.contentPlayerViewController willMoveToParentViewController:nil];
[self.contentPlayerViewController.view removeFromSuperview];
[self.contentPlayerViewController removeFromParentViewController];
}
Swift
class ViewController: UIViewController, IMAAdsLoaderDelegate, IMAAdsManagerDelegate {
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&correlator="
var adsLoader: IMAAdsLoader!
var adDisplayContainer: IMAAdDisplayContainer!
var adsManager: IMAAdsManager!
var contentPlayhead: IMAAVPlayerContentPlayhead?
var playerViewController: AVPlayerViewController!
var adBreakActive = false
deinit {
NotificationCenter.default.removeObserver(self)
}
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.black
setUpContentPlayer()
setUpAdsLoader()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
requestAds()
}
इस उदाहरण में, viewDidLoad() IMAAdsLoader को शुरू करता है. इसके बाद, व्यू दिखने पर viewDidAppear() विज्ञापन का अनुरोध करता है. सहायक तरीके
showContentPlayer() और hideContentPlayer() विज्ञापन चलाने के दौरान, कॉन्टेंट दिखने की सेटिंग को टॉगल करते हैं.
इस उदाहरण में, विज्ञापन अनुरोध के लिए VAST विज्ञापन टैग तय करने के लिए adTagURLString कॉन्स्टेंट वैरिएबल का इस्तेमाल किया गया है. साथ ही, IMA SDK को मैनेज करने के लिए इन कॉम्पोनेंट का इस्तेमाल किया गया है:
adsLoader: यह कुकी, विज्ञापन अनुरोधों और जवाबों को मैनेज करती है. हमारा सुझाव है कि ऐप्लिकेशन के लाइफ़साइकल के लिए, एक ही इंस्टेंस का इस्तेमाल करें.adDisplayContainer: यह विज्ञापन रेंडर करने के लिए व्यू तय करता है.adsManager: यह विज्ञापन चलाने की सुविधा को मैनेज करता है और विज्ञापन इवेंट के बारे में सुनता है.contentPlayhead: यह कुकी, कॉन्टेंट की प्रोग्रेस को ट्रैक करती है, ताकि वीडियो के बीच में विज्ञापन दिखाने के लिए ब्रेक ट्रिगर किए जा सकें.adBreakActive: इससे पता चलता है कि विज्ञापन ब्रेक चल रहा है या नहीं, ताकि लोग विज्ञापनों को स्किप न कर पाएं.
5. कॉन्टेंट प्लेहेड ट्रैकर और स्ट्रीम के आखिर में दिखने वाले ऑब्ज़र्वर को लागू करना
वीडियो के बीच में दिखने वाले विज्ञापन चलाने के लिए, IMA SDK को आपके वीडियो कॉन्टेंट की मौजूदा स्थिति को ट्रैक करना होता है. इसके लिए, एक ऐसी क्लास बनाएं जो IMAContentPlayhead को लागू करती हो. अगर इस उदाहरण में दिखाए गए तरीके से AVPlayer का इस्तेमाल किया जा रहा है, तो SDK टूल, AVPlayer क्लास उपलब्ध कराता है. यह क्लास, आपके लिए यह काम करती है.IMAAVPlayerContentPlayhead
अगर AVPlayer का इस्तेमाल नहीं किया जा रहा है, तो आपको अपनी क्लास में IMAContentPlayhead लागू करना होगा.
Objective-C
- (void)setupContentPlayer {
// Create a content video player. Create a playhead to track content progress so the SDK knows
// when to play ads in a VMAP playlist.
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];
}
Swift
func setUpContentPlayer() {
// Load AVPlayer with path to our content.
let contentURL = URL(string: ViewController.contentURLString)!
let player = AVPlayer(url: contentURL)
playerViewController = AVPlayerViewController()
playerViewController.player = player
// Set up our 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()
}
आपको एसडीके को यह भी बताना होगा कि आपका कॉन्टेंट कब खत्म हो गया है, ताकि वह पोस्ट-रोल विज्ञापन दिखा सके. इसके लिए, AVPlayerItemDidPlayToEndTimeNotification का इस्तेमाल करके IMAAdsLoader पर contentComplete को कॉल किया जाता है.
Objective-C
- (void)contentDidFinishPlaying:(NSNotification *)notification {
// Notify the SDK that the postrolls should be played.
[self.adsLoader contentComplete];
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
Swift
@objc func contentDidFinishPlaying(_ notification: Notification) {
adsLoader.contentComplete()
}
6. विज्ञापन लोडर को शुरू करें और विज्ञापन का अनुरोध करें
विज्ञापनों के सेट का अनुरोध करने के लिए, आपको IMAAdsLoader इंस्टेंस बनाना होगा.
इस लोडर का इस्तेमाल, किसी विज्ञापन टैग यूआरएल से जुड़े IMAAdsRequest ऑब्जेक्ट को प्रोसेस करने के लिए किया जा सकता है.
सबसे सही तरीका यह है कि अपने ऐप्लिकेशन के पूरे लाइफ़साइकल के लिए, IMAAdsLoader का सिर्फ़ एक इंस्टेंस बनाए रखें. विज्ञापन के अतिरिक्त अनुरोध करने के लिए, नया IMAAdsRequest ऑब्जेक्ट बनाएं. हालांकि, उसी IMAAdsLoader का फिर से इस्तेमाल करें. ज़्यादा जानकारी के लिए, IMA SDK के बारे में अक्सर पूछे जाने वाले सवाल देखें.
Objective-C
- (void)setupAdsLoader {
self.adsLoader = [[IMAAdsLoader alloc] init];
self.adsLoader.delegate = self;
}
- (void)requestAds {
// Pass the main view as the container for ad display.
self.adDisplayContainer = [[IMAAdDisplayContainer alloc] initWithAdContainer:self.view
viewController:self];
IMAAdsRequest *request = [[IMAAdsRequest alloc] initWithAdTagUrl:kAdTagURLString
adDisplayContainer:self.adDisplayContainer
contentPlayhead:self.contentPlayhead
userContext:nil];
[self.adsLoader requestAdsWithRequest:request];
}
Swift
func setUpAdsLoader() {
adsLoader = IMAAdsLoader(settings: nil)
adsLoader.delegate = self
}
func requestAds() {
// Create ad display container for ad rendering.
adDisplayContainer = IMAAdDisplayContainer(adContainer: self.view, viewController: self)
// 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)
}
7. विज्ञापन लोड करने वाले डेलिगेट को सेट अप करना
लोड इवेंट के पूरा होने पर, IMAAdsLoader अपने असाइन किए गए डेलिगेट के adsLoadedWithData मेथड को कॉल करता है. साथ ही, उसे IMAAdsManager का एक इंस्टेंस पास करता है. इसके बाद, विज्ञापन मैनेजर को शुरू किया जा सकता है. यह विज्ञापन टैग यूआरएल के रिस्पॉन्स के हिसाब से, अलग-अलग विज्ञापन लोड करता है.
इसके अलावा, लोड करने की प्रोसेस के दौरान होने वाली किसी भी गड़बड़ी को ठीक करना न भूलें. अगर विज्ञापन लोड नहीं होते हैं, तो पक्का करें कि मीडिया का चलना जारी रहे. हालांकि, ऐसा बिना विज्ञापनों के होना चाहिए, ताकि उपयोगकर्ता के अनुभव पर कोई असर न पड़े.
Objective-C
#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.delegate = self;
[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];
}
Swift
func adsLoader(_ loader: IMAAdsLoader, adsLoadedWith adsLoadedData: IMAAdsLoadedData) {
// Grab the instance of the IMAAdsManager and set ourselves as the delegate.
adsManager = adsLoadedData.adsManager
adsManager.delegate = self
adsManager.initialize(with: nil)
}
func adsLoader(_ loader: IMAAdsLoader, failedWith adErrorData: IMAAdLoadingErrorData) {
print("Error loading ads: \(adErrorData.adError.message ?? "No error message available.")")
showContentPlayer()
playerViewController.player?.play()
}
8. विज्ञापन मैनेजर के प्रतिनिधि खाते को सेट अप करना
आखिर में, इवेंट और स्थिति में हुए बदलावों को मैनेज करने के लिए, विज्ञापन मैनेजर को अपने प्रतिनिधि की ज़रूरत होती है. IMAAdManagerDelegate में विज्ञापन इवेंट और गड़बड़ियों को मैनेज करने के तरीके होते हैं. साथ ही, इसमें आपके वीडियो कॉन्टेंट को चलाने और रोकने के तरीके भी होते हैं.
वीडियो चलाना शुरू करना
ऐसे कई इवेंट हैं जिन्हें हैंडल करने के लिए, didReceiveAdEvent तरीके का इस्तेमाल किया जा सकता है.
इस बुनियादी उदाहरण के लिए, LOADED इवेंट को सुनें, ताकि विज्ञापन मैनेजर को कॉन्टेंट और विज्ञापनों का प्लेबैक शुरू करने के लिए कहा जा सके. जब उपयोगकर्ता किसी आइकॉन पर टैप करने के बाद, आइकॉन फ़ॉलबैक डायलॉग को बंद करता है, तब IMA SDK ICON_FALLBACK_IMAGE_CLOSED इवेंट को ट्रिगर करता है. इस कार्रवाई के बाद, विज्ञापन फिर से चलने लगता है.
Objective-C
#pragma mark - IMAAdsManagerDelegate
- (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdEvent:(IMAAdEvent *)event {
switch (event.type) {
case kIMAAdEvent_LOADED: {
// Play each ad once it has loaded.
[adsManager start];
break;
}
case kIMAAdEvent_ICON_FALLBACK_IMAGE_CLOSED: {
// Resume ad after user has closed dialog.
[adsManager resume];
break;
}
default:
break;
}
}
Swift
func adsManager(_ adsManager: IMAAdsManager, didReceive event: IMAAdEvent) {
switch event.type {
case IMAAdEventType.LOADED:
// Play each ad once it has been loaded.
adsManager.start()
case IMAAdEventType.ICON_FALLBACK_IMAGE_CLOSED:
// Resume playback after the user has closed the dialog.
adsManager.resume()
default:
break
}
}
गड़बड़ियों को ठीक करना
विज्ञापन से जुड़ी गड़बड़ियों के लिए भी हैंडलर जोड़ें. अगर कोई गड़बड़ी होती है, तो पिछले चरण की तरह कॉन्टेंट को फिर से चलाना शुरू करें.
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];
}
Swift
func adsManager(_ adsManager: IMAAdsManager, didReceive error: IMAAdError) {
// Fall back to playing content
print("AdsManager error: \(error.message ?? "No error message available.")")
showContentPlayer()
playerViewController.player?.play()
}
मीडिया चलाने और रोकने के इवेंट ट्रिगर करना
आपको जिन दो डेलिगेट तरीकों को लागू करना है उनका इस्तेमाल, IMA SDK के अनुरोध पर वीडियो कॉन्टेंट को चलाने और रोकने के लिए किया जाता है. जब विज्ञापन दिखाए जाते हैं, तब वीडियो को रोकने और चलाने की सुविधा चालू करने से, उपयोगकर्ता को वीडियो कॉन्टेंट के कुछ हिस्सों को देखने से नहीं रोका जाता.
Objective-C
- (void)adsManagerDidRequestContentPause:(IMAAdsManager *)adsManager {
// Pause the content for the SDK to play ads.
[self.contentPlayerViewController.player pause];
[self hideContentPlayer];
// Trigger an update to send focus to the ad display container.
self.adBreakActive = YES;
[self setNeedsFocusUpdate];
}
- (void)adsManagerDidRequestContentResume:(IMAAdsManager *)adsManager {
// Resume the content since the SDK is done playing ads (at least for now).
[self showContentPlayer];
[self.contentPlayerViewController.player play];
// Trigger an update to send focus to the content player.
self.adBreakActive = NO;
[self setNeedsFocusUpdate];
}
Swift
func adsManagerDidRequestContentPause(_ adsManager: IMAAdsManager) {
// Pause the content for the SDK to play ads.
playerViewController.player?.pause()
hideContentPlayer()
// Trigger an update to send focus to the ad display container.
adBreakActive = true
setNeedsFocusUpdate()
}
func adsManagerDidRequestContentResume(_ adsManager: IMAAdsManager) {
// Resume the content since the SDK is done playing ads (at least for now).
showContentPlayer()
playerViewController.player?.play()
// Trigger an update to send focus to the content player.
adBreakActive = false
setNeedsFocusUpdate()
}
हो गया! अब IMA SDK की मदद से, विज्ञापनों का अनुरोध किया जा रहा है और उन्हें दिखाया जा रहा है. एसडीके की अन्य सुविधाओं के बारे में जानने के लिए, अन्य गाइड या GitHub पर मौजूद सैंपल देखें.
अगले चरण
tvOS प्लैटफ़ॉर्म पर विज्ञापन से मिलने वाला रेवेन्यू बढ़ाने के लिए, आईडीएफ़ए का इस्तेमाल करने के लिए, ऐप्लिकेशन की पारदर्शिता और ट्रैकिंग की अनुमति का अनुरोध करें.