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à 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ế 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.
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ính | PushKit | APNs |
|---|---|---|
| Ưu tiên gửi | Cao (gửi ngay lập tức) | Trung bình (có thể chậm) |
| Đánh thức ứng dụng | Có, ở nền | Chỉ khi chạm vào thông báo |
| Hiển thị biểu ngữ | Không | Có (tùy chọn) |
| Sử dụng | VoIP, cuộc gọi, gọi video | Tất cả các loại thông báo |
| Tải trọng | Chỉ JSON, không có phương tiện | JSON + 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.
Để 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.
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.
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ý.
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.
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.
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ý.
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.
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à 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 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ó, 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.
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ủ.
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
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.
Đọc thêm