简体   繁体   English

当用户在我的应用程序中按联系人号码时,如何获取电话号码并在电话拨号盘中显示该号码

[英]How to get the phone number and show that number in phone dial pad when user press contact number inside my app

i have some following json data : 我有一些以下json数据:

This will all show in map view. 这些都将显示在地图视图中。 So when user press any pins in map. 因此,当用户按下地图上的任何图钉时。 The address, name call button will display. 地址,姓名呼叫按钮将显示。

I have one action method for that call button ..So if any user press any pin in my map. 我有一个用于该call button action method it will show the Address, name, one call button ... So if user press that call button , it show show the respective or correct phone number of my name and address and it should show in normal phone dial pad. 它将显示Address, name, one call button ...因此,如果用户按下该呼叫按钮,它将显示显示我的name and address的相应或正确的电话号码,并且应在常规电话拨号盘中显示。

I did some what in objective - c. 我客观地做了一些事情-c。 But i am not good in swift 2.0. 但是我对Swift 2.0并不满意。

Can any one help me out how to do that. 谁能帮我解决这个问题。

Full code: 完整代码:

import UIKit
import MapKit
import CoreLocation

class mapVC: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate {

    @IBOutlet weak var mapView: MKMapView!

    @IBOutlet weak var AddressTitleLabel: UILabel!

    @IBOutlet weak var AddressSubtitleLabel: UILabel!

    @IBOutlet weak var LocationView: UIView!

    @IBOutlet weak var ResultCounts: UILabel!

    @IBOutlet weak var AddressImg: UIImageView!

    let locationManager = CLLocationManager()


    override func viewDidLoad() {
        super.viewDidLoad()
        locationManager.requestWhenInUseAuthorization()
        locationManager.startUpdatingLocation()

        mapSearch()

        LocationView.hidden = true
        locationManager.delegate = self

        locationManager.desiredAccuracy = kCLLocationAccuracyBest


        mapView.delegate = self


    }

    func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) {

        print("Inside selecting annotation")

       LocationView.hidden = false

        if let newTitle = view.annotation?.title, let newAddress = view.annotation?.subtitle, let AddressNewImage = view.detailCalloutAccessoryView {

            AddressTitleLabel.text = newTitle

            AddressSubtitleLabel.text = newAddress

            //setting callout accessory as image to UIImage
            UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0);

            AddressNewImage.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)

            let NAimage:UIImage = UIGraphicsGetImageFromCurrentImageContext();

            AddressImg.image = NAimage

        }

    }

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let location : CLLocationCoordinate2D = manager.location!.coordinate;
        let long = location.longitude;
        let lat = location.latitude;
        CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)->Void in
            if (error != nil) {
                print("Reverse geocoder failed with error" + error!.localizedDescription)
                return
            }
        })

        let loadlocation = CLLocationCoordinate2D(
            latitude: lat, longitude: long

        )

        mapView.centerCoordinate = loadlocation;

        let span = MKCoordinateSpanMake(0.2, 0.2)
        let region = MKCoordinateRegion(center: loadlocation, span: span)


        mapView.setRegion(region, animated: true)

        let annotation = MKPointAnnotation()
        annotation.coordinate = loadlocation
        annotation.title = "Current Location"
        annotation.subtitle = "You are Here."

        mapView.addAnnotation(annotation)

        locationManager.stopUpdatingLocation();
    }

    func mapSearch(){

        //Map search for Level Income in the selected region area
        let url:NSURL = NSURL(string: "url")!
        let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data:NSData?, response: NSURLResponse?, error:NSError?) -> Void in

            do {
                let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSArray



                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    self.ResultCounts.text = "\(json.count) Results"

                    // Loop through all items and display them on the map

                    var lon:Double!

                    var lat:Double!

                    var annotationView:MKPinAnnotationView!

                    var pointAnnoation:LocationClass!

                    //2
                    for item in json{

                        let obj = item as! Dictionary<String,AnyObject>

                        lon = obj["longitude"]!.doubleValue

                        lat = obj["latitude"]!.doubleValue

                        pointAnnoation = LocationClass()

                        pointAnnoation.coordinate = CLLocationCoordinate2D(latitude: lat, longitude: lon)

                        pointAnnoation.title = obj["name"] as? String

                        pointAnnoation.subtitle = obj["address"] as? String

                        pointAnnoation.pinCustomImageName = "other_location.png"

                        let ImageName = obj["image"] as? String

                        let imgURL: NSURL = NSURL(string: ImageName!)!

                        let request: NSURLRequest = NSURLRequest(URL: imgURL)

                        let session = NSURLSession.sharedSession()

                        let Imgtask = session.dataTaskWithRequest(request){
                                (data, response, error) -> Void in

                                if (error == nil && data != nil)
                                {
                                    func display_image()
                                    {
                                        pointAnnoation.DisplayImage = UIImage(data: data!)
                                    }

                                    dispatch_async(dispatch_get_main_queue(), display_image)
                                }

                            }

                            Imgtask.resume()

                        annotationView = MKPinAnnotationView(annotation: pointAnnoation, reuseIdentifier: "pin")

                        self.mapView.addAnnotation(annotationView.annotation!)

                    }

                })

            }catch{
                print("Some error occured")
            }



        }

        // Call the resume() method to start the NSURLSession task
        task.resume()
    }

    func mapView(mapView: MKMapView,
        viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView?{

            let reuseIdentifier = "pin"

            var v = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseIdentifier)
            if v == nil {
                v = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseIdentifier)
                v!.canShowCallout = false
            }
            else {
                v!.annotation = annotation
            }

            let customPointAnnotation = annotation as! LocationClass

            v!.image = UIImage(named:customPointAnnotation.pinCustomImageName)

            v!.detailCalloutAccessoryView = UIImageView(image: customPointAnnotation.DisplayImage)

            return v
    }



    @IBAction func CallButtontap(sender: AnyObject) {

        let phoneUrl: NSURL = NSURL(string: "telprompt:\(item[index]["phone"])")!
        if UIApplication.sharedApplication().canOpenURL(phoneUrl) {
            UIApplication.sharedApplication().openURL(phoneUrl)
        }
    }


    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
        print("Error while updating location " + error.localizedDescription)
    }

