إنشاء محوِّل إشارات آمنة

الإشارات الآمنة هي بيانات مشفّرة يجمعها جهاز العميل ويشاركها مع مقدّمي عروض أسعار محدّدين. ترشدك هذه الصفحة إلى كيفية جمع الإشارات الآمنة وإرسالها إلى مدير إعلانات Google باستخدام حزمة تطوير البرامج (SDK) لإعلانات الوسائط التفاعلية.

قبل البدء

قبل المتابعة، تأكَّد من توفّر حزمة تطوير البرامج (SDK) لإعلانات الوسائط التفاعلية لنظام التشغيل iOS‏ 3.18.5 أو إصدار أحدث.

إنشاء واجهة لمحوّل الإشارات الآمنة

لجمع الإشارات الآمنة وتقديمها، أنشئ فئات تنفِّذ ال واجهة:

Objective-C

  • MySecureSignalsAdapter.h:
#import <Foundation/Foundation.h>
#import <GoogleInteractiveMediaAds/GoogleInteractiveMediaAds.h>
/** An example implementation of Secure Signals adapter. */
@interface MySecureSignalsAdapter : NSObject <IMASecureSignalsAdapter>
@end
  • MySecureSignalsAdapter.m:
@implementation MySecureSignalsAdapter

  /**
* Default constructor with no arguments for IMA SDK to instantiate this class.
*/
- (instancetype)init {
  self = [super init];

  return self;
}
@end

Swift

import Foundation
import GoogleInteractiveMediaAds

/** An example implementation of Secure Signals adapter. */
@objc(MySecureSignalsAdapter)
public class MySecureSignalsAdapter: IMASecureSignalsAdapter {
  /**
  * Default constructor with no arguments for IMA SDK to instantiate this class.
  */
  override init() {
    super.init()
  }
}

إعداد المحوِّل

تُعدّ أداة تطوير البرامج لإعلانات الوسائط التفاعلية كل محوِّل مرة واحدة من خلال استدعاء طريقة الإعداد للمحوِّل. يمكنك تنفيذ هذه الطريقة لبدء أيّ تبعيات تشفير أو إعداد ملفّات cache أو احتساب أيّ إشارات تظلّ كما هي في جميع طلبات جمع الإشارات.

يُنشئ المثال التالي المحوِّل:

Objective-C

...
@interface MySecureSignalsAdapter
@property(nonatomic) NSError *initError;
@end
...
/**
* Initialize your SDK and any dependencies.
* IMA SDK calls this function exactly once before signal collection.
*/
- (instancetype)init {
  self = [super init];
  @try {
    // Initialize your SDK and any dependencies.
    ...
  }
  @catch(NSException *exception) {
    // Build NSError to be passed by Signal Collector.
    _initError = ...;
  }
  return self;
}
...

Swift

...
@objc(MySecureSignalsAdapter)
public class MySecureSignalsAdapter: IMASecureSignalsAdapter {
...
  private var initError

  override init() {
    super.init()

    do {
      // Initialize your SDK and any dependencies.
      ...
    } catch {
      // Build NSError to be passed by Signal Collector.
      self.initError = ...;
    }
  }
}

جمع الإشارات

قبل بدء طلب إعلان، تستدعي حزمة تطوير البرامج (SDK) لإعلانات الوسائط التفاعلية أسلوب جمع الإشارات بشكل غير متزامن. وتتضمّن طرق تجميع الإشارات هذه وظيفة استدعاء لتمرير الإشارات المشفرة أو الإبلاغ عن خطأ.

تجمع الأمثلة التالية الإشارات الآمنة من خلال دالة callback:

Objective-C

...
/**
* Invokes your SDK to collect, encrypt and pass the signal collection results to IMA SDK.
* IMA SDK calls this function before each ad request.
*
* @param completion A callback function to pass signal collection results to IMA SDK.
*/
- (void)collectSignalsWithCompletion:(IMASignalCompletionHandler)completion {
  // Output any initialization errors
  if (self.initError) {
    completion(nil, self.initError);
    return;
  }
  @try {
    // Collect and encrypt the signals.
    NSString *signals = ...
    // Pass the encrypted signals to IMA SDK.
    completion(signals, nil);
  }
  @catch(NSException *exception) {
    NSError *collectSignalError = ...;
    // Pass signal collection failures to IMA SDK.
    completion(nil, collectSignalError);
  }
}
...

Swift

...
  /**
  * Invokes your SDK to collect, encrypt and pass the signal collection results to IMA SDK.
  * IMA SDK calls this function before each ad request.
  *
  * @param completion A callback function to pass signal collection results to IMA SDK.
  */
  public func collectSignals(completion: @escaping IMASignalCompletionHandler) {
    if (self.initError) {
      completion(nil, self.initError)
      return
    }

    do {
      // Collect and encrypt the signals.
      var signals = ...
      // Pass the encrypted signals to IMA SDK.
      completion(signals, nil)
    } catch {
      NSError collectSignalError = ...
      // Pass signal collection failures to IMA SDK.
      completion(nil, collectSignalError)
    }
  }
...

الإبلاغ عن الأخطاء

للتواصل مع المستخدمين الذين يستخدمون فئة المحوِّل، أبلِغ عن جميع الأخطاء أثناء جمع الإشارات ونقلها إلى دالة الاستدعاء الخاصة بجامع الإشارات. تؤدي هذه العملية إلى تحديد وحل المشاكل التي تحدث أثناء دمج المحول مع التطبيقات.

في ما يلي الأخطاء التي قد تظهر:

  • لم يتم العثور على حزمة تطوير البرامج (SDK) أو إحدى التبعيات في التطبيق.
  • لا تملك حزمة SDK أو إحدى الحِزم المُعتمَدة الإذن المطلوب أو موافقة المستخدِم للقيام بعملها.

تحديد إصدار المحوِّل

في سير العمل، تأكَّد من تحديد إصدار المحوِّل. تتضمّن أداة تطوير البرامج لإعلانات الوسائط التفاعلية (IMA SDK) إصدار المحوِّل في كل طلب إعلان وتُرسله مع الإشارات الآمنة في طلب عرض السعر.

في طلب عرض السعر، واستنادًا إلى إصدار المحوّل، يمكنك تحديد تفاصيل التشفير والترميز والتنسيق التي يستخدمها المحوّل لإنشاء الإشارات الآمنة.

يحدِّد المثال التالي إصدار المحوِّل:

Objective-C

...
/**
* Specifies this adapter's version.
*/
static NSInteger const VersionMajor = 1;
static NSInteger const VersionMinor = 0;
static NSInteger const VersionPatch = 1;
...
/**
* @return The version of this adapter.
*         IMA SDK calls this function before each ad request.
*/
+ (IMAVersion *)adapterVersion {
  // The version of the SecureSignals Adapter.
  IMAVersion *adapterVersion = [[IMAVersion alloc] init];
  adapterVersion.majorVersion = VersionMajor;
  adapterVersion.minorVersion = VersionMinor;
  adapterVersion.patchVersion = VersionPatch;
  return adapterVersion;
}
...

Swift

...
  /**
  * Specifies this adapter's version.
  */
  static let VersionMajor = 1;
  static let VersionMinor = 0;
  static let VersionPatch = 1;
...
  /**
  * @return The version of this adapter.
  *         IMA SDK calls this function before each ad request.
  */
  public static func adapterVersion() -> IMAVersion {
    let adapterVersion = IMAVersion()
    adapterVersion.majorVersion = self.VersionMajor
    adapterVersion.minorVersion = self.VersionMinor
    adapterVersion.patchVersion = self.VersionPatch
    return adapterVersion
  }
...

عرض إصدار بيئة تشغيل حزمة تطوير البرامج (SDK)

يمكنك تصميم المحوِّل للعمل مع إصدارات متعددة من حزمة SDK. لكي يعمل المحوِّل مع إصدارات متعددة، تأكَّد من عرض إصدار وقت التشغيل ل حزمة SDK. في كلّ طلب إعلان، تتضمّن حزمة تطوير برامج IMA إصدار وقت التشغيل مع إصدار المُحوِّل.

تطلب الأمثلة التالية إصدار وقت تشغيل حزمة SDK وتُرجعه:

Objective-C

...
/**
* @return The version of your SDK that this adapter is depending on.
*         IMA SDK calls this function before each ad request.
*/
+ (IMAVersion *)adSDKVersion {
  // Request the version from your SDK and convert to an IMAVersion.
  int mySDKVersion[3] = ...

  IMAVersion *adSDKVersion = [[IMAVersion alloc] init];
  adSDKVersion.majorVersion = mySDKVersion[0];
  adSDKVersion.minorVersion = mySDKVersion[1];
  adSDKVersion.patchVersion = mySDKVersion[2];

  return adSDKVersion;
}
...

Swift

...
  /**
  * @return The version of your SDK that this adapter is depending on.
  *         IMA SDK calls this function before each ad request.
  */
public static func adSDKVersion() -> IMAVersion {
    // Request the version from your SDK and convert to an IMAVersion.
    let mySDKVersion = ...

    let adSDKVersion = IMAVersion()
    adSDKVersion.majorVersion = mySDKVersion[0]
    adSDKVersion.minorVersion = mySDKVersion[1]
    adSDKVersion.patchVersion = mySDKVersion[2]
    return adSDKVersion
  }
...

تسجيل المحوِّل لدى Google

لكي تمنحه Google الإذن بجمع الإشارات، عليك تسجيل اسم فئة iOS لدى Google. لا تبدأ حزمة تطوير البرامج (SDK) لإعلانات الوسائط التفاعلية سوى محوِّلات البيانات التي تسجّلها لدى Google.

التحقّق من محوّل الطاقة

للتحقّق من صحّة المحوِّل، أكمِل الأقسام التالية:

ضبط التطبيق التجريبي

قبل التحقّق من صحّة المحوِّل، عليك ضبط إعدادات تطبيق الاختبار. أكمِل الخطوات التالية:

  1. إضافة حزمة تطوير البرامج لإعلانات الوسائط التفاعلية إلى ملف المجموعة:

    source 'https://github.com/CocoaPods/Specs.git'
    platform :ios, '10'
    target "BasicExample" do
      pod 'GoogleAds-IMA-iOS-SDK', '~> 3.17.0'
    end
    
  2. ثبِّت حزمة تطوير البرامج لإعلانات الوسائط التفاعلية باستخدام CocoaPods. للحصول على تعليمات حول تثبيت حزمة تطوير البرامج لإعلانات الوسائط التفاعلية من خلال CocoaPods، يُرجى الاطّلاع على البدء.

  3. في مشروع XCode، أضِف المحوِّل وحزمة تطوير البرامج (SDK) وأي تبعيات ملف بدء برمجي متبقّية أضفتها.

التحقّق من الإشارات

للتحقّق من طول الإشارة الآمنة والقيمة المشفّرة وإصدار المحوّل وإصدار حزمة تطوير البرامج (SDK)، يُرجى التواصل مع فريق الدعم لمشاركة سجلّ الزيارات الذي تم تسجيله.

مراجعة الأمثلة الكاملة

يعرض هذا القسم المثال المكتمل لجميع الخطوات، وهو متاح للاطّلاع عليه.

Objective-C

  • MySecureSignalsAdapter.h:
#import <Foundation/Foundation.h>
#import <GoogleInteractiveMediaAds/GoogleInteractiveMediaAds.h>

/** An example implementation of Secure Signals adapter. */
@interface MySecureSignalsAdapter : NSObject <IMASecureSignalsAdapter>
@end
  • MySecureSignalsAdapter.m:
#import "path/to/MyExampleSecureSignalsAdapter.h"

@interface MySecureSignalsAdapter
@property(nonatomic) NSError *initError;
@end

