फोन नंबर को स्विफ्ट में कॉल करना


89

मैं विशिष्ट संख्याओं का उपयोग न करके एक नंबर पर कॉल करने का प्रयास कर रहा हूं, लेकिन एक संख्या जिसे चर में बुलाया जा रहा है या कम से कम इसे अपने फोन में संख्या खींचने के लिए कहें। यह संख्या जिसे एक चर में कहा जा रहा है वह संख्या है जिसे मैंने पार्सर का उपयोग करके या वेबसाइट एसक्यूएल से हथियाने के द्वारा प्राप्त किया है। मैंने एक फ़ंक्शन के साथ चर में संग्रहीत फोन नंबर को कॉल करने की कोशिश की, लेकिन कोई फायदा नहीं हुआ। कुछ भी मदद मिलेगी धन्यवाद!

    func callSellerPressed (sender: UIButton!){
 //(This is calls a specific number)UIApplication.sharedApplication().openURL(NSURL(string: "tel://######")!)

 // This is the code I'm using but its not working      
 UIApplication.sharedApplication().openURL(NSURL(scheme: NSString(), host: "tel://", path: busPhone)!)

        }

जवाबों:


191

कोशिश करो:

if let url = NSURL(string: "tel://\(busPhone)") where UIApplication.sharedApplication().canOpenURL(url) {
  UIApplication.sharedApplication().openURL(url)
}

यह मानते हुए कि फोन नंबर अंदर है busPhone

NSURL'एस init(string:)रिटर्न एक वैकल्पिक, इसलिए का उपयोग करके if letहम सुनिश्चित करें कि urlहै एक NSURL(और नहीं एक NSURL?द्वारा लौटाए गए के रूप में init)।


स्विफ्ट 3 के लिए:

if let url = URL(string: "tel://\(busPhone)"), UIApplication.shared.canOpenURL(url) {
    if #available(iOS 10, *) {
        UIApplication.shared.open(url)
    } else {
        UIApplication.shared.openURL(url)
    }
}

हमें यह जाँचने की आवश्यकता है कि हम iOS 10 पर हैं या बाद में क्योंकि:

आईओएस 10.0 में 'ओपनुरल' को अपदस्थ किया गया था


यह मुझे अनसुलझे पहचानकर्ता 'url' की त्रुटि दे रहा है - .openURL (url) की ओर इशारा करते हुए मदद के लिए धन्यवाद!
थॉमस मार्टिनेज

nvm मैं सिर्फ एक पत्र गायब था। ठीक है जब मैं बटन धक्का कुछ नहीं होता है। यहाँ अधिक जानकारी है ---------- func parserDidEndDocument (पार्सर: NSXMLParser!) {Println (busPhone) drawUpdatedView ()}
थॉमस मार्टिनेज

1
क्या आप इसे फोन पर टेस्ट कर रहे हैं? मुझे शक है कि एक tel खोलने पर: // URL केवल एक वास्तविक iPhone पर काम करेगा, न कि सिम्युलेटर में और न ही iPod या iPad पर।
थॉमस म्यूलर

हाँ, मैं इसे एक iphone 4s पर बटन क्लिक कर रहा हूं, लेकिन यह मेरे फोन पर एक sql सर्वर से बसपोन द्वारा कहे गए नंबर को खींचता है। जब मैं टेल का उपयोग करता हूं: // एक फोन नंबर के साथ यह डायल करता है।
थॉमस मार्टिनेज 16

2
ठीक है, मुझे लगता है कि मुझे पता है कि समस्या क्या है लेकिन इसे ठीक करने का तरीका नहीं जानते। URL से जो संख्या खींची जा रही है, वह ठीक इस तरह लिखी गई है जैसे कि 123 456-7890 और यह 1234567890 की तरह नहीं है। मैं URL को पढ़ने के लिए tel: // का अनुवाद कैसे करता हूं कि यह किस रूप में पहचाना जाएगा?
थॉमस मार्टिनेज

66

आईओएस 10, स्विफ्ट 3 में एक आत्म निहित समाधान :

private func callNumber(phoneNumber:String) {

  if let phoneCallURL = URL(string: "tel://\(phoneNumber)") {

    let application:UIApplication = UIApplication.shared
    if (application.canOpenURL(phoneCallURL)) {
        application.open(phoneCallURL, options: [:], completionHandler: nil)
    }
  }
}

आपको callNumber("7178881234")कॉल करने के लिए उपयोग करने में सक्षम होना चाहिए ।


यह नीचे के रूप में त्रुटि देगा; स्विफ्ट 3 के लिए "इस ऐप को स्कीम टेल के लिए क्वेरी करने की अनुमति नहीं है" और क्या यह सिम्युलेटर पर काम करता है या नहीं?
किरण जाधव

