3

I start callkit call with this code:

private func startCallKitCall(call: Call, completion: @escaping (Bool) -> ()){

    let handle              = CXHandle(type: .phoneNumber, value: call.handle)
    let startCallAction     = CXStartCallAction(call: call.uuid, handle: handle)
    startCallAction.isVideo = call.hasVideo
    startCallAction.contactIdentifier = call.uuid.uuidString
    let transaction         = CXTransaction(action: startCallAction)

    requestCallKitTransaction(transaction, completionHandler: { success in
        completion(success)
    })

}

in contactIdentifier I set the user UUID, then in provider, update the caller remote name:

public func provider(_ provider: CXProvider, perform action: CXStartCallAction) {

    let update = CXCallUpdate()
    update.remoteHandle = action.handle
    update.hasVideo = action.isVideo
    update.localizedCallerName = "TestCallName"
    self.provider!.reportCall(with: action.callUUID, updated: update)

    action.fulfill()

}

I use "TestCallName" as localizedCallerName, now on recent call of my phone, I see a row named "TestCallName", If I click it, I call this method on appdelegate:

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {


    if (userActivity.activityType == "INStartAudioCallIntent"){

        guard let interaction = userActivity.interaction else {
            return false
        }

        var personHandle: INPersonHandle?

        if let startVideoCallIntent = interaction.intent as? INStartVideoCallIntent {
            personHandle = startVideoCallIntent.contacts?[0].personHandle
        } else if let startAudioCallIntent = interaction.intent as? INStartAudioCallIntent {
            personHandle = startAudioCallIntent.contacts?[0].personHandle
            print(startAudioCallIntent.contacts?[0])
        }
        print(personHandle!.value)

    } else if (userActivity.activityType == "INStartVideoCallIntent"){

    } else {
        print("called userActivity: \(userActivity.activityType), but not yet supported.")
    }

    return true
}

but the output I obtain is:

Optional(<INPerson: 0x1742a5280> {
contactIdentifier = "<null>";
customIdentifier = "<null>";
displayName = "<null>";
image = "<null>";
nameComponents = "<null>";
personHandle = "<INPersonHandle: 0x17402f0c0> {\n    label = \"<null>\";\n    type = PhoneNumber;\n    value = \"TestCallName\";\n}";
relationship = "<null>";
siriMatches = "<null>";
})
 Optional("TestCallName")

i see only the name "TestCallName", but contact identifier is "null", how can I fix this? I see there is also a field name "customIdentifier", can I use this?

thanks!

Luca Becchetti
  • 1,210
  • 1
  • 12
  • 28

1 Answers1

0

The contactIdentifier is the ID of the contact in contacts app. The one you set into startCallAction.contactIdentifier means nothing. To call a user you need to use either phone or email or at least name.

Alexander Volkov
  • 7,904
  • 1
  • 47
  • 44