PushKit — nó là gì, framework thông báo VoIP iOS

Tác giả: IT Sectr Đã đăng: 2026-03-22 Thời gian đọc: 8 phút

PushKit là một framework iOS để gửi thông báo VoIP với độ trễ thấp, bỏ qua APNs tiêu chuẩn. Theo Apple Developer Documentation (2025), PushKit đảm bảo gửi cuộc gọi trong vòng 5 giây ngay cả khi ở chế độ nền. Thông báo VoIP được xử lý trực tiếp, mà không cần hiển thị biểu ngữ cho người dùng, khiến framework trở thành công cụ chính cho các ứng dụng nhắn tin và gọi video trên iOS.

Các điểm chính

  • PushKit là framework iOS để gửi thông báo VoIP với ưu tiên và độ trễ thấp.
  • Thông báo được xử lý mà không hiển thị biểu ngữ — ứng dụng thức dậy ở nền để xử lý cuộc gọi.
  • Đăng ký được thực hiện qua PKPushRegistry với loại pushType .voIP.
  • Khác biệt với APNs — PushKit không sử dụng kênh thông báo tiêu chuẩn và có ưu tiên cao hơn.
  • Giới hạn — PushKit chỉ được thiết kế cho VoIP và không thể dùng cho thông báo push thông thường.

PushKit là gì

PushKit là một framework của Apple, được giới thiệu trong iOS 8, cung cấp thông báo push với độ trễ thấp cho các ứng dụng VoIP. Không giống như APNs tiêu chuẩn (Apple Push Notification service), PushKit cho phép ứng dụng thức dậy ở nền khi nhận được cuộc gọi đến, mà không hiển thị thông báo cho người dùng. Điều này rất quan trọng đối với các ứng dụng thoại và video — người dùng nhận cuộc gọi ngay lập tức, ngay cả khi ứng dụng đã đóng. Theo Apple WWDC 2024, PushKit xử lý hơn 2 tỷ thông báo VoIP mỗi ngày trên toàn thế giới.

Cách PushKit hoạt động

Cơ chế hoạt động dựa trên kết nối trực tiếp giữa thiết bị và máy chủ push của Apple, bỏ qua kênh thông báo tiêu chuẩn. Khi máy chủ ứng dụng gửi một thông báo VoIP, nó đi qua một máy chủ PushKit chuyên dụng và được gửi đến thiết bị với ưu tiên tối đa. Hệ thống đánh thức ứng dụng ở nền và gọi phương thức ủy quyền pushRegistry:didReceiveIncomingPushWithPayload:forType:. Ứng dụng nhận tải trọng, xử lý cuộc gọi và gọi trình xử lý hoàn thành để xác nhận. Toàn bộ chu trình từ gửi đến xử lý không quá 5 giây, theo thông số kỹ thuật của Apple.

PushKit so với APNs

Sự khác biệt chính giữa PushKit và APNs nằm ở cơ chế gửi và xử lý. APNs sử dụng kênh thông báo tiêu chuẩn với việc hiển thị biểu ngữ, âm thanh hoặc huy hiệu, trong khi PushKit gửi dữ liệu trực tiếp đến ứng dụng mà không có thông báo trực quan. Dưới đây là bảng so sánh các đặc tính chính.

Đặc tínhPushKitAPNs
Ưu tiên gửiCao (gửi ngay lập tức)Trung bình (có thể chậm)
Đánh thức ứng dụngCó, ở nềnChỉ khi chạm vào thông báo
Hiển thị biểu ngữKhôngCó (tùy chọn)
Sử dụngVoIP, cuộc gọi, gọi videoTất cả các loại thông báo
Tải trọngChỉ JSON, không có phương tiệnJSON + tệp đính kèm

PushKit cũng không hỗ trợ tệp đính kèm phương tiện phong phú và không thể được sử dụng cho các thông báo tiếp thị thông thường. Apple kiểm soát chặt chẽ việc sử dụng PushKit — ứng dụng phải có chức năng VoIP rõ ràng, nếu không sẽ bị từ chối khi xem xét. APNs vẫn là giải pháp phổ quát cho tất cả các tình huống khác.

Đăng ký và nhận thông báo VoIP