static NSInteger const VersionMajor = 1;
static NSInteger const VersionMinor = 0;
static NSInteger const VersionPatch = 1;

@implementation MySecureSignalsAdapter
/**
* Initialize your SDK and any dependencies.
* IMA SDK calls this function exactly once before signal collection.
*/
- (instancetype)init {
  self = [super init];
  @try {
    // Initialize your SDK and any dependencies.
    ...
  }
  @catch(NSException *exception) {
    // Build NSError to be passed by Signal Collector.
    _initError = ...;
  }
  return self;
}
/**
* Invokes your SDK to collect, encrypt and pass the signal collection results to IMA SDK.
* IMA SDK calls this function before each ad request.
*
* @param completion A callback function to pass signal collection results to IMA SDK.
*/
- (void)collectSignalsWithCompletion:(IMASignalCompletionHandler)completion {
  if (self.initError) {
    completion(nil, self.initError);
    return;
  }
  @try {
    // Collect and encrypt the signals.
    NSString *signals = ...
    // Pass the encrypted signals to IMA SDK.
    completion(signals, nil);
  }
  @catch(NSException *exception) {
    NSError *collectSignalError = ...;
    // Pass signal collection failures to IMA SDK.
    completion(nil, collectSignalError);
  }
}
/**
* @return The version of this adapter.
*         IMA SDK calls this function before each ad request.
*/
+ (IMAVersion *)adapterVersion {
  // The version of the SecureSignals Adapter.
  IMAVersion *adapterVersion = [[IMAVersion alloc] init];
  adapterVersion.majorVersion = VersionMajor;
  adapterVersion.minorVersion = VersionMinor;
  adapterVersion.patchVersion = VersionPatch;
  return adapterVersion;
}

/**
  * @return The version of your SDK that this adapter depends on.
  *         IMA SDK calls this function before each ad request.
  */
+ (IMAVersion *)adSDKVersion {
  // Request the version from your SDK and convert to an IMAVersion.
  int mySDKVersion[3] = ...

  IMAVersion *adSDKVersion = [[IMAVersion alloc] init];
  adSDKVersion.majorVersion = mySDKVersion[0];
  adSDKVersion.minorVersion = mySDKVersion[1];
  adSDKVersion.patchVersion = mySDKVersion[2];

  return adSDKVersion;
}

@end

Swift

@objc(MySecureSignalsAdapter)
public class MySecureSignalsAdapter: IMASecureSignalsAdapter {
  static let VersionMajor = 1;
  static let VersionMinor = 0;
  static let VersionPatch = 1;

  private var initError

  override init() {
    super.init()

    do {
      // Initialize your SDK and any dependencies.
      ...
    } catch {
      // Build NSError to be passed by Signal Collector.
      self.initError = ...;
    }
  }

  public func collectSignals(completion: @escaping IMASignalCompletionHandler) {
    if (self.initError) {
      completion(nil, self.initError)
      return
    }

    do {
      // Collect and encrypt the signals.
      var signals = ...
      // Pass the encrypted signals to IMA SDK.
      completion(signals, nil)
    } catch {
      NSError collectSignalError = ...
      // Pass signal collection failures to IMA SDK.
      completion(nil, collectSignalError)
    }      
  }

  public static func adapterVersion() -> IMAVersion {
    let adapterVersion = IMAVersion()
    adapterVersion.majorVersion = self.VersionMajor
    adapterVersion.minorVersion = self.VersionMinor
    adapterVersion.patchVersion = self.VersionPatch
    return adapterVersion
  }

  public static func adSDKVersion() -> IMAVersion {
    // Request the version from your SDK and convert to an IMAVersion.
    let mySDKVersion = ...

    let adSDKVersion = IMAVersion()
    adSDKVersion.majorVersion = mySDKVersion[0]
    adSDKVersion.minorVersion = mySDKVersion[1]
    adSDKVersion.patchVersion = mySDKVersion[2]
    return adSDKVersion
  }
}