PushKit — 개요, VoIP를 위한 push 알림 프레임워크

저자: IT Sectr 게시일: 2026-06-16 읽는 시간: 8 분

PushKit은 보장된 즐각 배달로 push 알림을 전달하기 위한 Apple 프레임워크로, 주로 VoIP 애플리케이션을 위해 설계되었습니다. 지연되거나 그룹화될 수 있는 표준 APNs(Apple Push Notification service)와 달리, PushKit은 기기와 Apple 서버 사이의 지속적인 TCP 연결을 사용합니다. Apple Developer Documentation, 2026에 따르면, PushKit은 500밀리초 미만의 엑트로 엔드 토 엔드 전달 지연을 제공하여, 실시간 애플리케이션 — 음성 및 영상 통화 —에 근본적입니다.

주요 포인트

  • PushKit — VoIP, Location 및 FileProvider 유형에 대해 높은 우선순위로 push 알림을 전달하는 프레임워크입니다.
  • PKPushRegistry — 알림 유형을 등록하고 수신 push 메시지를 받기 위한 기본 클래스입니다.
  • VoIP push — iOS 13 이후 PushKit의 유일한 허용된 사용으로, 수신 전화를 즐각 표시합니다.
  • 지속적인 TCP 연결 — APNs에 특유한 지연 없이 전달을 보장하는 PushKit의 기술적 기반입니다.
  • CallKit과의 결합 — PushKit이 알림을 전달하고, CallKit이 시스템 전화 화면을 표시하여 통합된 사용자 경험을 제공합니다.

PushKit이란 무엇이며 어떻게 작동하나요?

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은 어떤 알림 유형을 지원하나요?

PushKit은 4가지 유형을 지원합니다: VoIP(통화 용), Complication(Apple Watch 페이스 데이터 용), FileProvider(파일 동기화 용), 그리고 PushToTalk(토크 기능 용). iOS 13 이후, VoIP 유형만 타사 개발자가 넓게 사용할 수 있습니다. Complication과 FileProvider는 단일 용도로 Apple 자체 생태계에 한정됩니다.

PushKit 유형목적사용 가능성
VoIP수신 음성 및 영상 통화 표시iOS 8+, App Store
ComplicationApple Watch 페이스 데이터 업데이트watchOS 6+
FileProviderFile Provider Extension의 새 파일 신호iOS 11+, 제한적
PushToTalk기업 애플리케이션의 토크 기능iOS 16+, 제한된 액세스

PushKit vs APNs: 주요 차이점

APNs(Apple Push Notification service)는 모든 애플리케이션에 대해 단일 채널을 통해 작동하는 범용 push 알림 전달 서비스입니다. 채널이 혼잡될 때 Apple은 APNs 알림을 버퍼하거나, 그룹화하거나, 버릴 수도 있습니다. 반면 PushKit은 각 알림 유형별로 전용 연결을 사용하고, Apple은 버퍼링 없이 모든 VoIP push의 전달을 보장합니다.

차이점은 시간이 중요한 시나리오에서 두드러집니다: APNs를 통해 전달된 수신 전화는 10–30초 지연되거나 기기가 절전 모드에 있으면 전혀 안 올 수 있습니다. PushKit은 TCP 채널이 시스템에 의해 우선순위로 활성 유지되므로, 기기 상태에 관계없이 100–500ms 안에 동일한 알림을 전달합니다.

기능 비교

파라미터PushKitAPNs
연결 유형지속 TCP (전용 채널)버퍼링이 있는 공유 채널
중앙 지연120–350 ms1–5 초
액 깨우기항상, 어떤 상태에서도액이 종료되지 않은 경우에만
Payload 크기최대 5 KB최대 4 KB
iOS 그룹화없음있음

PushKit 아키텍처: PKPushRegistry 및 PKPushPayload

PushKit 아키텍처는 PKPushRegistry를 중심으로 구축됩니다. 이 객체는 특정 유형의 알림을 받도록 애플리케이션을 등록합니다. 애플리케이션은 PKPushRegistry 인스턴스를 생성하고, 원하는 유형(예: PKPushTypeVoIP)을 지정하고, 대리자를 할당합니다. 등록 후, 시스템이 자동으로 APNs와의 연결을 유지하고 대리자를 통해 push 알림을 전달합니다.

각 알림은 PKPushPayload 객체로 표시되며, 서버 데이터가 들어있는 dictionaryPayload를 포함합니다. payload 크기는 5KB로 제한되어 있지만, 통화 메타데이터(발신자 식별자, 통화 유형(오디오/비디오), 연락처 이름, 세션 토큰)를 전송하기에 충분합니다. 미디어 스트림 자체는 WebRTC 또는 다른 실시간 프로토콜을 통해 별도로 전송됩니다.

PKPushRegistry 등록

swift
import PushKit

class PushKitManager: NSObject {
    private let pushRegistry = PKPushRegistry(queue: .main)
    
    func configure() {
        pushRegistry.delegate = self
        pushRegistry.desiredPushTypes = [.voIP]
    }
}

Push 알림 수신 및 처리

PushKit은 알림을 받으면 대리자 메서드를 호출합니다. 이 시점에서 애플리케이션은 dictionaryPayload에서 데이터를 추출하고 CallKit을 통해 즐각 통화를 표시해야 합니다. 그렇지 않으면 시스템이 백그라운드 태스크를 종료할 수 있습니다. Apple은 30초 이내에 처리를 완료할 것을 권장하지만, VoIP 통화의 경우 첫 초와 이내에 통화 화면을 표시하는 것이 근본적입니다.

swift
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 제한 사항 및 PushKit 사용 규칙

iOS 13 출시와 함께 Apple은 PushKit 사용에 관한 엄격한 제한을 도입했습니다. 개발자들은 백그라운드 액 업데이트를 위한 은밀한 메커니즘으로 VoIP push를 넓게 사용해 왔습니다 — PushKit을 통한 깨우기는 명시적인 사용자 허락 없이 컨텐츠를 로드하고, 데이터를 동기화하고, 인터페이스를 업데이트할 수 있게 했습니다. Apple은 이를 절전 개념을 위반하는 것으로 간주하고 PushKit을 수신 전화 표시로만 제한했습니다.

이제 모든 PushKit 알림은 CallKit을 통해 즐각 수신 전화를 표시해야 합니다. 시스템이 PushKit이 다른 목적으로 사용되고 있다고 감지하면 — 예를 들어, 전화를 표시하지 않고 백그라운드 동기화 또는 컨텐츠 업데이트 — 액이 리뷰에서 거부되거나 PushKit 서비스에서 비활성화될 수 있습니다. Apple은 iOS 13부터 백그라운드 데이터 업데이트를 위한 PushKit 사용 기능도 제거했습니다.

Apple의 PushKit 사용 권장 사항 (iOS 13+)

  • 모든 VoIP 알림은 push 수신 후 5초 이내에 reportNewIncomingCall을 호출해야 합니다
  • 핑, 컨텐츠 동기화 또는 토큰 업데이트에 PushKit을 사용하지 마십시오 — 그런 용도에는 background fetch가 있습니다
  • 서버 측은 사실적인 수신 전화가 있을 때만 push를 보내야 하고, 사전 깨우기를 위해서는 보내지 말아야 합니다
  • 후속 전화 없이 push를 받으면 최근 항목에 부재 전화가 표시됩니다 — 이는 사용자를 혼란스럽게 합니다

Swift에서 PushKit 통합

완전한 PushKit 통합에는 등록, push 토큰 획득, 그리고 수신 알림 처리가 포함됩니다. PushKit은 자동으로 알림 전송 허락을 요청합니다 — PushKit 자체에 UNUserNotificationCenter의 추가 호출이 필요하지 않지만, 애플리케이션의 로컬 알림에는 필요할 수 있습니다. 등록 후, 시스템이 pushRegistry:didUpdatePushCredentials를 호출하여 push 토큰을 전달하며, 이를 서버에 보내야 합니다.

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

서버에서 push 알림 보내기

서버 측은 APNs를 통해 push-type = voip와 헤더 apns-push-type: voip로 PushKit 알림을 보냅니다. 일반 APNs와 달리, VoIP push는 자체 인증서를 사용하고 topic 구성이 필요하지 않습니다. payload는 통화 식별을 위한 최소 데이터를 포함해야 합니다.

json
// VoIP push payload 예제
{
    "aps": {
        "alert": {}
    },
    "caller": "+15551234567",
    "callerName": "Alice Johnson",
    "sessionId": "abc-123-def",
    "hasVideo": false
}

PushKit 알림 진단 및 디버깅

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로 이어지도록 확인

자주 묻는 질문

CallKit 없이 PushKit을 사용할 수 있나요?

기술적으로 가능하지만, 의미가 없습니다. iOS 13 이후 PushKit의 유일한 허용된 사용은 수신 전화 표시로, 이를 위해 CallKit이 필요합니다. CallKit 없이 PushKit을 사용하면 App Store에서 액이 거부됩니다.

PushKit payload의 최대 크기는 얼마인가요?

PushKit의 최대 payload 크기는 5 KB(5120 바이트)입니다. 이는 일반 APNs 알림보다 1 KB 더 많으며, 더 많은 통화 메타데이터를 전송할 수 있습니다.

PushKit을 사용하는 액을 삭제하면 어떻게 됩니까?

액을 삭제하면 Apple이 자동으로 push 토큰을 무효합니다. 서버는 무효화 알림을 받고 해당 토큰에 push 보내기를 멈추어야 합니다. 무효한 토큰에 push를 보내려면 APNs 오류 410이 발생합니다.

PushKit은 macOS에서 작동하나요?

PushKit은 macOS 10.14+에서 Mac Catalyst 또는 AppKit을 사용하여 빌드된 Mac 애플리케이션에서 사용할 수 있습니다. VoIP 알림 지원을 포함하여 기능이 iOS 버전과 완전히 동일합니다.

PushKit 연결이 활성인지 확인하려면 어떻게 해야 하나요?

자체 분석 도구를 사용하세요: 서버에서 push를 보낸 시간과 클라이언트에서 didReceiveIncomingPushWithPayload가 호출된 시간 사이를 추적하십시오. 평균 500ms 미만이면 PushKit이 정상적으로 작동하고 있다는 것입니다.

요약

  • PushKit — 지속적인 TCP 연결을 사용하고 500ms 미만의 지연을 제공하며 높은 우선순위로 push 알림을 전달하는 Apple의 프레임워크입니다.
  • PKPushRegistry는 특정 유형(VoIP, Complication, FileProvider 또는 PushToTalk)의 알림을 받도록 애플리케이션을 등록합니다.
  • iOS 13 이후, PushKit의 유일한 허용된 사용은 CallKit을 통한 수신 전화 표시입니다. PushKit을 통한 백그라운드 데이터 업데이트는 금지됩니다.
  • APNs와의 차이점 — 버퍼링이 없는 전용 TCP 채널과 어떤 상태에서도 보장된 액 깨우기.
  • Payload는 5KB로 제한됩니다. 각 VoIP push는 5초 이내에 reportNewIncomingCall을 호출해야 합니다.
  • PushKit 진단에는 물리적 기기가 필요합니다. 시뮬레이터는 지원되지 않습니다. 토큰은 매번 시작할 때마다 업데이트해야 합니다.
  • PushKit + CallKit — VoIP 애플리케이션을 위한 표준 조합: PushKit이 알림을 전달하고, CallKit이 시스템 전화 화면을 표시합니다.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기