Để sử dụng PushKit, ứng dụng phải đăng ký qua PKPushRegistry với loại pushType .voIP. Việc đăng ký được thực hiện một lần khi khởi chạy lần đầu, sau đó hệ thống tạo một token push duy nhất và truyền nó qua ủy quyền. Token này được gửi đến máy chủ ứng dụng để gửi các thông báo VoIP tiếp theo. Dưới đây là ví dụ về đăng ký PushKit và lấy token trong Swift.

Thiết lập đăng ký 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)
}

Sau khi gọi desiredPushTypes với PKPushType.voIP, hệ thống tự động yêu cầu quyền nhận thông báo VoIP. Trong phương thức pushRegistry:didUpdatePushCredentials:forType:, ứng dụng nhận token thiết bị dưới dạng Data, được chuyển đổi thành chuỗi hex và gửi đến máy chủ. Token là duy nhất cho mỗi thiết bị và thay đổi khi cài đặt lại ứng dụng — máy chủ phải xử lý các bản cập nhật token.

Nhận thông báo đến

swift
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()
        }
    )
}

Trong phương thức didReceiveIncomingPushWith, ứng dụng nhận tải trọng với dữ liệu cuộc gọi. Sau khi trích xuất thông tin người gọi, một CXCallUpdate từ framework CallKit được tạo để hiển thị màn hình cuộc gọi đến. Điều quan trọng là phải gọi trình xử lý hoàn thành sau khi xử lý — nếu không, hệ thống có thể buộc kết thúc tiến trình ứng dụng do hết thời gian. Thời gian xử lý tối đa là 30 giây, sau đó iOS coi thông báo là chưa được xử lý.

Xử lý cuộc gọi đến với CallKit

PushKit được tích hợp chặt chẽ với CallKit — một framework để hiển thị giao diện cuộc gọi hệ thống trên iOS. Khi ứng dụng nhận được thông báo VoIP qua PushKit, nó phải tạo CXProvider và CXCallController để quản lý cuộc gọi. CallKit tự động hiển thị màn hình cuộc gọi đến trên màn hình khóa, ngay cả khi ứng dụng được thu nhỏ. Dưới đây là ví dụ về thiết lập nhà cung cấp CallKit.

swift
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 xác định giao diện và hành vi của màn hình cuộc gọi — tên ứng dụng, hỗ trợ video, số lượng cuộc gọi đồng thời. Việc tích hợp PushKit với CallKit là bắt buộc đối với các ứng dụng VoIP: nếu không có nó, hệ thống sẽ không hiển thị màn hình cuộc gọi đến và người dùng sẽ bỏ lỡ cuộc gọi. Apple yêu cầu sử dụng CallKit cho tất cả các ứng dụng sử dụng PushKit.

Tính năng và giới hạn

Việc sử dụng PushKit đi kèm với một số hạn chế nghiêm ngặt do Apple đặt ra. Framework chỉ có thể được sử dụng cho chức năng VoIP — bất kỳ nỗ lực nào gửi thông báo tiếp thị qua PushKit sẽ dẫn đến việc chặn ứng dụng. Kích thước tải trọng không được vượt quá 4 KB và chỉ có thể chứa dữ liệu JSON mà không có tệp đính kèm. Bắt đầu từ iOS 13, Apple đã đưa ra giới hạn về tần suất gửi thông báo VoIP — không quá một thông báo mỗi phút trên một thiết bị. Máy chủ phải tuân thủ giới hạn này, nếu không các thông báo sẽ bị hệ thống từ chối. PushKit cũng không hoạt động trên trình mô phỏng iOS — việc kiểm tra chỉ có thể thực hiện trên thiết bị vật lý.

Cấu trúc tải trọng PushKit

Tải trọng thông báo VoIP là một từ điển JSON với dữ liệu cuộc gọi tùy chỉnh. Không giống như APNs, PushKit không hỗ trợ các trường tiêu chuẩn alert, badge và sound — tất cả dữ liệu được xác định bởi nhà phát triển. Một cấu trúc điển hình bao gồm định danh người gọi (caller), loại cuộc gọi (voice hoặc video), định danh phòng hoặc phiên và dấu thời gian. Kích thước của mỗi trường phải ở mức tối thiểu để tiết kiệm không gian trong giới hạn 4 KB. Apple khuyên chỉ bao gồm trong tải trọng những dữ liệu cần thiết để hiển thị màn hình cuộc gọi đến trên màn hình khóa và tải phần còn lại (hình đại diện, lịch sử tin nhắn) sau khi người dùng trả lời qua một yêu cầu mạng riêng. Ví dụ về tải trọng tối thiểu: { "caller": "Anna", "caller_id": "+79161234567", "type": "audio", "room": "uuid-room-1234", "ts": 1718534400 }. Tất cả các khóa trong tải trọng phải ngắn gọn, rõ ràng và được ghi lại ở phía máy chủ để tương thích giữa các phiên bản ứng dụng.

Xử lý lỗi và thử lại

Khi làm việc với PushKit, cần xử lý lỗi gửi và mất kết nối. Nếu thiết bị ngoại tuyến hoặc ngắt kết nối mạng, thông báo VoIP sẽ không được gửi — PushKit không hỗ trợ lưu trữ và gửi lại, không giống như APNs lưu trữ thông báo lên đến 24 giờ để thử lại. Máy chủ phải tự theo dõi các thông báo chưa được gửi và thử lại khi kết nối được khôi phục. Cơ chế push kit feedback service được sử dụng cho việc này — nó trả về danh sách các thông báo chưa được gửi kèm lý do thất bại. Nên thiết lập giám sát tỷ lệ gửi thông báo VoIP thành công qua phân tích máy chủ và thông báo cho nhà phát triển nếu tỷ lệ gửi thành công giảm xuống dưới 95%. Hệ thống PushKit chỉ đảm bảo gửi khi thiết bị có kết nối Internet hoạt động — nếu không có, thông báo sẽ bị mất vĩnh viễn, điều này rất quan trọng cần xem xét khi thiết kế một hệ thống cuộc gọi VoIP đáng tin cậy với khả năng gửi đảm bảo.

Câu hỏi thường gặp

PushKit là gì?

PushKit là một framework của Apple để gửi thông báo VoIP với độ trễ thấp, cho phép ứng dụng thức dậy ở nền khi có cuộc gọi đến mà không hiển thị biểu ngữ. Nó được sử dụng trong các ứng dụng nhắn tin và gọi video.

PushKit khác APNs như thế nào?

PushKit có ưu tiên gửi cao hơn và đánh thức ứng dụng ở nền mà không hiển thị thông báo cho người dùng. APNs gửi thông báo kèm biểu ngữ và không thể đánh thức ứng dụng để xử lý cuộc gọi mà không có sự tương tác của người dùng.

Có bắt buộc sử dụng CallKit với PushKit không?

Có, Apple yêu cầu tích hợp PushKit với CallKit để hiển thị màn hình cuộc gọi đến của hệ thống. Nếu không có CallKit, ứng dụng không thể hiển thị cuộc gọi đến trên màn hình khóa, khiến chức năng VoIP trở nên vô dụng.

Làm thế nào để lấy token PushKit?

Token nhận được sau khi tạo PKPushRegistry với loại .voIP và triển khai phương thức ủy quyền pushRegistry:didUpdatePushCredentials:forType:. Token được truyền dưới dạng Data và phải được chuyển đổi thành chuỗi hex để gửi đến máy chủ.

Giới hạn kích thước tải trọng trong PushKit là gì?

Kích thước tối đa của tải trọng cho PushKit là 4 KB. Dữ liệu phải ở định dạng JSON. Tệp đính kèm phương tiện không được hỗ trợ. Từ iOS 13, có giới hạn không quá một thông báo VoIP mỗi phút trên một thiết bị.

Tổng kết

  • PushKit là framework iOS để gửi thông báo VoIP với độ trễ thấp, bỏ qua APNs.
  • Ưu tiên gửi của PushKit cao hơn APNs — thông báo đến trong vòng 5 giây.
  • Ứng dụng thức dậy ở nền khi nhận được thông báo, mà không hiển thị biểu ngữ cho người dùng.
  • Đăng ký được thực hiện qua PKPushRegistry với PKPushType.voIP và giao thức PKPushRegistryDelegate.
  • CallKit là bắt buộc để hiển thị màn hình cuộc gọi đến của hệ thống trên iOS.
  • Tải trọng giới hạn ở 4 KB, chỉ JSON, không quá một thông báo mỗi phút kể từ iOS 13.
  • Khuyến nghị — chỉ sử dụng PushKit cho chức năng VoIP, đối với các thông báo khác hãy sử dụng APNs.

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm