I received incoming call requests using PushKit/VoIP. The problem is I cannot launch the app to show incoming call screen since CallKit is not available prior to iOS 10.
I have succeeded to show notifications but how can I launch the app from background?
Here is my code:
func pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) {
if (pushCredentials.type == .voIP) {
let pkToken = (pushCredentials.token as NSData).description
SocketManager.shared.send(pkToken: pkToken)
}
}
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType) {
let payloadDict = payload.dictionaryPayload["aps"] as? Dictionary<String, String>
let message = payloadDict?["alert"]
Notifications.present(id: "test", title: "test", body: message)
NSLog("incoming voip notfication 1: \(payload.dictionaryPayload)")
}
Related
We are developing a voip calling app. We are using CallKit and PushKit frameworks. A user recently reported that his iPhone is not receiving CallKit push anymore, but few days ago that was working. Please note mutable push is working on his device. We have collected device's console logs and learned that device did not receive voip push payload.
No firewalls installed and no recent change history of network settings.
Environments info:
Device Model: iPhone Xs
iOS version: 15.6.1
Network Connectivity: Wifi
This is how we registered PushKit
private func registerForVoIPPushes() {
self.voipRegistry = PKPushRegistry(queue: pushRegistryQueue)
self.voipRegistry.delegate = self
self.voipRegistry.desiredPushTypes = [.voIP]
}
We conforms the PKPushRegistryDelegate this way
extension AppDelegate: PKPushRegistryDelegate {
func pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) {
let deviceToken = pushCredentials.token.map { String(format: "%02x", $0) }.joined()
updateVoIPToken(deviceToken)
}
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: #escaping () -> Void) {
DDLogDebug("Incoming call voip push: \(payload.dictionaryPayload)")
handleIncomingCall(payload: payload.dictionaryPayload)
completion()
}
func pushRegistry(_ registry: PKPushRegistry, didInvalidatePushTokenFor type: PKPushType) {
DDLogDebug("didInvalidatePushTokenFor type: \(type)")
}
}
This is how server sends voip push payload
path = '/3/device/{0}'.format({deviceToken}})
request_headers = {
'apns-expiration': '0',
'apns-priority': '10',
'apns-topic': 'com.companyname.app.voip',
'apns-push-type':'voip',
'authorization': 'bearer {auth-token}'
}
# Open a connection the APNS server
conn = HTTP20Connection('api.push.apple.com:443')
conn.request(
'POST',
path,
payload,
headers=request_headers
)
resp = conn.get_response()
print(resp.status)
print(resp.read())
The output http status code shows 200 but push actually not delivered.
Same codebase is woking fine with other devices.
I appreciate any helps and suggestions.
Thanks.
I have implemented VOIP in swift.
Earlier it was working fine.
But, Now it is not triggering the didReceiveIncomingPushWith function.
Please find my configuration
let config = CXProviderConfiguration.init(localizedName: "AppName")
var provider: CXProvider!
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
provider = CXProvider(configuration: config)
provider.setDelegate(self, queue: DispatchQueue.main)
self.registerVOIP()
}
func registerVOIP() {
//register for voip notifications
pushRegistry = PKPushRegistry(queue: DispatchQueue.main)
pushRegistry.delegate = self;
pushRegistry.desiredPushTypes = Set([PKPushType.voIP])
}
extension AppDelegate : PKPushRegistryDelegate{
func pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) {
}
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType) {
}
}
In the extension method, didUpdate works fine, since delegate is set in didiFinishLoad
I am using QuickBlox for VOIP
I check the voip certificate everything is fine.
Here the quick box new session delegate
extension AppDelegate : QBRTCClientDelegate{
func didReceiveNewSession(_ session: QBRTCSession, userInfo: [String : String]? = nil) {
print(#function)
}
}
the didReceiveNewSession function is trigger when receives a new call (If the app is in foreground)
Your code is fine, it is Quickblox server-side code needs to be changed.
I am getting below error on running my app on iPhone 6. I am trying to implement VoIP feature.
What is the solution for this ? Any help will be appreciated. Thanks.
I am using below code for VoIP feature.
func application( _ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data ) {
let voipRegistry = PKPushRegistry(queue: DispatchQueue.main)
voipRegistry.desiredPushTypes = [PKPushType.voIP]
voipRegistry.delegate = self;
}
extension AppDelegate : PKPushRegistryDelegate {
func pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) {
NSLog("PusRegistry didUpdateCredential....")
let deviceTokenString: String = pushCredentials.token.map { String(format: "%02.2hhx", $0) }.joined()
NSLog("PushCredentials: \(deviceTokenString)" )
UIPasteboard.general.string = deviceTokenString
showLocalNotifiacation(text: "Received pushCredential")
NSLog("Token is : \(deviceTokenString)")
}
func pushRegistry(_ registry: PKPushRegistry,
didInvalidatePushTokenFor type: PKPushType) {
}
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType) {
NSLog("<><><><><><><><><><><><><><><><><>><><><><><><><>><><>><><><><><")
NSLog("<><><><><><><><><><><><><><><><><>><><><><><><><>><><>><><><><><")
NSLog("<><><><><><><><><><><><><><><><><>><><><><><><><>><><>><><><><><")
NSLog("<><><><><><><><><><><><><><><><><>><><><><><><><>><><>><><><><><")
NSLog("<><><><><><><><><><><><><><><><><>><><><><><><><>><><>><><><><><")
NSLog("<><><><><><><><><><><><><><><><><>><><><><><><><>><><>><><><><><")
NSLog("<**************** Syncing data because of VOIP ***************")
sharedSilentPushSyncManager.syncDataForOperation("Syncing... for voip")
showLocalNotifiacation(text: "Received voip push")
}
}
Try this one!
1.Open your Xcode.
2.Go to your project target.
3.Click Capabilities tab in target.
4.Check with the following screenshot and enable Push Notification, Background Modes capabilities.
5.check your info.plist of your project.
6.Check your settings provided with above information and correct it.
Thank you!
I am using the following code on the iOS side to get PKPush notifications working correctly. didUpdate is getting called and the server is sending a push to the correct token but the server is getting this error:
An error response packet was received from the APNS server: APNS: [1] Invalid token.
func voipRegistration() {
let voipRegistry: PKPushRegistry = PKPushRegistry(queue: DispatchQueue.main)
voipRegistry.delegate = self
voipRegistry.desiredPushTypes = [PKPushType.voIP]
}
func pushRegistry(_ registry: PKPushRegistry, didInvalidatePushTokenFor type: PKPushType) {
//
}
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType) {
//
}
func pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) {
NSLog("Device token \(deviceTokenString)")
}
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: #escaping () -> Void) {
//
}
I have the following background modes set:
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
<string>voip</string>
<string>fetch</string>
<string>remote-notification</string>
</array>
And I am pointing to my development certificate while the server is pointing to the sandbox. What am I doing wrong?
After upgrading my app to Xcode8/Swift 3, I no longer receive callbacks from the PKPushRegistryDelegate.
I have verified all steps in Apple´s Voice Over IP (VoIP) Best Practices.
My device logs the following that might be related:
callservicesd[92] : [WARN] Ignoring voipRegister request because either no bundleIdentifier could be determined (0) or no environment could be determined (1)
My AppDelegate:
var voipRegistry: PKPushRegistry!
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
voipRegistry = PKPushRegistry(queue: DispatchQueue.main)
voipRegistry.delegate = self
voipRegistry.desiredPushTypes = Set([.voIP])
}
extension AppDelegate: PKPushRegistryDelegate {
func pushRegistry(_ registry: PKPushRegistry, didInvalidatePushTokenForType type: PKPushType) {
print("didInvalidatePushTokenForType")
}
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, forType type: PKPushType) {
print("Incoming voip notfication: \(payload.dictionaryPayload)")
}
func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, forType type: PKPushType) {
print("voip token: \(credentials.token)")
}
}
I figured I had to enable "Push Notifications" under my target´s Capabilities: