CallKit একটি Apple ফ্রেমওয়ার্ক যা VoIP অ্যাপ্লিকেশনগুলিকে iOS সিস্টেম ফোন ইন্টারফেসে ইনকামিং এবং আউটগোয়িং কল প্রদর্শন করতে দেয়, লক স্ক্রিন সহ। ডেভেলপাররা নিজস্ব UI তৈরি করার প্রয়োজন ছাড়াই স্ট্যান্ডার্ড নিয়ন্ত্রণ পায় — কল গ্রহণ, প্রত্যাখ্যান, হোল্ড করা। Apple Developer Documentation, 2026 অনুসারে, ফ্রেমওয়ার্কটি একটি একক সিস্টেম ইন্টারফেসের মাধ্যমে 98% VoIP কল প্রক্রিয়া করে, যা বিভিন্ন মেসেঞ্জার এবং যোগাযোগ অ্যাপের মধ্যে ব্যবহারকারীর অভিজ্ঞতার বিভাজন দূর করে।
মূল পয়েন্ট
CallKit একটি Apple ফ্রেমওয়ার্ক যা iOS 10-এ প্রবর্তিত হয়েছে যা VoIP অ্যাপ্লিকেশনগুলিকে সিস্টেম ফোন অ্যাপের সাথে ইন্টিগ্রেট করার জন্য প্রোগ্রামিং ইন্টারফেস প্রদান করে। CallKit-এর আগে, প্রতিটি VoIP অ্যাপ নিজস্ব UI-তে ইনকামিং কল প্রদর্শন করত — ব্যবহারকারী অ্যাপ থেকে একটি বিজ্ঞপ্তি দেখত কিন্তু সিস্টেম পদ্ধতিতে উত্তর দিতে পারত না। CallKit এই অভিজ্ঞতাকে একীভূত করে: একটি ইনকামিং VoIP কল একই নিয়ন্ত্রণ সহ একটি সাধারণ ফোন কল হিসাবে প্রদর্শিত হয়।
CallKit-এর মূল উদ্দেশ্য হল ব্যবহারকারীর অভিজ্ঞতার বিভাজন দূর করা। যখন একটি অ্যাপ CallKit ব্যবহার করে, কল লক স্ক্রিনে, কল ইতিহাসে এবং সিস্টেম ফোন অ্যাপের সাম্প্রতিক কল তালিকায় প্রদর্শিত হয়। ব্যবহারকারী পরিচিত অঙ্গভঙ্গি দিয়ে কল উত্তর, প্রত্যাখ্যান বা ভয়েসমেলে পাঠাতে পারেন — কোন অ্যাপ কল পরিচালনা করছে তা না ভেবেই।
Apple WWDC 2023 সেশন “What’s new in CallKit” অনুসারে, 85% এর বেশি ব্যবহারকারী CallKit ইন্টিগ্রেশন সহ অ্যাপগুলিকে পছন্দ করেন যেগুলি কলের জন্য নিজস্ব UI ব্যবহার করে তার চেয়ে। কারণ হল সিস্টেম নিয়ন্ত্রণের সামঞ্জস্যতা এবং পূর্বানুমানযোগ্যতা যা শেখার প্রয়োজন হয় না।
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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন