CallKit — framework ng Apple na nagpapahintulot sa mga VoIP application na magpakita ng mga papasok at papalabas na tawag sa system interface ng iOS phone, kasama ang lock screen. Ang developer ay nakakakuha ng standard na mga kontrol — pagtanggap, pagtanggi, pag-hold ng tawag — nang hindi na kailangang gumawa ng sariling UI. Ayon sa Apple Developer Documentation, 2026, pinoproseso ng framework ang hanggang 98% ng mga tawag sa VoIP sa pamamagitan ng isang pinag-isang system interface, na nag-aalis ng pagkakapira-piraso ng karanasan ng user sa pagitan ng iba’t ibang messenger at communication application.
Mga pangunahing punto
CallKit — framework ng Apple, na ipinakilala sa iOS 10, na nagbibigay ng programming interface para sa pagsasama ng mga VoIP application sa system telephone application. Bago ang CallKit, bawat VoIP application ay nagpapakita ng papasok na tawag sa sarili nitong UI — nakikita ng user ang notification mula sa application ngunit hindi makasagot sa paraang system. Pinag-iisa ng CallKit ang karanasang ito: ang papasok na tawag sa VoIP ay ipinapakita tulad ng isang ordinaryong tawag sa telepono na may parehong mga kontrol.
Ang pangunahing layunin ng CallKit ay alisin ang pagkakapira-piraso ng karanasan ng user. Kapag gumagamit ang application ng CallKit, lumilitaw ang tawag sa lock screen, sa kasaysayan ng tawag, at sa listahan ng mga kamakailang tawag ng system Telephone application. Ang user ay maaaring sumagot, tumanggi, o magpadala ng tawag sa voicemail gamit ang pamilyar na mga galaw — nang hindi iniisip kung aling application ang nagpoproseso ng tawag.
Ayon sa Apple WWDC 2023 Session “What’s new in CallKit”, higit sa 85% ng mga user ay mas gusto ang mga application na may CallKit integration kaysa sa mga gumagamit ng sariling UI para sa mga tawag. Dahilan — pagkakapareho at predictability ng system control na hindi nangangailangan ng pag-aaral.
Kung walang CallKit, ang papasok na tawag sa VoIP ay ihahatid sa pamamagitan ng standard na push notification. Nakikita ng user ang isang banner, ini-tap ito, hinihintay ang pagbukas ng application, at saka lamang nakikita ang screen ng tawag. CallKit kasama ang PushKit ay nagpapaikli sa landas na ito sa zero: agad na lumilitaw ang tawag, kahit na hindi naka-start ang application, at ang system interface ay handa nang sumagot sa millisecond.
Ang arkitektura ng CallKit ay binuo sa paligid ng dalawang pangunahing klase — CXProvider at CXCallController, na nagpapatupad ng pattern ng provider-client. Pinamamahalaan ng provider ang tawag sa panig ng system, pinapasimulan ng client ang mga aksyon sa ngalan ng user o application. Tinitiyak ng paghihiwalay na ito na ang system interface ay laging nananatiling consistent, kahit na ang application ay pansamantalang hindi available.
CXProvider — ang sentral na object na nagrerehistro ng application sa CallKit bilang provider ng tawag. Ito ay naka-configure sa pamamagitan ng CXProviderConfiguration, kung saan tinukoy ang icon ng application, mga suportadong uri ng tawag (audio, video), at maximum na bilang ng sabay-sabay na grupo. Ang provider ay tumatanggap ng mga request ng aksyon mula sa system at ipinapasa ang mga ito sa application sa pamamagitan ng CXProviderDelegate.
let configuration = CXProviderConfiguration(localizedName: "My VoIP App")
configuration.supportedHandleTypes = [.phoneNumber, .generic]
configuration.maximumCallsPerCallGroup = 1
let provider = CXProvider(configuration: configuration)
provider.setDelegate(self, queue: .main)
CXCallController — ang client object kung saan ang application ay nagre-request ng mga aksyon sa mga tawag: pagsisimula, pagtatapos, pag-hold, paglipat. Ang mga request ay ipinapadala sa CallKit sa pamamagitan ng CXTransaction, na naglalaman ng array ng CXAction objects. Bini-validate ng CallKit ang bawat aksyon at isinasagawa ito kung pinapayagan ito sa kasalukuyang estado.
let controller = CXCallController()
let startCallAction = CXStartCallAction(
callUUID: UUID(),
handle: CXHandle(type: .phoneNumber, value: "+15551234567")
)
startCallAction.isVideo = true
controller.request(CXTransaction(action: startCallAction))
Ang delegate ng provider ay tumatanggap ng lahat ng event mula sa CallKit. Ang kritikal na method ay providerDidBegin, na nagpapahiwatig na nagsimula na ang tawag. Sa provider:performAnswerCallAction ang application ay dapat magsimula ng audio session: i-activate ang AVAudioSession at simulan ang media transmission. Kung hindi na-activate ng application ang audio session sa loob ng limitadong oras, tatapusin ng CallKit ang tawag.
PushKit — obligadong component para sa paghahatid ng mga papasok na tawag sa VoIP sa CallKit. Ang ordinaryong push notification (APNs) ay may hindi mahuhulaan na pagkaantala at hindi ginagarantiyahan ang paghahatid kung ang application ay nasa background. Gumagamit ang PushKit ng permanenteng TCP connection sa mga server ng Apple para sa agarang paghahatid ng VoIP notification, na kritikal para sa real-time na mga tawag.
Scheme ng paggawa: nagpapadala ang server ng VoIP notification sa pamamagitan ng PushKit → natatanggap ito ng application sa pushRegistry:didReceiveIncomingPushWithPayload → agad na ipinapakita ng application ang papasok na tawag sa pamamagitan ng CXProvider → ipinapakita ng CallKit ang system call screen. Lahat ay nangyayari sa split second, at nakikita ng user ang tawag kasabay ng pagdating nito sa server.
Simula sa iOS 13, nagpatupad ang Apple ng limitasyon: ang VoIP notification ay dapat gamitin lamang para sa indikasyon ng mga papasok na tawag. Ang paggamit ng PushKit para sa background data loading o content update ay ipinagbabawal — ang naturang mga application ay maaaring tanggihan sa moderation. Ang pagbabagong ito ay ginawang mas predictable ang VoIP ecosystem, dahil ang lahat ng PushKit notification ay garantisadong nauugnay sa mga tawag.
func pushRegistry(
_ registry: PKPushRegistry,
didReceiveIncomingPushWith payload: PKPushPayload,
for type: PKPushType
) {
let uuid = UUID()
let update = CXCallUpdate()
update.remoteHandle = CXHandle(
type: .phoneNumber,
value: payload.dictionaryPayload["caller"]
)
update.hasVideo = false
provider.reportNewIncomingCall(with: uuid, update: update)
}
Call Directory Extension — isang app extension na nagpapahintulot sa application na magbigay sa system ng mga listahan ng numero para sa pagkilala (pagpapakita ng pangalan ng tumatawag) at pag-block. Ang extension ay gumagana nang independyente sa pangunahing application: nilo-load ng system ang data mula sa extension sa pag-activate, at lahat ng kasunod na operasyon ay isinasagawa nang walang partisipasyon ng application, na nakakatipid ng resources at nagpapataas ng seguridad.
Ang extension ay gumagamit ng CXCallDirectoryManager para sa pamamahala ng data. Ang application sa pamamagitan ng pangunahing proseso ay nagdaragdag ng mga numero sa database ng extension, at pagkatapos ay tinatawag ang reloadExtension para i-update ang system cache. Inirerekomenda ng Apple na i-update ang data nang hindi hihigit sa isang beses bawat oras upang maiwasan ang hindi kinakailangang pag-load ng system.
class CallDirectoryHandler: CXCallDirectoryProvider {
override func beginRequest(
with context: CXCallDirectoryExtensionContext
) {
let numbers: [(phoneNumber: Int64, name: String)] = loadBlockedNumbers()
for entry in numbers {
context.addIdentificationEntry(
withNextSequentialPhoneNumber: entry.phoneNumber,
label: entry.name
)
}
context.completeRequest()
}
}
| Paraan ng CXCallDirectoryManager | Layunin |
|---|---|
| reloadExtension | Puwersahang pag-update ng system cache |
| getEnabledStatus | Pagsusuri kung ang extension ay pinagana ng user |
| openSettings | Pag-navigate sa screen ng mga setting ng extension |
Ang buong integrasyon ng CallKit ay nangangailangan ng configuration ng tatlong component: configuration ng provider, pagproseso ng mga papasok na tawag sa pamamagitan ng PushKit, at pamamahala ng audio session. Nasa ibaba ang isang minimal na gumaganang halimbawa na nagpoproseso ng papasok na tawag sa VoIP, ipinapakita ito sa pamamagitan ng CallKit, at ina-activate ang audio.
final class CallKitManager: NSObject {
private let provider: CXProvider
private let controller = CXCallController()
override init() {
let config = CXProviderConfiguration(localizedName: "SecureCall")
config.supportedHandleTypes = [.phoneNumber]
config.maximumCallGroups = 1
self.provider = CXProvider(configuration: config)
super.init()
provider.setDelegate(self, queue: .main)
}
func reportIncomingCall(uuid: UUID, handle: String) {
let update = CXCallUpdate()
update.remoteHandle = CXHandle(type: .phoneNumber, value: handle)
provider.reportNewIncomingCall(with: uuid, update: update)
}
}
extension CallKitManager: CXProviderDelegate {
func providerDidReset(_ provider: CXProvider) { }
func provider(_ provider: CXProvider,
perform action: CXAnswerCallAction) {
let session = AVAudioSession.sharedInstance()
try? session.setCategory(.playAndRecord)
try? session.setActive(true)
action.fulfill()
}
}
Ang CallKit ay magagamit sa iOS, macOS at iPadOS, ngunit ang pag-uugali ng framework ay naiiba sa bawat platform. Sa iOS, gumagana nang buo ang CallKit: system call screen, lock screen, integrasyon sa CarPlay. Sa iPadOS, ang pagpapakita ng tawag ay nangyayari bilang isang system banner, hindi isang full-screen interface. Sa macOS, ang CallKit ay magagamit mula sa macOS 10.14 Mojave, ngunit para lamang sa mga Mac application na binuo gamit ang Catalyst o direktang gumagamit ng AppKit.
Ang pangunahing limitasyon — ang CallKit ay hindi suportado sa watchOS. Ang mga developer ng Apple Watch ay hindi maaaring magpakita ng mga tawag sa VoIP sa pamamagitan ng system interface sa relo. Sa halip, ang watchOS application ay tumatanggap ng notification tungkol sa tawag sa pamamagitan ng WCSession at dapat magpatupad ng sarili nitong call screen. Ang CallKit ay hindi rin gumagana sa simulator — ang pagsubok ng VoIP function ay posible lamang sa isang pisikal na device.
| Function | iOS | iPadOS | macOS |
|---|---|---|---|
| System call screen | Full screen | Banner | Banner |
| Lock screen | Oo | Hindi | Hindi |
| CarPlay | Oo | Hindi | Hindi |
| Call Directory | Oo | Oo | Hindi |
| Recents history | Oo | Oo | Oo |
Mga madalas itanong
Oo, para sa mga papasok na tawag ang PushKit ay kailangan. Tanging ang PushKit ang ginagarantiyahan ang agarang paghahatid ng VoIP notification sa natutulog o saradong application, na kritikal para sa napapanahong pagpapakita ng tawag sa pamamagitan ng CallKit.
Oo, sinusuportahan ng CallKit ang audio at video. Sa configuration ng CXProvider itakda ang supportsVideo = true, at sa CXStartCallAction itakda ang isVideo = true. Tamang ipapakita ng system ang icon ng camera sa interface ng tawag.
Hindi posible — ang CallKit ay hindi gumagana sa simulator. Para sa pagsubok gumamit ng pisikal na iOS o iPadOS device. Sa macOS maaari kang sumubok sa isang totoong Mac na may mikropono.
Oo, bawat application ay nagrerehistro ng sarili nitong CXProvider. Tamang pinoproseso ng system ang mga tawag mula sa iba’t ibang application at ipinapakita ang mga ito bilang hiwalay na mga tawag sa Recents. Nakikita ng user kung saang application nanggaling ang tawag.
Awtomatikong tatapusin ng CallKit ang tawag pagkatapos ng limitadong oras kung hindi na-activate ng application ang audio session. Magsisimula ang timer upang hindi manatili ang system sa estado ng tawag nang walang tunay na audio stream.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din