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

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

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

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

اعتبارًا من الإصدار 3.1.0 من حزمة تطوير البرامج، تتيح IMA وضع "صورة في صورة" من 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 constructor، ما يسمح لحزمة 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];
}

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

لا يمكن بدء إعلانات حزمة تطوير البرامج (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.