สัญญาณที่ปลอดภัยคือข้อมูลที่เข้ารหัสซึ่งอุปกรณ์ไคลเอ็นต์รวบรวมและแชร์กับผู้เสนอราคาบางราย หน้านี้จะแนะนำวิธีการรวบรวมและส่งสัญญาณที่ปลอดภัยไปยัง Google Ad Manager โดยใช้ SDK โฆษณาสื่ออินเทอร์แอกทีฟ (IMA)
ก่อนเริ่มต้น
ก่อนดำเนินการต่อ โปรดตรวจสอบว่าคุณมี IMA 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()
}
}
เริ่มต้นอะแดปเตอร์
IMA SDK จะเริ่มต้นอะแดปเตอร์แต่ละรายการด้วยการเรียกวิธีการเริ่มต้นของอะแดปเตอร์ ใช้วิธีนี้เพื่อเริ่มต้นทรัพยากร Dependency ของการเข้ารหัส ตั้งค่าแคช หรือคำนวณสัญญาณที่ยังคงเหมือนเดิมในการเรียกใช้การรวบรวมสัญญาณทั้งหมด
ตัวอย่างต่อไปนี้จะเริ่มต้นอะแดปเตอร์
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 จะเรียกใช้เมธอดรวบรวมสัญญาณแบบไม่สอดคล้องกัน เมธอดของผู้รวบรวมสัญญาณเหล่านี้มีฟังก์ชัน 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)
}
}
...
รายงานข้อผิดพลาด
หากต้องการสื่อสารกับผู้ใช้ที่ใช้คลาสอะแดปเตอร์ ให้รายงานข้อผิดพลาดทั้งหมดระหว่างการรวบรวมสัญญาณและส่งต่อไปยัง Callback ของผู้รวบรวมสัญญาณ กระบวนการนี้จะแก้ปัญหาที่เกิดขึ้นระหว่างการผสานรวมอะแดปเตอร์กับแอปพลิเคชัน
ข้อผิดพลาดที่อาจปรากฏมีดังนี้
- ไม่พบ 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
คุณต้องลงทะเบียนชื่อคลาส iOS กับ Google จึงจะให้ Google ให้สิทธิ์อะแดปเตอร์ในการรวบรวมสัญญาณ IMA SDK จะเริ่มต้นเฉพาะอะแดปเตอร์ที่คุณลงทะเบียนกับ Google เท่านั้น
ตรวจสอบอะแดปเตอร์
กรอกข้อมูลในส่วนต่อไปนี้เพื่อตรวจสอบอะแดปเตอร์
กำหนดค่าแอปพลิเคชันทดสอบ
กำหนดค่าแอปพลิเคชันทดสอบก่อนที่จะตรวจสอบอะแดปเตอร์ ทําตามขั้นตอนต่อไปนี้
เพิ่ม IMA SDK ลงในไฟล์ pod
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
}
}