Получить номер телефона звонящего при входящем звонке на iPhone
Я пытаюсь получить идентификатор звонящего (номер телефона) во время входящего звонка. TrueCaller реализовал это, и они получают номер телефона входящего абонента.
Я нашел эту информацию: 1. CoreTelephony Framework(он предоставляет только состояния вызова) 2. Обновление Apple 9.0: "Возможно" синхронизация контактов. с почтовым приложением и определяет входящий номер телефона.
2 ответа
###РЕДАКТИРОВАТЬ###
iOS 10 и выше:
Используйте Callkit, посмотрите на расширение каталога вызовов
Согласно документации,
Выявление входящих абонентов
Когда телефон получает входящий вызов, система сначала консультируется с контактами пользователя, чтобы найти соответствующий номер телефона. Если совпадений не найдено, система затем обращается к расширению каталога вызовов вашего приложения, чтобы найти подходящую запись для идентификации номера телефона. Это полезно для приложений, которые поддерживают список контактов для пользователя, который отделен от системных контактов, таких как социальная сеть, или для идентификации входящих вызовов, которые могут быть инициированы из приложения, например, для поддержки клиентов или уведомления о доставке.,
Например, рассмотрим пользователя, который дружит с Джейн в приложении для социальных сетей, но не имеет своего номера телефона в контактах. Приложение социальной сети имеет расширение каталога вызовов, которое загружает и добавляет номера телефонов всех друзей пользователя. Из-за этого, когда пользователь получает входящий звонок от Джейн, система отображает что-то вроде "(Имя приложения) Caller ID: Jane Appleseed", а не "Unknown Caller".
Чтобы предоставить идентифицирующую информацию о входящих звонках, вы используете метод addIdentificationEntry(withNextSequentialPhoneNumber:label:) в реализации beginRequest(с:).
class CustomCallDirectoryProvider: CXCallDirectoryProvider {
override func beginRequest(with context: CXCallDirectoryExtensionContext) {
let labelsKeyedByPhoneNumber: [CXCallDirectoryPhoneNumber: String] = [ … ]
for (phoneNumber, label) in labelsKeyedByPhoneNumber.sorted(by: <) {
context.addIdentificationEntry(withNextSequentialPhoneNumber: phoneNumber, label: label)
}
context.completeRequest()
}
}
Поскольку этот метод вызывается только тогда, когда система запускает расширение приложения, а не для каждого отдельного вызова, необходимо указать идентификационную информацию вызова одновременно; вы не можете, например, сделать запрос к веб-службе, чтобы найти информацию о входящем звонке.
iOS 9 и более ранние версии:
Как упоминал Какшил, Caller ID не возможен на не взломанных устройствах.
И я дам вам некоторые выводы о том, как работает настоящий абонент,
Он не читает историю вызовов, они фактически создали расширение Action, где бы вы ни пытались поделиться контактом, оно будет отображать расширение приложения truecaller, которое закодировано для отображения сведений о контакте, полученных с их сервера.
Вы также можете запутаться с push-уведомлением, полученным для нескольких звонков со словами "Некоторые X звонят вам". Это где истинный призывник использовал трюк. Если вы четко заметили, это push-уведомление будет получено только тогда, когда вы получите звонок от пользователя Android с установленным TrueCall. Позвольте мне объяснить вам в деталях,
X (пользователь android с установленным truecaller), вызывающий Y(пользователь ios с установленным truecaller), версия android уведомляет сервер, что X звонит Y. И сервер отправит push-уведомление на iPhone Y.
Идентификатор вызывающего абонента невозможен на не взломанных устройствах.
Однако есть один способ, которым вы можете узнать, какой пользователь звонит, но не уверены, будет ли он вам полезен.
Если у вас есть устройство Bluetooth, подключенное к iPhone, оно будет получать все уведомления, включая входящие звонки, для которых вы можете получить идентификатор звонящего.
Кроме этого, в настоящее время нет другого способа узнать вызываемый идентификатор.