ios - una - porque no puedo hacer conferencia de llamadas
¿Cómo hacer una llamada telefónica en iOS 10 usando Swift? (6)
Esta pregunta ya tiene una respuesta aquí:
- Llamar a un número de teléfono en 20 respuestas rápidas
Quiero que mi aplicación pueda llamar a un número determinado cuando se hace clic en un botón. Intenté buscarlo en Google, pero hasta ahora no parece tener uno para iOS 10 (donde se ha ido openURL). ¿Alguien puede darme un ejemplo sobre cómo hacerlo? Por ejemplo como:
@IBAction func callPoliceButton(_ sender: UIButton) {
// Call the local Police department
}
Actualizado para Swift 3:
se usa debajo de líneas de código simples, si desea hacer una llamada telefónica:
// definición de función:
func makeAPhoneCall() {
let url: NSURL = URL(string: "TEL://1234567890")! as NSURL
UIApplication.shared.open(url as URL, options: [:], completionHandler: nil)
}
// llamada a la función: [Utilizado en cualquier parte de su código]
self.makeAPhoneCall()
Nota: ejecute la aplicación en un dispositivo real porque no funcionará en el simulador.
Tarea
Hacer una llamada con validación de número de teléfono
Detalles
Probado en:
- Xcode 9.2, Swift 4
- Xcode 10.2 (10E125), Swift 5
Solución
extension String {
func extractAll(type: NSTextCheckingResult.CheckingType) -> [NSTextCheckingResult] {
var result = [NSTextCheckingResult]()
do {
let detector = try NSDataDetector(types: type.rawValue)
result = detector.matches(in: self, range: NSRange(startIndex..., in: self))
} catch { print("ERROR: /(error)") }
return result
}
func to(type: NSTextCheckingResult.CheckingType) -> String? {
let phones = extractAll(type: type).compactMap { $0.phoneNumber }
switch phones.count {
case 0: return nil
case 1: return phones.first
default: print("ERROR: Detected several phone numbers"); return nil
}
}
func onlyDigits() -> String {
let filtredUnicodeScalars = unicodeScalars.filter{CharacterSet.decimalDigits.contains($0)}
return String(String.UnicodeScalarView(filtredUnicodeScalars))
}
func makeAColl() {
guard let number = to(type: .phoneNumber),
let url = URL(string: "tel:///(number.onlyDigits())"),
UIApplication.shared.canOpenURL(url) else { return }
if #available(iOS 10, *) {
UIApplication.shared.open(url)
} else {
UIApplication.shared.openURL(url)
}
}
}
Uso
"+1-(800)-123-4567".makeAColl()
"phone:+1(617)111-22-33!".makeAColl() // Will extract "+1(617)111-22-33" and make a call
let text = "blabla, +1(222)333-44-55, dasdwedsczx acscas 123-89-01"
let phones = text.extractAll(type: .phoneNumber).compactMap { $0.phoneNumber }
print(phones)
Muestra completa
func test() {
isPhone("blabla")
isPhone("+1(222)333-44-55")
isPhone("+42 555.123.4567")
isPhone("+1-(800)-123-4567")
isPhone("+7 555 1234567")
isPhone("+7(926)1234567")
isPhone("(926) 1234567")
isPhone("+79261234567")
isPhone("926 1234567")
isPhone("9261234567")
isPhone("1234567")
isPhone("123-4567")
isPhone("123-89-01")
isPhone("495 1234567")
isPhone("469 123 45 67")
isPhone("8 (926) 1234567")
isPhone("89261234567")
isPhone("926.123.4567")
isPhone("415-555-1234")
isPhone("650-555-2345")
isPhone("(416)555-3456")
isPhone("202 555 4567")
isPhone("4035555678")
isPhone(" 1 416 555 9292")
isPhone("+44 1838 300284")
isPhone("+44 1838 300284, 1 416 555 9292")
}
private func isPhone(_ string: String) {
let result = string.to(type: .phoneNumber) != nil
print("/(result ? "✅" : "❌") /(string) | /(string.onlyDigits()) | /(result ? "[a phone number]" : "[not a phone number]")")
}
Resultado
❌ blabla | | [not a phone number]
✅ +1(222)333-44-55 | 12223334455 | [a phone number]
✅ +42 555.123.4567 | 425551234567 | [a phone number]
✅ +1-(800)-123-4567 | 18001234567 | [a phone number]
✅ +7 555 1234567 | 75551234567 | [a phone number]
✅ +7(926)1234567 | 79261234567 | [a phone number]
✅ (926) 1234567 | 9261234567 | [a phone number]
✅ +79261234567 | 79261234567 | [a phone number]
✅ 926 1234567 | 9261234567 | [a phone number]
✅ 9261234567 | 9261234567 | [a phone number]
✅ 1234567 | 1234567 | [a phone number]
✅ 123-4567 | 1234567 | [a phone number]
✅ 123-89-01 | 1238901 | [a phone number]
✅ 495 1234567 | 4951234567 | [a phone number]
✅ 469 123 45 67 | 4691234567 | [a phone number]
✅ 8 (926) 1234567 | 89261234567 | [a phone number]
✅ 89261234567 | 89261234567 | [a phone number]
✅ 926.123.4567 | 9261234567 | [a phone number]
✅ 415-555-1234 | 4155551234 | [a phone number]
✅ 650-555-2345 | 6505552345 | [a phone number]
✅ (416)555-3456 | 4165553456 | [a phone number]
✅ 202 555 4567 | 2025554567 | [a phone number]
✅ 4035555678 | 4035555678 | [a phone number]
✅ 1 416 555 9292 | 14165559292 | [a phone number]
✅ +44 1838 300284 | 441838300284 | [a phone number]
ERROR: Detected several phone numbers
❌ +44 1838 300284, 1 416 555 9292 | 44183830028414165559292 | [not a phone number]
["+1(222)333-44-55", "123-89-01"]
En Swift 4.2
func dialNumber(number : String) {
if let url = URL(string: "tel:///(number)"),
UIApplication.shared.canOpenURL(url) {
if #available(iOS 10, *) {
UIApplication.shared.open(url, options: [:], completionHandler:nil)
} else {
UIApplication.shared.openURL(url)
}
} else {
// add error message here
}
}
Llama a esto como a continuación
dialNumber(number: "+921111111222")
Espero que esto ayude.
Por error, mi respuesta se extravió, compruebe esta: Puede usar esto:
guard let url = URL(string: "tel:///(yourNumber)") else {
return //be safe
}
if #available(iOS 10.0, *) {
UIApplication.shared.open(url)
} else {
UIApplication.shared.openURL(url)
}
Necesitamos verificar si estamos en iOS 10 o posterior, ya que ''openURL'' quedó en desuso en iOS 10.0
Puedes llamar así:
if let url = URL(string: "tel:///(number)") {
UIApplication.shared.openURL(url)
}
Para Swift 3+ , puedes usar como
guard let number = URL(string: "tel://" + number) else { return }
UIApplication.shared.open(number)
OR
UIApplication.shared.open(number, options: [:], completionHandler: nil)
Asegúrese de haber borrado la cadena de su número de teléfono para eliminar cualquier instancia de
(
,
)
,
-
o
space
.
if let phoneCallURL:URL = URL(string: "tel:/(strPhoneNumber)") {
let application:UIApplication = UIApplication.shared
if (application.canOpenURL(phoneCallURL)) {
let alertController = UIAlertController(title: "MyApp", message: "Are you sure you want to call /n/(self.strPhoneNumber)?", preferredStyle: .alert)
let yesPressed = UIAlertAction(title: "Yes", style: .default, handler: { (action) in
application.openURL(phoneCallURL)
})
let noPressed = UIAlertAction(title: "No", style: .default, handler: { (action) in
})
alertController.addAction(yesPressed)
alertController.addAction(noPressed)
present(alertController, animated: true, completion: nil)
}
}