สัญญาณที่ปลอดภัยคือข้อมูลที่เข้ารหัสซึ่งอุปกรณ์ไคลเอ็นต์รวบรวมและแชร์กับผู้เสนอราคาบางราย หน้านี้จะแนะนําคุณเกี่ยวกับการรวบรวมและส่งสัญญาณที่ปลอดภัยไปยัง Google Ad Manager โดยใช้ SDK โฆษณาสื่ออินเทอร์แอกทีฟ (IMA)
ก่อนเริ่มต้น
ก่อนดำเนินการต่อ ให้ตรวจสอบว่าคุณมี IMA SDK สำหรับ iOS v3.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()
  }
}
เริ่มต้นอะแดปเตอร์
IMA SDK จะเริ่มต้นอะแดปเตอร์แต่ละตัว 1 ครั้งโดยเรียกใช้เมธอดการเริ่มต้น ของอะแดปเตอร์ ใช้เมธอดนี้เพื่อเริ่มการพึ่งพาการเข้ารหัส ตั้งค่าแคช หรือคำนวณล่วงหน้าสำหรับสัญญาณที่ยังคงเหมือนเดิมในการเรียกการรวบรวมสัญญาณทั้งหมด
ตัวอย่างต่อไปนี้จะเริ่มต้นใช้งานอแดปเตอร์
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 = ...;
    }
  }
}
การรวบรวมสัญญาณ
ก่อนที่จะเริ่มคำขอโฆษณา IMA SDK จะเรียกใช้เมธอดรวบรวมสัญญาณ แบบไม่พร้อมกัน วิธีการรวบรวมสัญญาณเหล่านี้มีฟังก์ชันเรียกกลับเพื่อ ส่งสัญญาณที่เข้ารหัสหรือรายงานข้อผิดพลาด
ตัวอย่างต่อไปนี้รวบรวมสัญญาณที่ปลอดภัยผ่านฟังก์ชัน การเรียกกลับ
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 หรือทรัพยากร Dependency ในแอปพลิเคชัน
- SDK หรือ Dependency ของคุณไม่มีสิทธิ์หรือความยินยอมจากผู้ใช้ที่จำเป็นในการทำงาน
ระบุเวอร์ชันของอะแดปเตอร์
ในเวิร์กโฟลว์ ให้ตรวจสอบว่าคุณได้ระบุเวอร์ชันของอแดปเตอร์ 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 จะรวมเวอร์ชันรันไทม์ไว้กับ เวอร์ชันของอแดปเตอร์
ตัวอย่างต่อไปนี้จะขอและแสดงผลเวอร์ชันรันไทม์ของ 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 IMA SDK จะเริ่มต้นเฉพาะอะแดปเตอร์ที่คุณลงทะเบียนกับ Google เท่านั้น
ตรวจสอบอะแดปเตอร์
หากต้องการตรวจสอบความถูกต้องของอแดปเตอร์ ให้ทําตามส่วนต่อไปนี้
กำหนดค่าแอปพลิเคชันทดสอบ
ก่อนตรวจสอบอะแดปเตอร์ ให้กำหนดค่าแอปพลิเคชันทดสอบ ทำตาม ขั้นตอนต่อไปนี้
- เพิ่ม IMA SDK ลงในไฟล์พ็อด - source 'https://github.com/CocoaPods/Specs.git' platform :ios, '10' target "BasicExample" do pod 'GoogleAds-IMA-iOS-SDK', '~> 3.17.0' end
- ติดตั้ง IMA SDK โดยใช้ CocoaPods ดูวิธีการติดตั้ง IMA SDK ผ่าน CocoaPods ได้ที่ เริ่มต้นใช้งาน 
- ในโปรเจ็กต์ 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
  }
}