1
सिम्युलेटर में वह कोड काम नहीं करेगा। यदि आप इसे जांचना चाहते हैं तो एक उपकरण का उपयोग करें।
रामकृष्ण

24

स्विफ्ट 4,

private func callNumber(phoneNumber:String) {

    if let phoneCallURL = URL(string: "telprompt://\(phoneNumber)") {

        let application:UIApplication = UIApplication.shared
        if (application.canOpenURL(phoneCallURL)) {
            if #available(iOS 10.0, *) {
                application.open(phoneCallURL, options: [:], completionHandler: nil)
            } else {
                // Fallback on earlier versions
                 application.openURL(phoneCallURL as URL)

            }
        }
    }
}

13

स्विफ्ट 3.0 और आईओएस 10 या उससे अधिक पुराना है

func phone(phoneNum: String) {
    if let url = URL(string: "tel://\(phoneNum)") {
        if #available(iOS 10, *) {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        } else {
            UIApplication.shared.openURL(url as URL)
        }
    }
}

9

ठीक है मुझे मदद मिली और इसका पता लगा लिया। इसके अलावा मैं सिर्फ फोन नंबर मान्य नहीं होने की स्थिति में एक अच्छा सा अलर्ट सिस्टम लगाता हूं। मेरा मुद्दा यह था कि मैं इसे सही कह रहा था लेकिन संख्या में रिक्त स्थान और अवांछित चरित्र थे जैसे ("123 456-7890")। UIApplication केवल तभी काम करता है या स्वीकार करता है यदि आपका नंबर ("1234567890") है। तो आप मूल रूप से केवल संख्याओं को खींचने के लिए एक नया चर बनाकर अंतरिक्ष और अमान्य वर्णों को हटा देते हैं। फिर उन नंबरों को UIApplication के साथ कॉल करता है।

func callSellerPressed (sender: UIButton!){
        var newPhone = ""

        for (var i = 0; i < countElements(busPhone); i++){

            var current:Int = i
            switch (busPhone[i]){
                case "0","1","2","3","4","5","6","7","8","9" : newPhone = newPhone + String(busPhone[i])
                default : println("Removed invalid character.")
            }
        }

        if  (busPhone.utf16Count > 1){

        UIApplication.sharedApplication().openURL(NSURL(string: "tel://" + newPhone)!)
        }
        else{
            let alert = UIAlertView()
            alert.title = "Sorry!"
            alert.message = "Phone number is not available for this business"
            alert.addButtonWithTitle("Ok")
                alert.show()
        }
        }

6
आपको मेरे विचार से '+' संकेत भी देना चाहिए।
फ्लोरिअन

1
साथ ही # अनुरोध करने के समय उपयोग किए जाने वाले पात्र में से एक है :)
iOSDev

9

उपरोक्त उत्तर आंशिक रूप से सही हैं, लेकिन "tel: //" के साथ केवल एक ही समस्या है। कॉल समाप्त होने के बाद, यह हमारे ऐप पर नहीं, होमस्क्रीन पर वापस आ जाएगा। "टेलप्रोम्प्ट: //" का उपयोग करने के लिए बेहतर है, यह ऐप पर वापस आ जाएगा।

var url:NSURL = NSURL(string: "telprompt://1234567891")!
UIApplication.sharedApplication().openURL(url)

जाहिरा तौर पर यह आपके ऐप को अस्वीकार कर दिया जाएगा
टॉम नेपेन

8

स्विफ्ट 3, आईओएस 10

func call(phoneNumber:String) {
        let cleanPhoneNumber = phoneNumber.components(separatedBy: CharacterSet.decimalDigits.inverted).joined(separator: "")
        let urlString:String = "tel://\(cleanPhoneNumber)"
        if let phoneCallURL = URL(string: urlString) {
            if (UIApplication.shared.canOpenURL(phoneCallURL)) {
                UIApplication.shared.open(phoneCallURL, options: [:], completionHandler: nil)
            }
        }
  }

options: [:], completionHandler: nilडिफ़ॉल्ट तर्क हैं, आप उन्हें छोड़ सकते हैं।
टिम वर्म्यूलेन

7

मैं अपने आवेदन में इस पद्धति का उपयोग कर रहा हूं और यह ठीक काम कर रहा है। मुझे उम्मीद है कि यह आपकी भी मदद कर सकता है।

func makeCall(phone: String) {
    let formatedNumber = phone.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet).joinWithSeparator("")
    let phoneUrl = "tel://\(formatedNumber)"
    let url:NSURL = NSURL(string: phoneUrl)!
    UIApplication.sharedApplication().openURL(url)
}

6

स्विफ्ट 5: आईओएस> = 10.0

