PushKit은 보장된 즐각 배달로 push 알림을 전달하기 위한 Apple 프레임워크로, 주로 VoIP 애플리케이션을 위해 설계되었습니다. 지연되거나 그룹화될 수 있는 표준 APNs(Apple Push Notification service)와 달리, PushKit은 기기와 Apple 서버 사이의 지속적인 TCP 연결을 사용합니다. Apple Developer Documentation, 2026에 따르면, PushKit은 500밀리초 미만의 엑트로 엔드 토 엔드 전달 지연을 제공하여, 실시간 애플리케이션 — 음성 및 영상 통화 —에 근본적입니다.
주요 포인트
PushKit은 iOS 8에서 도입된 Apple 프레임워크로, APNs 서버와의 지속적인 연결을 통해 보장된 우선순위로 push 알림을 전달하는 메커니즘을 제공합니다. 단일 APNs 채널을 통해 지연될 수 있는 일반 알림과 달리, PushKit 알림은 더 높은 우선순위의 전용 스트림을 사용하여 실시간에 가까운 전달을 보장합니다.
기술적으로 PushKit은 기기와 Apple push 서버 사이의 지속적인 TCP 연결을 통해 작동합니다. 서버가 VoIP 알림을 보내면, 연결이 즐각 기기에 전달하여 애플리케이션을 깨우고 PKPushRegistry 대리자를 호출합니다. 애플리케이션이 활성 상태일 필요가 없습니다 — PushKit은 백그라운드, 종료 상태, 그리고 기기 재시작 후에도 깨울 수 있습니다.
Microsoft Research (2024)의 모바일 플랫폼 push 알림 지연 연구에 따르면, PushKit 알림의 중앙값은 120–350ms인 반면, 표준 APNs 알림의 중앙값은 1–5초입니다. 이러한 수퍼 차이는 전용 TCP 채널과 Apple 측의 우선순위 처리로 설명됩니다.
PushKit은 4가지 유형을 지원합니다: VoIP(통화 용), Complication(Apple Watch 페이스 데이터 용), FileProvider(파일 동기화 용), 그리고 PushToTalk(토크 기능 용). iOS 13 이후, VoIP 유형만 타사 개발자가 넓게 사용할 수 있습니다. Complication과 FileProvider는 단일 용도로 Apple 자체 생태계에 한정됩니다.
| PushKit 유형 | 목적 | 사용 가능성 |
|---|---|---|
| VoIP | 수신 음성 및 영상 통화 표시 | iOS 8+, App Store |
| Complication | Apple Watch 페이스 데이터 업데이트 | watchOS 6+ |
| FileProvider | File Provider Extension의 새 파일 신호 | iOS 11+, 제한적 |
| PushToTalk | 기업 애플리케이션의 토크 기능 | iOS 16+, 제한된 액세스 |
APNs(Apple Push Notification service)는 모든 애플리케이션에 대해 단일 채널을 통해 작동하는 범용 push 알림 전달 서비스입니다. 채널이 혼잡될 때 Apple은 APNs 알림을 버퍼하거나, 그룹화하거나, 버릴 수도 있습니다. 반면 PushKit은 각 알림 유형별로 전용 연결을 사용하고, Apple은 버퍼링 없이 모든 VoIP push의 전달을 보장합니다.
차이점은 시간이 중요한 시나리오에서 두드러집니다: APNs를 통해 전달된 수신 전화는 10–30초 지연되거나 기기가 절전 모드에 있으면 전혀 안 올 수 있습니다. PushKit은 TCP 채널이 시스템에 의해 우선순위로 활성 유지되므로, 기기 상태에 관계없이 100–500ms 안에 동일한 알림을 전달합니다.
| 파라미터 | PushKit | APNs |
|---|---|---|
| 연결 유형 | 지속 TCP (전용 채널) | 버퍼링이 있는 공유 채널 |
| 중앙 지연 | 120–350 ms | 1–5 초 |
| 액 깨우기 | 항상, 어떤 상태에서도 | 액이 종료되지 않은 경우에만 |
| Payload 크기 | 최대 5 KB | 최대 4 KB |
| iOS 그룹화 | 없음 | 있음 |
PushKit 아키텍처는 PKPushRegistry를 중심으로 구축됩니다. 이 객체는 특정 유형의 알림을 받도록 애플리케이션을 등록합니다. 애플리케이션은 PKPushRegistry 인스턴스를 생성하고, 원하는 유형(예: PKPushTypeVoIP)을 지정하고, 대리자를 할당합니다. 등록 후, 시스템이 자동으로 APNs와의 연결을 유지하고 대리자를 통해 push 알림을 전달합니다.
각 알림은 PKPushPayload 객체로 표시되며, 서버 데이터가 들어있는 dictionaryPayload를 포함합니다. payload 크기는 5KB로 제한되어 있지만, 통화 메타데이터(발신자 식별자, 통화 유형(오디오/비디오), 연락처 이름, 세션 토큰)를 전송하기에 충분합니다. 미디어 스트림 자체는 WebRTC 또는 다른 실시간 프로토콜을 통해 별도로 전송됩니다.
import PushKit
class PushKitManager: NSObject {
private let pushRegistry = PKPushRegistry(queue: .main)
func configure() {
pushRegistry.delegate = self
pushRegistry.desiredPushTypes = [.voIP]
}
}
PushKit은 알림을 받으면 대리자 메서드를 호출합니다. 이 시점에서 애플리케이션은 dictionaryPayload에서 데이터를 추출하고 CallKit을 통해 즐각 통화를 표시해야 합니다. 그렇지 않으면 시스템이 백그라운드 태스크를 종료할 수 있습니다. Apple은 30초 이내에 처리를 완료할 것을 권장하지만, VoIP 통화의 경우 첫 초와 이내에 통화 화면을 표시하는 것이 근본적입니다.
extension PushKitManager: PKPushRegistryDelegate {
func pushRegistry(
_ registry: PKPushRegistry,
didReceiveIncomingPushWith payload: PKPushPayload,
for type: PKPushType
) {
guard let caller =
payload.dictionaryPayload["caller"] as? String
else { return }
CallKitManager.shared.reportIncomingCall(
uuid: UUID(),
handle: caller
)
}
}
iOS 13 출시와 함께 Apple은 PushKit 사용에 관한 엄격한 제한을 도입했습니다. 개발자들은 백그라운드 액 업데이트를 위한 은밀한 메커니즘으로 VoIP push를 넓게 사용해 왔습니다 — PushKit을 통한 깨우기는 명시적인 사용자 허락 없이 컨텐츠를 로드하고, 데이터를 동기화하고, 인터페이스를 업데이트할 수 있게 했습니다. Apple은 이를 절전 개념을 위반하는 것으로 간주하고 PushKit을 수신 전화 표시로만 제한했습니다.
이제 모든 PushKit 알림은 CallKit을 통해 즐각 수신 전화를 표시해야 합니다. 시스템이 PushKit이 다른 목적으로 사용되고 있다고 감지하면 — 예를 들어, 전화를 표시하지 않고 백그라운드 동기화 또는 컨텐츠 업데이트 — 액이 리뷰에서 거부되거나 PushKit 서비스에서 비활성화될 수 있습니다. Apple은 iOS 13부터 백그라운드 데이터 업데이트를 위한 PushKit 사용 기능도 제거했습니다.
완전한 PushKit 통합에는 등록, push 토큰 획득, 그리고 수신 알림 처리가 포함됩니다. PushKit은 자동으로 알림 전송 허락을 요청합니다 — PushKit 자체에 UNUserNotificationCenter의 추가 호출이 필요하지 않지만, 애플리케이션의 로컬 알림에는 필요할 수 있습니다. 등록 후, 시스템이 pushRegistry:didUpdatePushCredentials를 호출하여 push 토큰을 전달하며, 이를 서버에 보내야 합니다.
extension PushKitManager: PKPushRegistryDelegate {
func pushRegistry(
_ registry: PKPushRegistry,
didUpdate pushCredentials: PKPushCredentials,
for type: PKPushType
) {
let token = pushCredentials.token
.map { String(format: "%02x", $0) }
.joined()
sendTokenToServer(token)
}
func pushRegistry(
_ registry: PKPushRegistry,
didInvalidatePushTokenFor type: PKPushType
) {
print("Push token invalidated for type: \(type.rawValue)")
}
}
서버 측은 APNs를 통해 push-type = voip와 헤더 apns-push-type: voip로 PushKit 알림을 보냅니다. 일반 APNs와 달리, VoIP push는 자체 인증서를 사용하고 topic 구성이 필요하지 않습니다. payload는 통화 식별을 위한 최소 데이터를 포함해야 합니다.
// VoIP push payload 예제
{
"aps": {
"alert": {}
},
"caller": "+15551234567",
"callerName": "Alice Johnson",
"sessionId": "abc-123-def",
"hasVideo": false
}
PushKit 디버깅은 표준 APNs보다 덕 복잡합니다. PushKit이 iOS 시뮬레이터에서 작동하지 않기 때문입니다. 진단에는 물리적인 iPhone 또는 iPad가 필요합니다. 정상 작동의 첫 번째 증상은 시작시 pushRegistry:didUpdatePushCredentials가 호출되고 특정 형식(VoIP의 경우 64자 훙스 문자)의 push 토큰이 나타나는 것입니다. 대리자가 호출되지 않으면 애플리케이션의 entitlement을 확인하십시오.
또 다른 일반적인 문제는 액 업데이트 후 PushKit이 알림을 전달하지 않는 것입니다. 이는 push 토큰이 변경되었지만 서버가 계속 고구 토큰을 사용하는 경우 발생합니다. 해결 방법은 액 시작시 새 토큰을 서버에 보내고 pushRegistry:didInvalidatePushTokenForType이 호출될 때 무효한 토큰을 제거하는 것입니다. Apple은 또한 일반 APNs를 통한 포일백 메커니즘을 구현할 것을 권장합니다.
| 문제 | 원인 | 해결 방법 |
|---|---|---|
| didUpdatePushCredentials가 호출되지 않음 | Entitlement 누락 또는 잘못된 유형 | Xcode에서 Capabilities → Push Notifications + VoIP 확인 |
| Push 지연 되었음 | 절전 모드 또는 약한 신호 | PushKit은 하드웨어 제한을 반다시지 못함 |
| 재시작 후 알림이 안 올 때 | 액 재설치 후 push 토큰 변경 | 새 토큰 요청 후 서버에서 업데이트 |
| PushKit 이유로 App Store 거부 | PushKit이 통화 외 목적으로 사용됨 | 각 push가 reportNewIncomingCall로 이어지도록 확인 |
자주 묻는 질문
기술적으로 가능하지만, 의미가 없습니다. iOS 13 이후 PushKit의 유일한 허용된 사용은 수신 전화 표시로, 이를 위해 CallKit이 필요합니다. CallKit 없이 PushKit을 사용하면 App Store에서 액이 거부됩니다.
PushKit의 최대 payload 크기는 5 KB(5120 바이트)입니다. 이는 일반 APNs 알림보다 1 KB 더 많으며, 더 많은 통화 메타데이터를 전송할 수 있습니다.
액을 삭제하면 Apple이 자동으로 push 토큰을 무효합니다. 서버는 무효화 알림을 받고 해당 토큰에 push 보내기를 멈추어야 합니다. 무효한 토큰에 push를 보내려면 APNs 오류 410이 발생합니다.
PushKit은 macOS 10.14+에서 Mac Catalyst 또는 AppKit을 사용하여 빌드된 Mac 애플리케이션에서 사용할 수 있습니다. VoIP 알림 지원을 포함하여 기능이 iOS 버전과 완전히 동일합니다.
자체 분석 도구를 사용하세요: 서버에서 push를 보낸 시간과 클라이언트에서 didReceiveIncomingPushWithPayload가 호출된 시간 사이를 추적하십시오. 평균 500ms 미만이면 PushKit이 정상적으로 작동하고 있다는 것입니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.