Как получить доступ к идентификатору контакта из callKit

Я запускаю вызов callkit с помощью этого кода:

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)
    })

}

в contactIdentifier я устанавливаю UUID пользователя, затем в провайдере обновляю удаленное имя вызывающего абонента:

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()

}

Я использую «TestCallName» как localizedCallerName, теперь при недавнем вызове моего телефона я вижу строку с именем «TestCallName». Если я нажму на нее, я вызову этот метод в 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
}

но результат, который я получаю:

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")

я вижу только имя "TestCallName", но идентификатор контакта "null", как я могу это исправить? Я вижу, что есть также имя поля «customIdentifier», могу ли я его использовать?

Спасибо!


person Luca Becchetti    schedule 22.11.2017    source источник


Ответы (1)


contactIdentifier — это идентификатор контакта в приложении «Контакты». Тот, который вы установили в startCallAction.contactIdentifier, ничего не значит. Чтобы позвонить пользователю, вам нужно использовать либо телефон, либо электронную почту, либо хотя бы имя.

person Alexander Volkov    schedule 03.06.2020