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

时间:2016-03-22 07:25:22

标签: ios objective-c swift swift2

我有一些以下的json数据:

这将全部显示在地图视图中。因此当用户按下地图中的任何引脚时。将显示地址,姓名呼叫按钮。

action method我有一个call button ..所以如果有任何用户按我的地图中的任何图钉。它会显示Address, name, one call button ...因此,如果用户按下该呼叫按钮,它会显示我name and address的相应或正确的电话号码,它应显示在普通电话拨号盘中。

我做了一些目标 - c。但我对swift 2.0并不擅长。

任何人都可以帮我解决这个问题。

完整代码:

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)
    }

我尝试过:

@IBAction func CallButtontap(sender:AnyObject){

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

}

它没有工作

最终更新:

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){

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

}

2 个答案:

答案 0 :(得分:2)

以下是您的代码的快速版本:

@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")
    }
}
  

同时标记此有用网站:https://objectivec2swift.com/#/converter/code

答案 1 :(得分:0)

尝试以下快速代码:

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

代码将让您直接致电,并在通话后返回您的应用程序。

谢谢。