การปรับแต่ง iOS SDK
การผสานการทำงาน
Anchor link to- Deep linking
- การติดตามการซื้อภายในแอป
- การแจ้งเตือนพุชแบบ Geozones
- การสร้างคิวสำหรับ Rich Media
- การเล่นวิดีโออัตโนมัติที่ส่งมาใน Rich Notification ด้วย force touch
- เสียงพุชที่กำหนดเอง
- iOS Provisional Push
Deep linking
Anchor link toในไฟล์ Info.plist ของคุณ ให้เพิ่มอาร์เรย์ URL types
พร้อมกับ URL Identifier
และ URL Scheme
ในตัวอย่างด้านล่าง URL Scheme
คือ com.pushwoosh และ URL Identifier
คือ promotion

ในไฟล์ App Delegate ของคุณ (โดยปกติคือ AppDelegate.m สำหรับ iOS 12 และต่ำกว่า หรือ SceneDelegate.m สำหรับ iOS 13 ขึ้นไป) ให้เพิ่มฟังก์ชัน openURL delegate ที่เหมาะสมตามที่แสดงในตัวอย่างด้านล่าง ตัวอย่างนี้จะตรวจสอบหน้าเว็บที่ถูกต้อง แยกวิเคราะห์ค่า “id” จาก URL และเปิด PromoPageViewController เพื่อตอบสนอง
AppDelegate.swift
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { let components = URLComponents(url: url, resolvingAgainstBaseURL: false) let page = components?.host var promotionId: String?
if page == "promotion" { return }
let items = components?.queryItems ?? []
for item in items { if item.name == "id" { promotionId = item.value } }
//show PromoPageViewController}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO]; NSString *page = components.host; NSString *promotionId = nil;
//return if this is not a promotion deep link if(![page isEqualToString:@"promotion"])
return NO;
for(NSURLQueryItem *item in components.queryItems) { if([item.name isEqualToString:@"id"]) promotionId = item.value; }
PromoPageViewController *vc = [[PromoPageViewController alloc] init]; vc.promotionId = promotionId [self presentViewController:vc animated:YES completion:nil];}
SceneDelegate.swift
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { guard let urlContext = URLContexts.first else { return }
let components = URLComponents(url: urlContext.url, resolvingAgainstBaseURL: false) let page = components?.host var promotionId: String?
guard page == "promotion" else { return }
let items = components?.queryItems ?? []
for item in items { if item.name == "id" { promotionId = item.value } }
//show PromoPageViewController}
- (void)scene:(UIWindowScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts { UIOpenURLContext *urlContext = URLContexts.anyObject; if (!urlContext) { return; }
NSURLComponents *components = [NSURLComponents componentsWithURL:urlContext.URL resolvingAgainstBaseURL:NO]; NSString *page = components.host; NSString *promotionId = nil;
if (![page isEqualToString:@"promotion"]) { return; }
for (NSURLQueryItem *item in components.queryItems) { if ([item.name isEqualToString:@"id"]) { promotionId = item.value; } }
//show PromoPageViewController}
การติดตามการซื้อภายในแอป
Anchor link toโดยค่าเริ่มต้น การติดตามการซื้อภายในแอปจะถูกปิดใช้งาน หากคุณต้องการติดตามการซื้อภายในแอปเมื่อกำหนดค่า Customer Journeys ให้ตั้งค่าแฟล็ก Pushwoosh_PURCHASE_TRACKING_ENABLED เป็น true ในไฟล์ info.plist คุณสามารถดูรายการแฟล็กที่มีทั้งหมดได้ในตาราง
หากคุณต้องการติดตามการซื้อภายในแอปด้วยตนเอง คุณสามารถใช้โค้ดด้านล่างได้
ในเมธอด delegate paymentQueue:updatedTransactions:
ให้เรียกเมธอด sendSKPaymentTransactions
ของ PushManager
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { // In-Apps Tracking Pushwoosh code here Pushwoosh.sharedInstance().sendSKPaymentTransactions(transactions) // the rest of the code, consume transactions, etc }
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
[[PushNotificationManager pushManager] sendSKPaymentTransactions:transactions];
//the rest of the code, consume transactions, etc}

การแจ้งเตือนพุชแบบ Geozones
Anchor link toการแจ้งเตือนพุชแบบ Geozones ถูกรวมอยู่ในเฟรมเวิร์กแยกต่างหากชื่อ PushwooshGeozones
- เพิ่ม PushwooshGeozones.framework ไปยังโปรเจกต์ของคุณ
หากต้องการเพิ่ม PushwooshGeozones.framework ไปยังโปรเจกต์ของคุณโดยใช้ตัวจัดการ dependency ให้ใส่บรรทัดต่อไปนี้ใน podfile
หรือ cartfile
ของคุณ:
pod 'PushwooshXCFramework/Geozones'
github "Pushwoosh/pushwoosh-ios-sdk"
หากคุณต้องการใช้ PushwooshGeozones.xcframework ให้ป้อน Package URL ต่อไปนี้:
PushwooshGeozones-XCFramework
อีกวิธีหนึ่งคือ คุณสามารถลากและวางเฟรมเวิร์กไปที่ Link Binaries With Libraries ใน Build Phases ของโปรเจกต์ของคุณได้
- เพิ่มคีย์ต่อไปนี้ลงใน Info.plist ของคุณ:
- NSLocationWhenInUseUsageDescription – (จำเป็น) เพื่อให้แอปติดตาม Geozones เฉพาะเมื่อทำงานในเบื้องหน้า (foreground)
- NSLocationAlwaysAndWhenInUseUsageDescription – (จำเป็น) เพื่อให้แอปติดตาม Geozones ทั้งในเบื้องหน้าและเบื้องหลัง และเพื่อแสดงป๊อปอัปขออนุญาต
- NSLocationAlwaysUsageDescription – (ไม่บังคับ) เพื่อให้แอปติดตาม Geozones ตลอดเวลา; ควรใช้หากแอปของคุณกำหนดเป้าหมายเป็น iOS 10 และเวอร์ชันก่อนหน้า
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key><string>เพื่อให้แอปติดตาม Geozones ทั้งในเบื้องหน้าและเบื้องหลัง และเพื่อแสดงไดอะล็อกขออนุญาต</string><key>NSLocationWhenInUseUsageDescription</key><string>เพื่อให้แอปติดตาม Geozones เฉพาะเมื่อทำงานในเบื้องหน้า</string>
- นำเข้าเฟรมเวิร์ก
import PushwooshGeozones
#import <PushwooshGeozones/PWGeozonesManager.h>
- เริ่มการติดตาม Geozones
PWGeozonesManager.shared()?.startLocationTracking()
[[PWGeozonesManager sharedManager] startLocationTracking];
ตัวอย่าง
Anchor link tooverride func viewDidLoad() { super.viewDidLoad()
// Start Geozones tracking when needed PWGeozonesManager.shared().startLocationTracking()}
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view.
// Start Geozones tracking when needed [[PWGeozonesManager sharedManager] startLocationTracking];}
การสร้างคิวสำหรับ Rich Media
Anchor link toในกรณีที่มีหน้า Rich Media หลายหน้าที่ต้องแสดงพร้อมกัน (เช่น เกิดเหตุการณ์ทริกเกอร์สำหรับ In-Apps สองรายการขึ้นไปในขณะเดียวกัน หรือมีหน้า Rich Media แสดงอยู่แล้วในขณะที่เกิดเหตุการณ์ทริกเกอร์อื่น) คุณสามารถตั้งค่าคิวสำหรับการแสดงหน้า Rich Media ได้ หากต้องการสร้างคิว ให้ทำตามขั้นตอนที่อธิบายไว้ด้านล่าง
- สร้างคลาสที่ implement PWRichMediaPresentingDelegate:
@interface ChainedRichMediaPresentingDelegate () <PWRichMediaPresentingDelegate>
@property (nonatomic) NSMutableArray *queue;
@property (nonatomic) BOOL inAppIsPresenting;
@end
@implementation ChainedRichMediaPresentingDelegate
- (instancetype)init { self = [super init];
if (self) { _queue = [NSMutableArray new]; }
return self;}
- (BOOL)richMediaManager:(PWRichMediaManager *)richMediaManager shouldPresentRichMedia:(PWRichMedia *)richMedia { [_queue addObject:richMedia]; return !_inAppIsPresenting;}
- (void)richMediaManager:(PWRichMediaManager *)richMediaManager didPresentRichMedia:(PWRichMedia *)richMedia { _inAppIsPresenting = YES;}
- (void)richMediaManager:(PWRichMediaManager *)richMediaManager didCloseRichMedia:(PWRichMedia *)richMedia { _inAppIsPresenting = NO;
[_queue removeObject:richMedia];
if (_queue.count) { [[PWRichMediaManager sharedManager] presentRichMedia:_queue.firstObject]; }}
- (void)richMediaManager:(PWRichMediaManager *)richMediaManager presentingDidFailForRichMedia:(PWRichMedia *)richMedia withError:(NSError *)error { [self richMediaManager:richMediaManager didCloseRichMedia:richMedia];}
@end
2. ตั้งค่า delegate:
[PWRichMediaManager sharedManager].delegate = [ChainedRichMediaPresentingDelegate new];
การเล่นวิดีโออัตโนมัติที่ส่งมาใน Rich Notification ด้วย force touch
Anchor link toเพื่อให้วิดีโอที่ส่งเป็น ไฟล์แนบ Rich Notification เล่นอัตโนมัติเมื่อการแจ้งเตือนถูกขยายออกโดยไม่ต้องมีการโต้ตอบจากผู้ใช้ ให้ทำตามขั้นตอนด้านล่าง:
- เพิ่ม Notification Content Extension ไปยังโปรเจกต์ของคุณ:
- ใน Xcode เลือก File > New > Target
- เลือก Notification Content Extension
- ตั้งชื่อและดำเนินการตั้งค่าให้เสร็จสิ้น

หากมีข้อความ “Activate scheme” ปรากฏขึ้น ให้เลือก Cancel

- ปรับคุณสมบัติและเมธอดใน Content Extension ดังต่อไปนี้:
import UIKitimport UserNotificationsimport UserNotificationsUIimport AVKit
class NotificationViewController: UIViewController, UNNotificationContentExtension { var playerController: AVPlayerViewController! @IBOutlet weak var playerBackgroundView: UIView!
override func viewDidLoad() { super.viewDidLoad() // Do any required interface initialization here. }
func didReceive(_ notification: UNNotification) { let attachment = notification.request.content.attachments.first
playerController = AVPlayerViewController() // Set height programmatically // preferredContentSize.height = 250
if let url = attachment?.url { setupVideoPlayer(url: url) } else { print("No valid URL...") } }
private func setupVideoPlayer(url: URL) { guard let playerController = self.playerController else { return } let player = AVPlayer(url: url) playerController.player = player playerController.view.frame = self.playerBackgroundView.bounds playerBackgroundView.addSubview(playerController.view) addChild(playerController) playerController.didMove(toParent: self) player.play() }
- เพิ่ม UIView ลงใน MainInterface.storyboard:

- เชื่อมโยง playerBackgroundView IBOutlet กับ UIView ที่คุณเพิ่งเพิ่ม:

- อัปเดตไฟล์ info.plist ด้วยรายการต่อไปนี้:
UNNotificationExtensionUserInteractionEnabled = true

หากต้องการแนบวิดีโอไปกับการแจ้งเตือนของคุณ ให้ป้อน URL ของวิดีโอในช่อง Media Attachment ใน Control Panel:

เมื่อส่งการแจ้งเตือนผ่าน API request /createMessage ให้ใส่ URL ในพารามิเตอร์ “ios_attachment” และตรวจสอบให้แน่ใจว่าแฟล็ก “mutable-content” ถูกตั้งค่าเป็น `1`

เสียงพุชที่กำหนดเอง
Anchor link toหากต้องการเล่นเสียงที่กำหนดเองเมื่อได้รับการแจ้งเตือนพุช ให้ใส่ไฟล์เสียงลงในโฟลเดอร์รากของโปรเจกต์ของคุณก่อน

จากนั้น ระบุชื่อไฟล์เสียงในพารามิเตอร์พุช โดยกรอกข้อมูลในช่อง Sound ของการตั้งค่าเฉพาะสำหรับ iOS ของข้อความของคุณ หรือระบุชื่อไฟล์เป็นค่าสำหรับพารามิเตอร์ “ios_sound” ของ API request createMessage
ไฟล์เสียงสำหรับเสียง iOS ที่กำหนดเองต้องอยู่ในรูปแบบใดรูปแบบหนึ่งต่อไปนี้: .aif, .caf, .wav โปรดตรวจสอบให้แน่ใจว่าได้ระบุรูปแบบในชื่อไฟล์ด้วย มิฉะนั้น Pushwoosh iOS SDK จะไม่นำไปใช้งาน
iOS Provisional Push
Anchor link toวิธีการทำงาน
Anchor link toการแจ้งเตือนพุชแบบ Provisional จะปรากฏอย่างเงียบๆ ใน Notification Center ของผู้ใช้ แต่จะไม่แสดงบนหน้าจอล็อก การพุชประเภทนี้ไม่จำเป็นต้องได้รับการอนุญาตจากผู้ใช้อย่างชัดเจน: คุณสามารถเริ่มส่งได้ทันทีที่ผู้ใช้ติดตั้งและเปิดแอปของคุณ
อย่างไรก็ตาม ผู้ใช้ยังคงสามารถสมัครรับการแจ้งเตือนพุชแบบปกติ (prominent) ของคุณได้: เมื่อเปิด Provisional Push พวกเขาจะมีสองตัวเลือกในการเลือกประสบการณ์ของตนเอง – เก็บการพุชไว้ใน Notification Center โดยไม่มีการแจ้งเตือนและเสียง หรืออนุญาตให้คุณส่งการพุชแบบปกติเพื่อให้ปรากฏบนหน้าจอล็อก
Provisional Pushes ถูกออกแบบมาเพื่อให้ผู้ใช้ตัดสินใจอย่างมีข้อมูลว่าต้องการรับการแจ้งเตือนจากแอปของคุณหรือไม่ เนื่องจากการขอสมัครรับการแจ้งเตือนแบบเนทีฟของ APN จะแสดงให้ผู้ใช้เห็นเพียงครั้งเดียว และหากต้องการสมัครในภายหลัง พวกเขาจะต้องไปที่การตั้งค่าระบบของโทรศัพท์ ซึ่งผู้ใช้บางรายอาจไม่สมัครรับเนื่องจากไม่ทราบว่าพวกเขาจะได้รับประโยชน์อะไรจากการพุชของคุณ Provisional Pushes ช่วยให้ผู้ใช้เข้าใจในส่วนนี้: พวกเขาสามารถเห็นเนื้อหาที่คุณส่งในการแจ้งเตือนพุชและตัดสินใจได้ว่าต้องการรับการแจ้งเตือนเกี่ยวกับเนื้อหานั้นแบบปกติหรือไม่
วิธีการติดตั้ง
Anchor link to1. ผสานการทำงาน Pushwoosh iOS SDK โดยทำตามคู่มือ
2. เพิ่มสตริงต่อไปนี้ลงใน AppDelegate ของโปรเจกต์ของคุณ ก่อนที่จะเรียกเมธอด registerForPushNotifications()
:
if #available(iOS 12.0, *) { Pushwoosh.sharedInstance().additionalAuthorizationOptions = UNAuthorizationOptions.provisional}
if (@available(iOS 12.0, *)) { [Pushwoosh sharedInstance].additionalAuthorizationOptions = UNAuthorizationOptionProvisional;}
เพียงเท่านี้! ผู้ใช้แอปจะได้รับข้อความโดยตรงไปยัง Notification Center ของพวกเขาทันทีที่ติดตั้งแอป
แบ่งปันความคิดเห็นของคุณกับเรา
Anchor link toความคิดเห็นของคุณช่วยให้เราสร้างประสบการณ์ที่ดีขึ้น เราจึงยินดีเป็นอย่างยิ่งที่จะรับฟังจากคุณหากคุณพบปัญหาใดๆ ในระหว่างขั้นตอนการผสานการทำงาน SDK หากคุณประสบปัญหาใดๆ โปรดอย่าลังเลที่จะแบ่งปันความคิดเห็นของคุณกับเราผ่านแบบฟอร์มนี้