반응형
스위프트를 사용하여 iOS 10에서 전화를 거는 방법은 무엇입니까?
단추를 클릭하면 앱에서 특정 번호로 전화를 걸 수 있습니다.구글 검색을 해봤지만 아직 iOS 10용은 없는 것 같습니다(열린 곳).URL이 사라졌습니다.누가 어떻게 하는지 예를 들어줄 수 있나요?예를 들어 다음과 같습니다.
@IBAction func callPoliceButton(_ sender: UIButton) {
// Call the local Police department
}
다음과 같이 전화할 수 있습니다.
if let url = URL(string: "tel://\(number)") {
UIApplication.shared.openURL(url)
}
Swift 3+의 경우 다음과 같이 사용할 수 있습니다.
guard let number = URL(string: "tel://" + number) else { return }
UIApplication.shared.open(number)
OR
UIApplication.shared.open(number, options: [:], completionHandler: nil)
전화 번호 문자열을 스크러빙하여 다음 인스턴스를 제거했는지 확인하십시오.(
,)
,-
또는space
.
작업
전화 번호 확인을 통해 전화 걸기
세부 사항
테스트 대상:
- Swift 5.2, Xcode 11.4(11E146)
해결책
// MARK: DataDetector
class DataDetector {
private class func _find(all type: NSTextCheckingResult.CheckingType,
in string: String, iterationClosure: (String) -> Bool) {
guard let detector = try? NSDataDetector(types: type.rawValue) else { return }
let range = NSRange(string.startIndex ..< string.endIndex, in: string)
let matches = detector.matches(in: string, options: [], range: range)
loop: for match in matches {
for i in 0 ..< match.numberOfRanges {
let nsrange = match.range(at: i)
let startIndex = string.index(string.startIndex, offsetBy: nsrange.lowerBound)
let endIndex = string.index(string.startIndex, offsetBy: nsrange.upperBound)
let range = startIndex..<endIndex
guard iterationClosure(String(string[range])) else { break loop }
}
}
}
class func find(all type: NSTextCheckingResult.CheckingType, in string: String) -> [String] {
var results = [String]()
_find(all: type, in: string) {
results.append($0)
return true
}
return results
}
class func first(type: NSTextCheckingResult.CheckingType, in string: String) -> String? {
var result: String?
_find(all: type, in: string) {
result = $0
return false
}
return result
}
}
// MARK: PhoneNumber
struct PhoneNumber {
private(set) var number: String
init?(extractFrom string: String) {
guard let phoneNumber = PhoneNumber.first(in: string) else { return nil }
self = phoneNumber
}
private init (string: String) { self.number = string }
func makeACall() {
guard 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)
}
}
static func extractAll(from string: String) -> [PhoneNumber] {
DataDetector.find(all: .phoneNumber, in: string)
.compactMap { PhoneNumber(string: $0) }
}
static func first(in string: String) -> PhoneNumber? {
guard let phoneNumberString = DataDetector.first(type: .phoneNumber, in: string) else { return nil }
return PhoneNumber(string: phoneNumberString)
}
}
extension PhoneNumber: CustomStringConvertible { var description: String { number } }
// MARK: String extension
extension String {
// MARK: Get remove all characters exept numbers
func onlyDigits() -> String {
let filtredUnicodeScalars = unicodeScalars.filter { CharacterSet.decimalDigits.contains($0) }
return String(String.UnicodeScalarView(filtredUnicodeScalars))
}
var detectedPhoneNumbers: [PhoneNumber] { PhoneNumber.extractAll(from: self) }
var detectedFirstPhoneNumber: PhoneNumber? { PhoneNumber.first(in: self) }
}
사용.
PhoneNumber(extractFrom: "+1-(800)-123-4567")?.makeACall()
PhoneNumber.extractAll(from: "+1-(800)-123-4567 bla bla 1(617)111-22-33").last?.makeACall()
PhoneNumber.first(in: "+1-(800)-123-4567 bla bla 1(617)111-22-33")?.makeACall()
"+1-(800)-123-4567 bla bla 1(617)111-22-33".detectedPhoneNumbers[1].makeACall()
"+1-(800)-123-4567 bla bla 1(617)111-22-33".detectedFirstPhoneNumber?.makeACall()
전체샘플
여기에 솔루션 코드를 붙여넣는 것을 잊지 마십시오.
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("1(617)111-22-33!")
isPhone("+44 1838 300284")
isPhone("+44 1838 300284, 1 416 555 9292")
isPhone("+44 1838 3d0384, 1 416 555 9292!")
}
private func isPhone(_ string: String) {
let phoneNumbers = PhoneNumber.extractAll(from: string)
let result = !phoneNumbers.isEmpty
print("\(result ? "✅" : "❌") \(string) | detected phones: \(phoneNumbers)")
}
결과
❌ blabla | detected phones: []
✅ +1(222)333-44-55 | detected phones: [+1(222)333-44-55]
✅ +42 555.123.4567 | detected phones: [555.123.4567]
✅ +1-(800)-123-4567 | detected phones: [+1-(800)-123-4567]
✅ +7 555 1234567 | detected phones: [+7 555 1234567]
✅ +7(926)1234567 | detected phones: [+7(926)1234567]
✅ (926) 1234567 | detected phones: [(926) 1234567]
✅ +79261234567 | detected phones: [+79261234567]
✅ 926 1234567 | detected phones: [926 1234567]
✅ 9261234567 | detected phones: [9261234567]
✅ 1234567 | detected phones: [1234567]
✅ 123-4567 | detected phones: [123-4567]
✅ 123-89-01 | detected phones: [123-89-01]
✅ 495 1234567 | detected phones: [495 1234567]
✅ 469 123 45 67 | detected phones: [469 123 45 67]
✅ 8 (926) 1234567 | detected phones: [8 (926) 1234567]
✅ 89261234567 | detected phones: [89261234567]
✅ 926.123.4567 | detected phones: [926.123.4567]
✅ 415-555-1234 | detected phones: [415-555-1234]
✅ 650-555-2345 | detected phones: [650-555-2345]
✅ (416)555-3456 | detected phones: [(416)555-3456]
✅ 202 555 4567 | detected phones: [202 555 4567]
✅ 4035555678 | detected phones: [4035555678]
✅ 1 416 555 9292 | detected phones: [1 416 555 9292]
✅ 1(617)111-22-33! | detected phones: [1(617)111-22-33]
✅ +44 1838 300284 | detected phones: [+44 1838 300284]
✅ +44 1838 300284, 1 416 555 9292 | detected phones: [+44 1838 300284, 1 416 555 9292]
✅ +44 1838 3d0384, 1 416 555 9292! | detected phones: [1 416 555 9292]
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
}
}
이것을 아래와 같이 부릅니다.
dialNumber(number: "+921111111222")
도움이 되길 바랍니다.
Swift 3용으로 업데이트됨:
간단한 코드 행 아래에 사용됩니다. 전화를 걸고 싶은 경우:
함수 정의:
func makeAPhoneCall() {
let url: NSURL = URL(string: "TEL://1234567890")! as NSURL
UIApplication.shared.open(url as URL, options: [:], completionHandler: nil)
}
함수 호출: [코드의 모든 위치에서 사용]
self.makeAPhoneCall()
참고: 시뮬레이터에서 작동하지 않으므로 실제 장치에서 앱을 실행하십시오.
실수로 제 답변이 잘못 기재되었습니다. 다음 항목을 확인하십시오.다음을 사용할 수 있습니다.
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)
}
우리는 iOS 10 이후에 'open' 상태인지 확인해야 합니다.'URL'은 iOS 10.0에서 더 이상 사용되지 않습니다.
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)
}
}
언급URL : https://stackoverflow.com/questions/40078370/how-to-make-phone-call-in-ios-10-using-swift
반응형
'programing' 카테고리의 다른 글
drop_certificates가 판다에서 작동하지 않습니까? (0) | 2023.08.18 |
---|---|
Yarn의 로컬 경로로 패키지를 설치하는 방법은 무엇입니까?패키지를 찾을 수 없습니다. (0) | 2023.08.18 |
파이썬 또는 R을 사용하여 엑셀에서 대체 텍스트가 있는 그래프를 PDF로 내보내는 방법은 무엇입니까? (0) | 2023.08.18 |
열 사이의 간격을 어떻게 추가합니까? (0) | 2023.08.18 |
스피너의 가치를 얻는 방법은? (0) | 2023.08.18 |