PushKit เป็นเฟรมเวิร์ก iOS สำหรับส่งการแจ้งเตือน VoIP ที่มีความหน่วงต่ำ โดยข้าม APNs มาตรฐาน ตาม Apple Developer Documentation (2025) PushKit รับประกันการส่งสายภายใน 5 วินาทีแม้อยู่ในพื้นหลัง การแจ้งเตือน VoIP จะถูกประมวลผลโดยตรง โดยไม่ต้องแสดงแบนเนอร์ให้ผู้ใช้เห็น ทำให้เฟรมเวิร์กนี้เป็นเครื่องมือหลักสำหรับแอปส่งข้อความและแอปวิดีโอคอลบน iOS
ประเด็นสำคัญ
PushKit เป็นเฟรมเวิร์กของ Apple ที่เปิดตัวใน iOS 8 ซึ่งให้บริการการแจ้งเตือน push ที่มีความหน่วงต่ำสำหรับแอปพลิเคชัน VoIP แตกต่างจาก APNs มาตรฐาน (Apple Push Notification service) PushKit อนุญาตให้แอปตื่นขึ้นในพื้นหลังเมื่อมีการรับสายเข้า โดยไม่ต้องแสดงการแจ้งเตือนให้ผู้ใช้เห็น สิ่งนี้มีความสำคัญอย่างยิ่งสำหรับแอปเสียงและวิดีโอคอล — ผู้ใช้รับสายได้ทันที แม้ว่าแอปจะปิดอยู่ก็ตาม ตามข้อมูลจาก Apple WWDC 2024 PushKit ประมวลผลการแจ้งเตือน VoIP มากกว่า 2 พันล้านครั้งต่อวันทั่วโลก
กลไกการทำงานสร้างขึ้นบน การเชื่อมต่อโดยตรง ระหว่างอุปกรณ์และเซิร์ฟเวอร์ push ของ Apple โดยข้ามช่องทางการแจ้งเตือนมาตรฐาน เมื่อเซิร์ฟเวอร์แอปส่งการแจ้งเตือน VoIP มันจะผ่านเซิร์ฟเวอร์ PushKit โดยเฉพาะและถูกส่งไปยังอุปกรณ์ด้วยลำดับความสำคัญสูงสุด ระบบจะปลุกแอปในพื้นหลังและเรียกเมธอดตัวแทน pushRegistry:didReceiveIncomingPushWithPayload:forType: แอปจะรับ payload ประมวลผลสาย และเรียกตัวจัดการเสร็จสิ้นเพื่อยืนยัน ทั้งวงจรตั้งแต่การส่งไปจนถึงการประมวลผลใช้เวลาไม่เกิน 5 วินาที ตามข้อกำหนดของ Apple
ความแตกต่างหลักระหว่าง PushKit และ APNs อยู่ที่ กลไกการส่ง และการประมวลผล APNs ใช้ช่องทางการแจ้งเตือนมาตรฐานโดยแสดงแบนเนอร์ เสียง หรือป้าย ในขณะที่ PushKit ส่งข้อมูลไปยังแอปโดยตรงโดยไม่มีการแจ้งเตือนด้วยภาพ ด้านล่างคือตารางเปรียบเทียบคุณลักษณะสำคัญ
| คุณลักษณะ | PushKit | APNs |
|---|---|---|
| ลำดับความสำคัญในการส่ง | สูง (ส่งทันที) | ปานกลาง (อาจล่าช้า) |
| การปลุกแอป | ใช่ ในพื้นหลัง | เฉพาะเมื่อแตะการแจ้งเตือน |
| การแสดงแบนเนอร์ | ไม่ | ใช่ (ไม่บังคับ) |
| การใช้งาน | VoIP, สาย, วิดีโอคอล | การแจ้งเตือนทุกประเภท |
| Payload | JSON เท่านั้น ไม่มีสื่อ | JSON + สิ่งแนบ |
PushKit ไม่รองรับสิ่งที่แนบสื่อที่หลากหลายและไม่สามารถใช้สำหรับการแจ้งเตือนทางการตลาดทั่วไป Apple ควบคุมการใช้ PushKit อย่างเข้มงวด — แอปต้องมีฟังก์ชัน VoIP ที่ชัดเจน มิฉะนั้นจะถูกปฏิเสธระหว่างการตรวจสอบ APNs ยังคงเป็นโซลูชันสากลสำหรับสถานการณ์อื่น ๆ ทั้งหมด
ในการใช้ PushKit แอปต้องลงทะเบียนผ่าน PKPushRegistry ด้วยชนิด pushType .voIP การลงทะเบียนจะดำเนินการครั้งเดียวเมื่อเปิดใช้งานครั้งแรก หลังจากนั้นระบบจะสร้างโทเค็น push ที่ไม่ซ้ำกันและส่งผ่านตัวแทน โทเค็นนี้จะถูกส่งไปยังเซิร์ฟเวอร์แอปสำหรับการส่งการแจ้งเตือน VoIP ในภายหลัง ด้านล่างคือตัวอย่างการลงทะเบียน PushKit และการรับโทเค็นใน Swift
import PushKit
let registry = PKPushRegistry(queue: DispatchQueue.main)
registry.delegate = self
registry.desiredPushTypes = [.voIP]
// MARK: - PKPushRegistryDelegate
func pushRegistry(
_ registry: PKPushRegistry,
didUpdate pushCredentials: PKPushCredentials,
for type: PKPushType
) {
let deviceToken = pushCredentials.token
.map { String.format("%02x", $0) }
.joined()
sendVoIPTokenToServer(deviceToken)
}
หลังจากเรียก desiredPushTypes ด้วย PKPushType.voIP ระบบจะขออนุญาตรับการแจ้งเตือน VoIP โดยอัตโนมัติ ในเมธอด pushRegistry:didUpdatePushCredentials:forType: แอปจะรับโทเค็นอุปกรณ์เป็น Data ซึ่งจะถูกแปลงเป็นสตริงฐานสิบหกและส่งไปยังเซิร์ฟเวอร์ โทเค็นไม่ซ้ำกันสำหรับแต่ละอุปกรณ์และเปลี่ยนแปลงเมื่อติดตั้งแอปใหม่ — เซิร์ฟเวอร์ต้องจัดการการอัปเดตโทเค็น
func pushRegistry(
_ registry: PKPushRegistry,
didReceiveIncomingPushWith payload: PKPushPayload,
for type: PKPushType,
completion: @escaping VoidBlock
) {
guard let caller = payload.dictionaryPayload["caller"] as? String else {
completion()
return
}
let update = CXCallUpdate()
update.remoteHandle = CXHandle(type: .generic, value: caller)
provider.reportNewIncomingCall(
with: UUID(),
update: update,
completion: { error in
if let error = error {
print("Call error: \(error)")
}
completion()
}
)
}
ในเมธอด didReceiveIncomingPushWith แอปจะรับ payload พร้อมข้อมูลสาย หลังจากดึงข้อมูลผู้เรียกแล้ว จะสร้าง CXCallUpdate จากเฟรมเวิร์ก CallKit เพื่อแสดงหน้าจอสายเข้า สิ่งสำคัญคือต้องเรียกตัวจัดการเสร็จสิ้นหลังจากการประมวลผล — มิฉะนั้นระบบอาจบังคับยุติกระบวนการแอปเนื่องจากหมดเวลา เวลาประมวลผลสูงสุดคือ 30 วินาที หลังจากนั้น iOS จะถือว่าการแจ้งเตือนยังไม่ถูกประมวลผล
PushKit ถูกรวมเข้ากับ CallKit อย่างใกล้ชิด — เฟรมเวิร์กสำหรับแสดงอินเทอร์เฟซสายของระบบบน iOS เมื่อแอปได้รับการแจ้งเตือน VoIP ผ่าน PushKit แอปต้องสร้าง CXProvider และ CXCallController เพื่อจัดการสาย CallKit จะแสดงหน้าจอสายเข้าบนหน้าจอล็อกโดยอัตโนมัติ แม้ว่าแอปจะถูกย่อไว้ก็ตาม ด้านล่างคือตัวอย่างการตั้งค่าผู้ให้บริการ CallKit
let config = CXProviderConfiguration(localizedName: "MyApp")
config.supportsVideo = true
config.maximumCallGroups = 1
config.maximumCallsPerCallGroup = 1
config.supportedHandleTypes = [.phoneNumber, .generic]
let provider = CXProvider(configuration: config)
provider.setDelegate(self, queue: nil)
CXProviderConfiguration กำหนดลักษณะและการทำงานของหน้าจอสาย — ชื่อแอป การรองรับวิดีโอ จำนวนสายพร้อมกัน การรวม PushKit กับ CallKit เป็นสิ่งจำเป็นสำหรับแอป VoIP: หากไม่มี ระบบจะไม่แสดงหน้าจอสายเข้า และผู้ใช้จะพลาดสาย Apple กำหนดให้ใช้ CallKit สำหรับแอปทั้งหมดที่ใช้ PushKit
การใช้ PushKit มาพร้อมกับ ข้อจำกัดที่เข้มงวด หลายประการที่กำหนดโดย Apple เฟรมเวิร์กสามารถใช้ได้เฉพาะฟังก์ชัน VoIP เท่านั้น — ความพยายามใด ๆ ในการส่งการแจ้งเตือนทางการตลาดผ่าน PushKit จะส่งผลให้แอปถูกบล็อก ขนาด payload ต้องไม่เกิน 4 KB และสามารถมีได้เฉพาะข้อมูล JSON โดยไม่มีสิ่งที่แนบ เริ่มตั้งแต่ iOS 13 Apple ได้แนะนำข้อจำกัดเกี่ยวกับความถี่ในการส่งการแจ้งเตือน VoIP — ไม่เกินหนึ่งการแจ้งเตือนต่อนาทีต่ออุปกรณ์ เซิร์ฟเวอร์ต้องปฏิบัติตามข้อจำกัดนี้ มิฉะนั้นการแจ้งเตือนจะถูกปฏิเสธโดยระบบ PushKit ไม่ทำงานบนโปรแกรมจำลอง iOS — การทดสอบสามารถทำได้บนอุปกรณ์จริงเท่านั้น
Payload ของ การแจ้งเตือน VoIP คือพจนานุกรม JSON ที่มีข้อมูลสายที่กำหนดเอง แตกต่างจาก APNs PushKit ไม่รองรับฟิลด์มาตรฐาน alert, badge และ sound — ข้อมูลทั้งหมดถูกกำหนดโดยนักพัฒนา โครงสร้างทั่วไปประกอบด้วยตัวระบุผู้เรียก (caller) ชนิดสาย (voice หรือ video) ตัวระบุห้องหรือเซสชัน และการประทับเวลา ขนาดของแต่ละฟิลด์ควรน้อยที่สุดเพื่อประหยัดพื้นที่ภายในขีดจำกัด 4 KB Apple แนะนำให้รวมเฉพาะข้อมูลที่จำเป็นสำหรับการแสดงหน้าจอสายเข้าบนหน้าจอล็อกใน payload และโหลดข้อมูลที่เหลือ (รูปประจำตัว, ประวัติข้อความ) หลังจากผู้ใช้รับสายผ่านคำขอเครือข่ายแยกต่างหาก ตัวอย่าง payload ขั้นต่ำ: { "caller": "แอนนา", "caller_id": "+79161234567", "type": "audio", "room": "uuid-room-1234", "ts": 1718534400 } คีย์ทั้งหมดใน payload ต้องสั้น ชัดเจน และได้รับการบันทึกไว้บนฝั่งเซิร์ฟเวอร์เพื่อความเข้ากันได้ระหว่างเวอร์ชันแอป
เมื่อทำงานกับ PushKit จำเป็นต้องจัดการ ความล้มเหลวในการส่ง และการสูญเสียการเชื่อมต่อ หากอุปกรณ์ออฟไลน์หรือตัดการเชื่อมต่อจากเครือข่าย การแจ้งเตือน VoIP จะไม่ถูกส่ง — PushKit ไม่รองรับการจัดเก็บและการส่งซ้ำ ซึ่งแตกต่างจาก APNs ที่จัดเก็บการแจ้งเตือนนานถึง 24 ชั่วโมงเพื่อลองใหม่ เซิร์ฟเวอร์ต้องติดตามการแจ้งเตือนที่ไม่ได้ส่งด้วยตนเองและลองใหม่เมื่อการเชื่อมต่อได้รับการกู้คืน กลไก push kit feedback service ถูกใช้สำหรับสิ่งนี้ — มันส่งคืนรายการการแจ้งเตือนที่ไม่ได้ส่งพร้อมสาเหตุของความล้มเหลว ขอแนะนำให้ตั้งค่าการตรวจสอบความสำเร็จในการส่งการแจ้งเตือน VoIP ผ่านการวิเคราะห์เซิร์ฟเวอร์และแจ้งนักพัฒนาเมื่ออัตราการส่งสำเร็จลดลงต่ำกว่า 95% ระบบ PushKit รับประกันการส่งเฉพาะเมื่ออุปกรณ์มีการเชื่อมต่ออินเทอร์เน็ตที่ใช้งานอยู่ — หากไม่มีการเชื่อมต่อ การแจ้งเตือนจะสูญหายอย่างถาวร ซึ่งเป็นสิ่งสำคัญที่ต้องพิจารณาเมื่อออกแบบระบบสาย VoIP ที่เชื่อถือได้พร้อมการส่งที่รับประกัน
คำถามที่พบบ่อย
PushKit เป็นเฟรมเวิร์กของ Apple สำหรับส่งการแจ้งเตือน VoIP ที่มีความหน่วงต่ำ ซึ่งช่วยให้แอปตื่นขึ้นในพื้นหลังเมื่อมีสายเข้าโดยไม่ต้องแสดงแบนเนอร์ ใช้ในแอปส่งข้อความและแอปวิดีโอคอล
PushKit มี ลำดับความสำคัญในการส่ง สูงกว่าและปลุกแอปในพื้นหลังโดยไม่แสดงการแจ้งเตือนให้ผู้ใช้เห็น APNs ส่งการแจ้งเตือนพร้อมแบนเนอร์และไม่สามารถปลุกแอปเพื่อประมวลผลสายโดยไม่มีการโต้ตอบจากผู้ใช้
ใช่ Apple กำหนดให้รวม PushKit กับ CallKit เพื่อแสดงหน้าจอสายเข้าของระบบ หากไม่มี CallKit แอปจะไม่สามารถแสดงสายเข้าบนหน้าจอล็อก ทำให้ฟังก์ชัน VoIP ไร้ประโยชน์
โทเค็นจะได้รับหลังจากสร้าง PKPushRegistry ด้วยชนิด .voIP และใช้เมธอดตัวแทน pushRegistry:didUpdatePushCredentials:forType: โทเค็นถูกส่งเป็น Data และต้องแปลงเป็นสตริงฐานสิบหกเพื่อส่งไปยังเซิร์ฟเวอร์
ขนาด payload สูงสุดสำหรับ PushKit คือ 4 KB ข้อมูลต้องอยู่ในรูปแบบ JSON สิ่งแนบสื่อไม่ได้รับการรองรับ ตั้งแต่ iOS 13 มีข้อจำกัดไม่เกินหนึ่งการแจ้งเตือน VoIP ต่อนาทีต่ออุปกรณ์
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม