نافذة ضمن النافذة

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

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

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

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

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

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

  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. وتمت إضافة 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];
}

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

لا يمكن بدء تشغيل إعلانات حزمة تطوير البرامج لإعلانات الوسائط التفاعلية أثناء وضع "نافذة ضمن النافذة". كنتيجة لذلك، يجب الحرص على الاتصال بـ [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) ضمن ميزة "نافذة ضمن النافذة" لكي أظل مفوَّضًا؟
يجب أيضًا أن تتلقّى حزمة تطوير البرامج لإعلانات الوسائط التفاعلية رسالتَين (AVPictureinPictureControllerDelegate) لتفعيل تشغيل الإعلان في وضع الصورة في وضع الصورة. ولهذا السبب، نطلب منك ضبط تفويض AVPictureinPictureController على مثال IMAPictureInPicturyProxy. يعيد كائن الخادم الوكيل هذا توجيه جميع رسائل AVPictureinPictureControllerDelegate إلى تطبيقك، ولكنه يعيد أيضًا توجيه المكالمات إلى IMA لتفعيل دعم ميزة "نافذة ضمن النافذة". تجدر الإشارة إلى أنّه يجب أيضًا الاحتفاظ باسم معرِّف محلي لـ AVPlayerLayer.