Я использую iOS 14 и хочу включить блокировку и идентификацию вызовов в своем приложении при нажатии кнопки. Для этой цели я использую приведенный ниже код
import SwiftUI
import CallKit
struct ContentView: View {
var body: some View {
VStack {
Button(action: openCallerIDSettings) {
Text("Open Caller ID Settings")
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(8)
}
}
}
private func openCallerIDSettings() {
CXCallDirectoryManager.sharedInstance.openSettings { err in
print(";;;",err as Any)
}
}
}
Но это только открытие основных настроек телефона. Я хочу открыть блокировку и идентификацию вызовов, я уже пробовал разные методы, например, метод App-prefs.
private func openCallerIDSettings() {
if let url = URL(string: "App-prefs:Phone&path=CLASSIFICATION_AND_REPORTING") {
if UIApplication.shared.canOpenURL(url) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
}
}
но не смог найти точную строку для блокировки и идентификации вызовов
Функция openSettings
, которая есть в вашем первом блоке кода, является официальным методом открытия настроек блокировки вызовов.
URL-адреса предпочтений считаются частными API, и их использование приведет к отклонению во время проверки приложения.
Отмечу, что в документации openSettings указано, что это
Открывает приложение «Настройки iOS» и отображает настройки блокировки и идентификации вызовов.
Однако в ходе тестирования я обнаружил, что страница «Блокировка и идентификация вызовов» открывается только в том случае, если приложение «Настройки» уже находится на странице настроек «Телефон». Если это не так, откроется страница настроек телефона.
Я заметил, что TrueCaller, похоже, переходит на страницу настроек телефона, а затем на «Блокировку и идентификацию вызовов». Возможно, они рискуют использовать приватное API.
Похоже, это ошибка или, по крайней мере, вариация задокументированного поведения.
Вы можете сообщить об инциденте в службу технической поддержки или зарегистрировать ошибку в Apple, поскольку кажется, что эта функция не работает так, как описано в документации.
Если вы можете воспроизвести это поведение в бета-версии iOS 18, вы также можете записать отзывы о бета-версии. По моему опыту, процесс бета-тестирования — это хорошая возможность решить проблемы.
Между тем, вы можете рассмотреть возможность предоставления пользователю инструкций перейти к «блокировке и идентификации вызовов» перед открытием экрана настроек.
Этот список охватывает глубокие ссылки большинства страниц в настройках: github.com/phynet/iOS-URL-Schemes, но страница идентификации звонков там еще не указана.
Я проверил приложение True Caller в AppStore, они уже это делают. До iOS 11 App-prefs:Phone&path=CallerID был способом добиться этого, но сейчас он не работает.
Я проверил TrueCaller и другое приложение, и они оба открывают настройки телефона, а не настройки блокировки вызовов и идентификации. Если вы уже находитесь в настройках блокировки вызовов, а затем вернетесь в свое приложение и используете openSettings
, то настройки снова откроются уже на странице настроек блокировки вызовов. Любой другой метод, кроме openSettings
, подвергает ваше приложение риску отклонения.
Я сомневаюсь, что этот ответ верен. Некоторые приложения могут реализовать эту функцию. Для этого перейдите непосредственно на страницу «Блокировка и идентификация вызовов» в настройках. Одно из приложений называется JIMA Caller ID (на китайском языке).