إتاحة وضع "نافذة ضمن نافذة"

حزمة تطوير البرامج (SDK) لإعلانات الوسائط التفاعلية (IMA) لنظام التشغيل iOS

هذا الدليل مخصّص للناشرين الذين يستخدمون "إعلانات IMA" ويريدون إضافة ميزة "صورة داخل صورة" إلى عملية تنفيذ "إعلانات IMA" الحالية.

المتطلبات الأساسية

إضافة ميزة "نافذة ضمن نافذة" إلى تطبيقك

بدءًا من الإصدار 3.1.0 من حزمة تطوير البرامج، تتوافق "إعلانات الوسائط التفاعلية" مع وضع "نافذة ضمن النافذة" من Apple على أجهزة iPad. لإتاحة ميزة "نافذة ضمن النافذة" في تطبيقك، عليك تعديل بعض الإعدادات وتنفيذ بعض فئات IMA الجديدة، كما هو موضّح أدناه.

تعديل الإعدادات للسماح بالتشغيل في الخلفية

يتطلّب وضع "نافذة ضمن النافذة" السماح بتشغيل الوسائط في الخلفية في تطبيقك.

  1. اضبط أوضاع التشغيل في الخلفية على تفعيل لكل من الصوت وAirPlay و"النافذة ضمن النافذة" كما هو موضّح أدناه:

  2. اضبط سمات AVAudioSession لتفعيل ميزة التشغيل في الخلفية، بالإضافة إلى تفعيلها في IMASettings:

    ... (void)viewDidLoad {
     [super viewDidLoad];
    
     self.playButton.layer.zPosition = MAXFLOAT;
    
     [[AVAudioSession sharedInstance] setActive:YES error:nil];
     [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    
     [self setupAdsLoader];
     [self setUpContentPlayer];
    } (void)setupAdsLoader {
     IMASettings *settings = [[IMASettings alloc] init];
     settings.enableBackgroundPlayback = YES;
     self.adsLoader = [[IMAAdsLoader alloc] initWithSettings:settings];
     self.adsLoader.delegate = self;
    }

إنشاء عناصر جديدة لنظام التشغيل iOS وIMA لاستخدام ميزة "نافذة ضمن النافذة"

لإتاحة ميزة "نافذة ضمن النافذة"، أضافت Apple الفئتين AVPictureInPictureController وAVPictureinPictureControllerDelegate. من جهتها، أضافت IMA IMAPictureInPictureProxy. لتضمين هذه الفئات في مشروعك، أضِف العبارات التالية إلى الرمز:

...
@interface VideoViewController () <AVPictureInPictureControllerDelegate,
                                   IMAAdsLoaderDelegate,
                                   IMAAdsManagerDelegate,
                                   UIAlertViewDelegate>
...
// PiP objects.
@property(nonatomic, strong) IMAPictureInPictureProxy *pictureInPictureProxy;
@property(nonatomic, strong) AVPictureInPictureController *pictureInPictureController;
...
@end

- (void)setUpContentPlayer {
  ...
  self.pictureInPictureProxy =
      [[IMAPictureInPictureProxy alloc] initWithAVPictureInPictureControllerDelegate:self];
  self.pictureInPictureController =
      [[AVPictureInPictureController alloc] initWithPlayerLayer:self.contentPlayerLayer];
  self.pictureInPictureController.delegate = self.pictureInPictureProxy;
}

تعديل طلب الإعلانات

يجب إنشاء عنصر جديد آخر: IMAAVPlayerVideoDisplay. يتم تمرير هذا المعرّف إلى الدالة الإنشائية IMAAdsRequest، ويسمح لحزمة تطوير البرامج (SDK) بإدراج الإعلانات في نافذة "نافذة ضمن النافذة" عند تشغيل الفيديو في وضع "نافذة ضمن النافذة":

...
- (void)requestAdsWithTag:(NSString *)adTagUrl {
  [self logMessage:@"Requesting ads"];
  // Create an ad request with our ad tag, display container, and optional user context.
  IMAAdsRequest *request = [[IMAAdsRequest alloc]
           initWithAdTagUrl:adTagUrl
         adDisplayContainer:[self createAdDisplayContainer]
       avPlayerVideoDisplay:[[IMAAVPlayerVideoDisplay alloc] initWithAVPlayer:self.contentPlayer]
      pictureInPictureProxy:self.pictureInPictureProxy
                userContext:nil];
  [self.adsLoader requestAdsWithRequest:request];
}

بدء عرض الإعلانات

لا يمكن بدء إعلانات حزمة تطوير البرامج لإعلانات الوسائط التفاعلية (IMA SDK) أثناء وضع "نافذة ضمن النافذة". نتيجةً لذلك، عليك التأكّد من أنّك تستدعي [adsManager start] فقط عندما يكون الفيديو في وضع التشغيل العادي:

...
- (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdEvent:(IMAAdEvent *)event {
  [self logMessage:@"AdsManager event (%s).", AdEventNames[event.type]];
  // When the SDK notified you that ads have been loaded, play them.
  switch (event.type) {
    case kIMAAdEvent_LOADED:
      if (![self.pictureInPictureController isPictureInPictureActive]) {
        [adsManager start];
      }
      break;
    ...
    default:
      break;
  }
}

الدخول في وضع "نافذة ضمن النافذة"

إذا كنت تستخدم AVPlayer بدون AVPlayerViewController، عليك إضافة زر "نافذة ضمن النافذة" الخاص بك. لقد نفّذنا أحدها في العينة المتقدّمة على النحو التالي:

- (IBAction)onPipButtonClicked:(id)sender {
  if ([self.pictureInPictureController isPictureInPictureActive]) {
    [self.pictureInPictureController stopPictureInPicture];
  } else {
    [self.pictureInPictureController startPictureInPicture];
  }
}

الأسئلة الشائعة

كيف يمكنني بدء عرض الإعلانات عندما يكون الفيديو في وضع "نافذة ضمن النافذة"؟
لا يمكن بدء الإعلانات أثناء عرض الفيديو في وضع "نافذة ضمن النافذة"، بل يمكن بدءها فقط في وضع التشغيل العادي.
يجب أن يضبط دمج ميزة "نافذة ضمن النافذة" الحالية self.pictureInPictureController.delegate على فئتي الخاصة. كيف يمكنني تنفيذ إعلانات IMA في وضع "نافذة ضمن النافذة" مع البقاء المفوّض؟
يجب أن تتلقّى حزمة IMA SDK أيضًا رسائل AVPictureinPictureControllerDelegate لإتاحة تشغيل الإعلانات في وضع "نافذة ضمن النافذة". لهذا السبب، نطلب منك ضبط عنصر التحكّم AVPictureinPictureController على مثيل من IMAPictureInPicturyProxy. يعيد عنصر الوكيل هذا توجيه جميع رسائل AVPictureinPictureControllerDelegate إلى تطبيقك، كما يعيد توجيه طلبات البيانات إلى IMA لتفعيل ميزة "نافذة ضمن النافذة". يُرجى العِلم أنّه يجب أيضًا الاحتفاظ بمعرّف محلي لـ AVPlayerLayer.