केवल भौतिक उपकरण पर काम करता है।

private func callNumber(phoneNumber: String) {
    guard let url = URL(string: "telprompt://\(phoneNumber)"),
        UIApplication.shared.canOpenURL(url) else {
        return
    }
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}

नीचे कोई व्यक्ति कहता है कि यदि आप "टेल" के बजाय "टेलप्रोमप्ट" का उपयोग करते हैं, तो आपका ऐप अस्वीकार कर दिया जाएगा।
एंडी वाइंस्टीन

@AndyWeinstein हाँ शायद अगर वे इसे पकड़ है, लेकिन वे मेरा किसी भी अस्वीकार नहीं किया
grantespo

4

स्विफ्ट 3 में,

if let url = URL(string:"tel://\(phoneNumber)"), UIApplication.shared.canOpenURL(url) {
     UIApplication.shared.openURL(url)
}

4

मैं संख्या सत्यापन के साथ स्विफ्ट 3 समाधान का उपयोग कर रहा हूं

var validPhoneNumber = ""
    phoneNumber.characters.forEach {(character) in
        switch character {
        case "0"..."9":
            validPhoneNumber.characters.append(character)
        default:
            break
        }
    }

    if UIApplication.shared.canOpenURL(URL(string: "tel://\(validNumber)")!){
        UIApplication.shared.openURL(URL(string: "tel://\(validNumber)")!)
    }

3

यह स्विफ्ट 2.0 नोट का उपयोग करते हुए @ टॉम के जवाब के लिए एक अपडेट है - यह पूरी कॉलकॉमर क्लास है जिसका मैं उपयोग कर रहा हूं।

class CallComposer: NSObject {

var editedPhoneNumber = ""

func call(phoneNumber: String) -> Bool {

    if phoneNumber != "" {

        for i in number.characters {

            switch (i){
                case "0","1","2","3","4","5","6","7","8","9" : editedPhoneNumber = editedPhoneNumber + String(i)
                default : print("Removed invalid character.")
            }
        }

    let phone = "tel://" + editedPhoneNumber
        let url = NSURL(string: phone)
        if let url = url {
            UIApplication.sharedApplication().openURL(url)
        } else {
            print("There was an error")
        }
    } else {
        return false
    }

    return true
 }
}

2

OpenURL () iOS 10 में हटा दिया गया है। यहां नया सिंटैक्स है:

if let url = URL(string: "tel://\(busPhone)") {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}

1
इसकी कमी नहीं हुई। सिंटैक्स में परिवर्तन इसलिए है क्योंकि आप स्विफ्ट 3 का उपयोग कर रहे हैं
हम्मदज़फर

@ हैमदज़फ़र, ओपनुरल (url) विधि वास्तव में पदावनत है। यह के नए संस्करण अलग हस्ताक्षर है और यह भी खोलने के लिए नाम दिया गया है (यूआरएल: विकल्प: completionHandler)
नकल

क्योंकि स्विफ्ट 2.3 जल्द ही ह्रास होने जा रहा है
हम्मदज़फर

2

स्विफ्ट 5 के लिए कई अन्य जवाब काम नहीं करते हैं। नीचे 5 स्विफ्ट के लिए कोड अपडेट है:

let formattedNumber = phoneNumberVariable.components(separatedBy: NSCharacterSet.decimalDigits.inverted).joined(separator: "")

if let url = NSURL(string: ("tel:" + (formattedNumber)!)) {
    if #available(iOS 10.0, *) {
        UIApplication.shared.open(url as URL, options: [:], completionHandler: nil)
    } else {
        UIApplication.shared.openURL(url as URL)
    }
}

पुनश्च:

  1. अधिकांश उत्तरों के साथ, मैं डिवाइस पर संकेत प्राप्त करने में सक्षम नहीं था। उपरोक्त कोड शीघ्रता से प्रदर्शित करने में सक्षम था।
  2. टेल के बाद कोई // नहीं है : जैसे अधिकांश उत्तर हैं। और यह ठीक काम करता है।

1

स्विफ्ट 3.0 समाधान:

let formatedNumber = phone.components(separatedBy: NSCharacterSet.decimalDigits.inverted).joined(separator: "")
print("calling \(formatedNumber)")
let phoneUrl = "tel://\(formatedNumber)"
let url:URL = URL(string: phoneUrl)!
UIApplication.shared.openURL(url)

यह
Amr Angry

1

यहां एक फोन नंबर को कम करने के लिए एक वैकल्पिक तरीका है Scanner

let number = "+123 456-7890"

let scanner = Scanner(string: number)

let validCharacters = CharacterSet.decimalDigits
let startCharacters = validCharacters.union(CharacterSet(charactersIn: "+#"))

var digits: NSString?
var validNumber = ""
while !scanner.isAtEnd {
    if scanner.scanLocation == 0 {
        scanner.scanCharacters(from: startCharacters, into: &digits)
    } else {
        scanner.scanCharacters(from: validCharacters, into: &digits)
    }

    scanner.scanUpToCharacters(from: validCharacters, into: nil)
    if let digits = digits as? String {
        validNumber.append(digits)
    }
}

print(validNumber)

// +1234567890

1

स्विफ्ट 3.0 के लिए

if let url = URL(string: "tel://\(number)"), UIApplication.shared.canOpenURL(url) {
    if #available(iOS 10, *) {
        UIApplication.shared.open(url)
    } else {
        UIApplication.shared.openURL(url)
    }
}
else {
    print("Your device doesn't support this feature.")
}

1

स्विफ्ट 4.2 और इसके बाद के संस्करण के लिए

if let phoneCallURL = URL(string: "tel://\(01234567)"), UIApplication.shared.canOpenURL(phoneCallURL)
{
    UIApplication.shared.open(phoneCallURL, options: [:], completionHandler: nil)
}

1
let formatedNumber = phone.components(separatedBy: NSCharacterSet.decimalDigits.inverted).joined(separator: "")
print("calling \(formatedNumber)")
let phoneUrl = "tel://\(formatedNumber)"
let url:URL = URL(string: phoneUrl)!
UIApplication.shared.openURL(url)

2
हालांकि यह कोड स्निपेट प्रश्न को हल कर सकता है, जिसमें स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और वे लोग आपके कोड सुझाव के कारणों को नहीं जान सकते हैं। कृपया अपने कोड को व्याख्यात्मक टिप्पणियों के साथ भीड़ देने की कोशिश न करें, इससे कोड और स्पष्टीकरण दोनों की पठनीयता कम हो जाती है!
रोहन खूद


0

स्विफ्ट 3.1 और पीछे के संगत दृष्टिकोण के लिए, यह करें:

@IBAction func phoneNumberButtonTouched(_ sender: Any) {
  if let number = place?.phoneNumber {
    makeCall(phoneNumber: number)
  }
}

func makeCall(phoneNumber: String) {
   let formattedNumber = phoneNumber.components(separatedBy: 
   NSCharacterSet.decimalDigits.inverted).joined(separator: "")

   let phoneUrl = "tel://\(formattedNumber)"
   let url:NSURL = NSURL(string: phoneUrl)!

   if #available(iOS 10, *) {
      UIApplication.shared.open(url as URL, options: [:], completionHandler: 
      nil)
   } else {
     UIApplication.shared.openURL(url as URL)
   }
}

0

यदि आपके फ़ोन नंबर में रिक्त स्थान हैं, तो उन्हें पहले हटा दें! फिर आप स्वीकृत उत्तर के समाधान का उपयोग कर सकते हैं।

let numbersOnly = busPhone.replacingOccurrences(of: " ", with: "")

if let url = URL(string: "tel://\(numbersOnly)"), UIApplication.shared.canOpenURL(url) {
    if #available(iOS 10, *) {
        UIApplication.shared.open(url)
    } else {
        UIApplication.shared.openURL(url)
    }
}

इस प्रश्न में अब 17 उत्तर हैं और यह 3 साल से अधिक पुराना है। आपने अभी तक एक और उत्तर जोड़ना क्यों आवश्यक समझा?
फोगमिस्टर

1
क्योंकि मुझे समझ नहीं आया कि अगर फोन नंबर में स्पेस है तो यह काम क्यों नहीं करता। इतना नकारात्मक मत बनो, मिस्टर मिस्टर!
मोतिया

निश्चित रूप से समझते हैं कि। इसलिए संख्याओं में रिक्त स्थान के बारे में स्पष्ट रूप से एक नया प्रश्न जोड़ें और अपना उत्तर उसमें जोड़ें। प्रश्न पूछने और स्वयं इसका उत्तर देने में कुछ भी गलत नहीं है। (हालांकि, मुझे पूरा यकीन है कि प्रश्न को एक डुप्लिकेट के रूप में बंद कर दिया जाएगा)।
फोगमिस्टर

1
नहीं, यहां लोगों को यह बताना महत्वपूर्ण है कि यूआरएल क्यों नहीं खोला गया: क्योंकि यह शून्य है, क्योंकि फोन नंबर में रिक्त स्थान होते हैं। मैं क्या मानता हूं, कि यह एक उत्तर के बजाय एक टिप्पणी होनी चाहिए। लेकिन वहां बहुत सारी टिप्पणियां हैं।
कैटेनोर

क्या रिक्त स्थान का उल्लेख आपकी मदद करता है?
catanore
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.