In that i tried : 在那我尝试了:

@IBAction func CallButtontap(sender: AnyObject) { @IBAction func CallButtontap(sender:AnyObject){

let phoneUrl: NSURL = NSURL(string: "telprompt:\(item[index]["phone"])")!
if UIApplication.sharedApplication().canOpenURL(phoneUrl) {
    UIApplication.sharedApplication().openURL(phoneUrl)
}

} }

It din't work 没用

Final updated: 最终更新:

func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) {

        print("Inside selecting annotation")

       LocationView.hidden = false

        if let newTitle = view.annotation?.title, let newAddress = view.annotation?.subtitle, let AddressNewImage = view.detailCalloutAccessoryView {

            AddressTitleLabel.text = newTitle

            AddressSubtitleLabel.text = newAddress

            //setting callout accessory as image to UIImage
            UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0);

            AddressNewImage.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)

            let NAimage:UIImage = UIGraphicsGetImageFromCurrentImageContext();

            AddressImg.image = NAimage
            if (view.annotation is Annotation.self) {
                var annot: Annotation = view.annotation
                var index: Int = self.arrayOfAnnotations.indexOfObject(annot)
                CallButtontap(index)
            }

        }


    }

@IBAction func CallButtontap(sender: AnyObject) { @IBAction func CallButtontap(sender:AnyObject){

let phoneUrl: NSURL = NSURL(string: "telprompt:\(item[sender]["phone"])")!
if UIApplication.sharedApplication().canOpenURL(phoneUrl) {
    UIApplication.sharedApplication().openURL(phoneUrl)
}

} }

Here is the swift version of your code: 这是您的代码的快速版本:

@IBAction func didTapPhoneButton(sender: UIButton) {
    // This function  will make phone call 
    let phoneUrl: NSURL = NSURL(string: "telprompt:\(myJson[index]["phone"])")!
    if UIApplication.sharedApplication().canOpenURL(phoneUrl) {
        UIApplication.sharedApplication().openURL(phoneUrl)
    } else {
        PCUtilities.showAlertWithTitle("Alert", message: "Call facility is not available!!!", cancelButtonTitle: "OK")
    }
}

Also mark this useful website: https://objectivec2swift.com/#/converter/code 还要标记此有用的网站: https : //objectivec2swift.com/#/converter/code

Try following swift code : 尝试以下快速代码:

@IBAction func btn_callTapped(sender: AnyObject) {
        let number = "1234567890" //set user number here.
        let phoneNumber: String = "telprompt://" + number
        UIApplication.sharedApplication().openURL(NSURL(string: phoneNumber)!)
}

The code will hep you to call directly as well get back in your app after call. 该代码将使您直接致电,也可以在致电后返回您的应用。

Thank you. 谢谢。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM