CallKit ایک Apple فریم ورک ہے جو VoIP ایپلی کیشنز کو iOS سسٹم فون انٹرفیس میں آنے والی اور جانے والی کالز دکھانے کی اجازت دیتا ہے، جس میں لاک اسکرین بھی شامل ہے۔ ڈیولپر کو معیاری کنٹرولز ملتے ہیں — قبول کرنا، مسترد کرنا، کال کو ہولڈ کرنا — اپنا یوزر انٹرفیس بنانے کی ضرورت کے بغیر۔ Apple Developer Documentation، 2026 کے مطابق، فریم ورک ایک ہی سسٹم انٹرفیس کے ذریعے 98% VoIP کالز پر کارروائی کرتا ہے، جو مختلف میسنجر اور کمیونیکیشن ایپس کے درمیان صارف کے تجربے کی تقسیم کو ختم کرتا ہے۔
اہم نکات
CallKit ایک Apple فریم ورک ہے جسے iOS 10 میں متعارف کرایا گیا تھا جو VoIP ایپلی کیشنز کو سسٹم فون ایپ کے ساتھ ضم کرنے کے لیے پروگرامنگ انٹرفیس فراہم کرتا ہے۔ CallKit سے پہلے، ہر VoIP ایپ آنے والی کالوں کو اپنے یوزر انٹرفیس میں دکھاتی تھی — صارف ایپ سے اطلاع دیکھتا تھا لیکن سسٹم طریقے سے جواب نہیں دے سکتا تھا۔ CallKit اس تجربے کو یکجا کرتا ہے: ایک آنے والی VoIP کال معمول کی فون کال کی طرح اسی کنٹرولز کے ساتھ ظاہر ہوتی ہے۔
CallKit کا بنیادی مقصد صارف کے تجربے کی تقسیم کو ختم کرنا ہے۔ جب کوئی ایپ CallKit استعمال کرتی ہے، تو کال لاک اسکرین، کال ہسٹری اور سسٹم فون ایپ کی حالیہ کالوں کی فہرست میں ظاہر ہوتی ہے۔ صارف واقف اشاروں سے کال کا جواب دے سکتا ہے، مسترد کر سکتا ہے یا وائس میل پر بھیج سکتا ہے — بغیر یہ سوچے کہ کون سی ایپ کال کو ہینڈل کر رہی ہے۔
Apple WWDC 2023 سیشن “What’s new in CallKit” کے مطابق، 85% سے زیادہ صارفین کالوں کے لیے اپنا یوزر انٹرفیس استعمال کرنے والی ایپس کے مقابلے CallKit انضمام والی ایپس کو ترجیح دیتے ہیں۔ وجہ سسٹم کنٹرولز کی مستقل مزاجی اور پیش گوئی ہے جو سیکھنے کی ضرورت نہیں ہوتی۔
CallKit کے بغیر، آنے والی VoIP کال معیاری push اطلاع کے ذریعے پہنچائی جاتی ہے۔ صارف ایک بینر دیکھتا ہے، اسے تھپتھپاتا ہے، ایپ کھلنے کا انتظار کرتا ہے، اور تب ہی کال اسکرین دیکھتا ہے۔ CallKit PushKit کے ساتھ مل کر اس راستے کو صفر تک کم کر دیتا ہے: کال فوری طور پر ظاہر ہوتی ہے، چاہے ایپ چل نہ رہی ہو، اور سسٹم انٹرفیس ملی سیکنڈز میں جواب دینے کے لیے تیار ہوتا ہے۔
CallKit آرکیٹیکچر دو اہم کلاسز کے گرد بنایا گیا ہے — CXProvider اور CXCallController، جو فراہم کنندہ-کلائنٹ پیٹرن کو نافذ کرتی ہیں۔ فراہم کنندہ سسٹم کی طرف کال کا انتظام کرتا ہے، جبکہ کلائنٹ صارف یا ایپ کی طرف سے کارروائی شروع کرتا ہے۔ یہ علیحدگی اس بات کو یقینی بناتی ہے کہ سسٹم انٹرفیس ہمیشہ مطابقت رکھتا ہے، چاہے ایپ عارضی طور پر دستیاب نہ ہو۔
CXProvider مرکزی آبجیکٹ ہے جو ایپ کو CallKit میں کال فراہم کنندہ کے طور پر رجسٹر کرتا ہے۔ یہ CXProviderConfiguration کے ذریعے ترتیب دیا جاتا ہے، جہاں ایپ آئیکن، معاون کال کی اقسام (آڈیو، ویڈیو)، اور زیادہ سے زیادہ بیک وقت گروپس متعین کیے جاتے ہیں۔ فراہم کنندہ سسٹم سے کارروائی کی درخواستیں وصول کرتا ہے اور انہیں 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 کلائنٹ آبجیکٹ ہے جس کے ذریعے ایپ کالوں پر کارروائی کی درخواست کرتی ہے: شروع کرنا، ختم کرنا، ہولڈ کرنا، سوئچ کرنا۔ درخواستیں CXTransaction کے ذریعے CallKit کو بھیجی جاتی ہیں، جس میں CXAction آبجیکٹ کی ایک صف ہوتی ہے۔ CallKit ہر کارروائی کی توثیق کرتا ہے اور اگر موجودہ حالت میں اجازت ہو تو اسے انجام دیتا ہے۔
let controller = CXCallController()
let startCallAction = CXStartCallAction(
callUUID: UUID(),
handle: CXHandle(type: .phoneNumber, value: "+15551234567")
)
startCallAction.isVideo = true
controller.request(CXTransaction(action: startCallAction))
فراہم کنندہ کا ڈیلیگیٹ CallKit سے تمام ایونٹس وصول کرتا ہے۔ اہم طریقہ providerDidBegin ہے، جو اشارہ کرتا ہے کہ کال شروع ہو گئی ہے۔ provider:performAnswerCallAction میں، ایپ کو آڈیو سیشن شروع کرنا ہوگا: AVAudioSession کو فعال کرنا اور میڈیا ٹرانسمیشن شروع کرنا۔ اگر ایپ محدود وقت کے اندر آڈیو سیشن کو فعال نہیں کرتی ہے، تو CallKit کال ختم کر دے گا۔
PushKit آنے والی VoIP کالوں کو CallKit تک پہنچانے کے لیے ایک لازمی جزو ہے۔ عام push اطلاعات (APNs) میں غیر متوقع تاخیر ہوتی ہے اور اگر ایپ پس منظر میں ہو تو ترسیل کی ضمانت نہیں دیتیں۔ PushKit فوری VoIP اطلاع کی ترسیل کے لیے Apple سرورز کے ساتھ ایک مستقل TCP کنکشن استعمال کرتا ہے، جو ریئل ٹائم کالز کے لیے اہم ہے۔
ورک فلو: سرور PushKit کے ذریعے VoIP اطلاع بھیجتا ہے → ایپ اسے pushRegistry:didReceiveIncomingPushWithPayload میں وصول کرتی ہے → ایپ CXProvider کے ذریعے فوری طور پر آنے والی کال دکھاتی ہے → CallKit سسٹم کال اسکرین دکھاتا ہے۔ سب کچھ سیکنڈ کے جزء میں ہوتا ہے، اور صارف کال کو اسی وقت دیکھتا ہے جب یہ سرور پر آتی ہے۔
iOS 13 سے شروع کرتے ہوئے، Apple نے ایک پابندی لگائی: VoIP اطلاعات صرف آنے والی کالوں کے اشارے کے لیے استعمال ہونی چاہئیں۔ پس منظر میں ڈیٹا لوڈ کرنے یا مواد کو اپ ڈیٹ کرنے کے لیے PushKit کا استعمال ممنوع ہے — ایسی ایپس کو جائزہ میں مسترد کیا جا سکتا ہے۔ اس تبدیلی نے VoIP ماحولیاتی نظام کو زیادہ پیش قیاسی بنا دیا، کیونکہ اب تمام PushKit اطلاعات کالوں سے متعلق ہونے کی ضمانت ہے۔
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 ایک ایپ ایکسٹینشن ہے جو ایپ کو سسٹم کو شناخت (کالر کا نام دکھانا) اور بلاک کرنے کے لیے نمبروں کی فہرستیں فراہم کرنے کی اجازت دیتی ہے۔ ایکسٹینشن مرکزی ایپ سے آزادانہ طور پر کام کرتی ہے: سسٹم ایکٹیویشن پر ایکسٹینشن سے ڈیٹا لوڈ کرتا ہے، اور تمام بعد کی کارروائیاں ایپ کی شمولیت کے بغیر انجام دی جاتی ہیں، جس سے وسائل کی بچت ہوتی ہے اور سیکیورٹی بہتر ہوتی ہے۔
ایکسٹینشن ڈیٹا کے انتظام کے لیے CXCallDirectoryManager استعمال کرتی ہے۔ ایپ مرکزی عمل کے ذریعے ایکسٹینشن کے ڈیٹابیس میں نمبر شامل کرتی ہے، اور پھر سسٹم کیش کو اپ ڈیٹ کرنے کے لیے reloadExtension کو کال کرتی ہے۔ Apple سسٹم پر غیر ضروری بوجھ سے بچنے کے لیے ڈیٹا کو ایک گھنٹے میں ایک بار سے زیادہ اپ ڈیٹ نہ کرنے کی سفارش کرتا ہے۔
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()
}
}
| CXCallDirectoryManager کا طریقہ | مقصد |
|---|---|
| reloadExtension | سسٹم کیش کی لازمی اپ ڈیٹ |
| getEnabledStatus | چیک کریں کہ آیا ایکسٹینشن صارف کے ذریعہ فعال ہے |
| openSettings | ایکسٹینشن کی ترتیبات کی اسکرین پر جائیں |
مکمل CallKit انضمام کے لیے تین اجزاء کی ترتیب درکار ہے: فراہم کنندہ ترتیب، PushKit کے ذریعے آنے والی کالوں کو ہینڈل کرنا، اور آڈیو سیشن کا انتظام۔ ذیل میں ایک کم سے کم کام کرنے والی مثال ہے جو آنے والی VoIP کال کو ہینڈل کرتی ہے، اسے CallKit کے ذریعے دکھاتی ہے اور آڈیو کو فعال کرتی ہے۔
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()
}
}
CallKit iOS، macOS اور iPadOS پر دستیاب ہے، لیکن فریم ورک کا رویہ پلیٹ فارمز کے درمیان مختلف ہوتا ہے۔ iOS پر CallKit مکمل طور پر کام کرتا ہے: سسٹم کال اسکرین، لاک اسکرین، CarPlay انضمام۔ iPadOS پر کال فل سکرین انٹرفیس کے بجائے سسٹم بینر کے طور پر دکھائی جاتی ہے۔ macOS پر CallKit macOS 10.14 Mojave سے دستیاب ہے، لیکن صرف Catalyst کے ساتھ بنائے گئے یا براہ راست AppKit استعمال کرنے والے Mac ایپس کے لیے۔
بنیادی حد — CallKit watchOS پر تعاون یافتہ نہیں ہے۔ Apple Watch ڈیولپرز گھڑی پر سسٹم انٹرفیس کے ذریعے VoIP کالز نہیں دکھا سکتے۔ اس کے بجائے، watchOS ایپ WCSession کے ذریعے کال کی اطلاع وصول کرتی ہے اور اسے اپنی کال اسکرین نافذ کرنی ہوتی ہے۔ نیز، CallKit سمیلیٹر پر کام نہیں کرتا — VoIP خصوصیات کی جانچ صرف فزیکل ڈیوائس پر ممکن ہے۔
| خصوصیت | iOS | iPadOS | macOS |
|---|---|---|---|
| سسٹم کال اسکرین | فل سکرین | بینر | بینر |
| لاک اسکرین | ہاں | نہیں | نہیں |
| CarPlay | ہاں | نہیں | نہیں |
| کال ڈائریکٹری | ہاں | ہاں | نہیں |
| حالیہ کالز کی تاریخ | ہاں | ہاں | ہاں |
اکثر پوچھے گئے سوالات
ہاں، آنے والی کالوں کے لیے PushKit لازمی ہے۔ صرف PushKit سوتی ہوئی یا بند ایپ کو VoIP اطلاعات کی فوری ترسیل کی ضمانت دیتا ہے، جو CallKit کے ذریعے بروقت کال ڈسپلے کے لیے اہم ہے۔
ہاں، CallKit آڈیو اور ویڈیو کو سپورٹ کرتا ہے۔ CXProvider ترتیب دیتے وقت supportsVideo = true سیٹ کریں، اور CXStartCallAction میں isVideo = true سیٹ کریں۔ سسٹم کال انٹرفیس میں ویڈیو کیمرہ آئیکن کو صحیح طریقے سے دکھائے گا۔
کسی بھی طرح نہیں — CallKit سمیلیٹر پر کام نہیں کرتا۔ جانچ کے لیے فزیکل iOS یا iPadOS ڈیوائس استعمال کریں۔ macOS پر، مائیکروفون والے حقیقی Mac پر جانچ کی جا سکتی ہے۔
ہاں، ہر ایپ اپنا CXProvider رجسٹر کرتی ہے۔ سسٹم مختلف ایپس سے کالوں کو صحیح طریقے سے ہینڈل کرتا ہے اور انہیں حالیہ کالوں میں الگ کالوں کے طور پر دکھاتا ہے۔ صارف دیکھ سکتا ہے کہ کال کس ایپ سے آئی ہے۔
اگر ایپ محدود وقت کے اندر آڈیو سیشن فعال نہیں کرتی ہے تو CallKit خود بخود کال ختم کر دے گا۔ ٹائمر اس لیے چالو ہوتا ہے تاکہ سسٹم حقیقی آڈیو سٹریم کے بغیر کال کی حالت میں نہ رہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں