Phone call using a number in a UITextField - iphone

How can I make a phone call in my app to a number that's been input to a UITextField?

You should be able to call openURL: or openURL:options:completionHandler: with a "tel:" protocol. See the Phone Links section of the protocol reference. In iOS 3.x you will see a prompt though in iOS 2.x it will just dial.

NSString *callTextFiel = [NSString StringWithFormat:#"tel:%#", textField.text];
[[UIApplication SharedApplication] openURL:[NSURL URLWithString:callTextField]];

Related

How to launch another app from an iPhone app

I am working on a map application in my iPhone app.
I have a button go.
When the user clicks this button in this method I want to check if user has installed the waze application on his iphone. If yes then navigate to waze application otherwise open iPhone's default map app.
Try to do this way :
NSString *wazeAppURL = #"waze://";
NSString *mapsAppURL = #"maps://";
BOOL canOpenURL = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:wazeAppURL]];
NSString *url = canOpenURL ? wazeAppURL : mapsAppURL;
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
Here, canOpenURL allows you to test if the Waze app is installed on your iPhone. if iPhone can open the url waze:// it means you already have the app and it will launch it. Otherwise it will launch the default Maps app. Safari won't be called.
To open an app you need to call
BOOL canOpenURL = [[UIApplication sharedApplication]
canOpenURL:[NSURL URLWithString:#"app://"]];
if ( canOpenUrl ) [[UIApplication sharedApplication]
openURL:[NSURL URLWithString:url]];
To find all the url, go to this page: http://handleopenurl.com/
For waze in particular, http://handleopenurl.com/scheme/waze
hope this helps.
Note that on iOS you can also navigate to Google Maps -- and pass along the query string or geopoint. Here's one example of navigating to a specific geopoint:
if (self.mapView.userLocation.location) {
NSString *urlAsString = [NSString stringWithFormat:#"comgooglemaps://?q=%f,%f", self.mapView.userLocation.location.coordinate.latitude, self.mapView.userLocation.location.coordinate.longitude];
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:urlAsString]]) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlAsString]];
}
}
Just a suggestion to enhance the user experience.

Using Dialer for iOS app [duplicate]

I allow my user to select phone numbers in my application. How can I then bring up the iPhone call screen and then if possible, initiate the phone call?
You'll have to recreate the dial screen within your application (didn't take too long for me to do.) Once you have the phone number entered, you'll need to initiate the phone call by doing:
NSString* theNumberYouGathered = #"9994441234";
[[UIApplication sharedApplication] openURL: [NSURL URLWithString: [NSString stringWithFormatting: #"tel:%s", theNumberYouGathered]]];
Note this will only work on the actual phone, and not the simulator.
To create the dialer screen you'll need to:
Create a xib file with a set of UIButtons (for #s 1-9), a UILabel to show the currently entered number, and a "Call" button.
Hook up the presses on the number UIButtons and add the digit to a local variable NSString on your ViewController. Update the UILabel with this number.
When the call UIButton is pressed, take the locally stored # and place the aforementioned method call with it.
You can do this:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:#"tel:12125551212"]];
which will create a UIAlertView prompting the user to call the number or cancel.
You can use below code
NSString *phoneNumber = #"18000275749"; // dynamically assigned
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:#"telprompt://%#",phoneNumber]]];

Make calls from iPhone app [duplicate]

This question already has an answer here:
Closed 10 years ago.
Possible Duplicate:
make a call in iphone from my application
I want to make a phone call on given number from my iPhone application. Could you suggest any good tutorial which explains it the best or tell me the process?
You can try :
NSURL *phoneNumberURL = [NSURL URLWithString:#"tel:80001212"];
[[UIApplication sharedApplication] openURL:phoneNumberURL];
NSString* phoneNumber=TextFiled Name
NSString *number = [NSString stringWithFormat:#"%#",phoneNumber];
NSURL* callUrl=[NSURL URLWithString:[NSString stringWithFormat:#"tel:%#",number]];
//check Call Function available only in iphone
if([[UIApplication sharedApplication] canOpenURL:callUrl])
{
[[UIApplication sharedApplication] openURL:callUrl];
}
else
{
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:#"ALERT" message:#"This function is only available on the iPhone" delegate:nil cancelButtonTitle:#"OK" otherButtonTitles:nil];
[alert show];
[alert release];
}
}
Try this:-
NSString *phoneNumber = #"15555551212";
NSString *dtmfAfterPickup = #"1234";
NSString *telString = [NSString stringWithFormat:#"tel:%#,%#", phoneNumber, dtmfAfterPickup];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:telString]];
Opening an app from within another app is managed in iOS through the "url scheme" mechanism. If an app defines an url scheme, and this scheme is public, you can then use it to run that app.
Basic rule is to first check that your device supports that scheme (e.g. you cannot make a phone call on an iPad because the phone app is not installed) and then, if the answer is positive, call it:
if([[UIApplication sharedApplication] canOpenURL:myURL]) {
[[UIApplication sharedApplication] openURL:myURL];
} else {
// do something else, e.g. inform the user that he/she cannot open the app
}
This check is important as for some schemes, e.g. the phone one, the system checks is the url is well formed or not. E.g.: for phone numbers space between digits is not supported.
The most common Apple URL schemes are described here:
http://developer.apple.com/library/ios/#featuredarticles/iPhoneURLScheme_Reference/Articles/PhoneLinks.html#//apple_ref/doc/uid/TP40007893-SW1
In particular, the telephone url scheme is here:
http://developer.apple.com/library/ios/#featuredarticles/iPhoneURLScheme_Reference/Articles/PhoneLinks.html#//apple_ref/doc/uid/TP40007893-SW1
Finally there is a web site, called handleOpenURL that is trying to collect all apps url schemes. If you define an app that exposes an url scheme and you want it to be public, don't hesitate to post it in this site.
There are two ways to acheive this:-
1) [[UIApplication sharedApplication] openURL:[NSURL URLWithString:#"tel://9912345678"]];
2) You can use the UITextView and enable phone detection. After that the phone number will look like hyperlinked. Use the following code.
mytextview.text = #"9943586256";
mytextview.dataDetectorTypes = UIDataDetectorTypePhoneNumber;
mytextview.editable=NO;
Helpful if you want to show the phone number inside a custom tableview cell.
I would personally like the second one due to requirements in some project. When i have give the telephone number in UITextView and upon pressing that will start the calling.

How to return to my iphone application after call ends?

I am able to call from my iphone application by using below code:
NSString *phoneNumber = #"tel://1234567890";
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNumber]];
Now, i want to know how to return to my application back when the call ends ?
UIWebView *phoneCallWebview = [[UIWebView alloc] init];
// [self.view addSubview:phoneCallWebview];
NSURL *callURL = [NSURL URLWithString:[NSString stringWithFormat:#"tel:%#", 9238928399]];
[phoneCallWebview loadRequest:[NSURLRequest requestWithURL:callURL ]];
As far as I'm aware, such interaction is impossible since your application has been demoted to background, and all UI interaction has been delegated to the Phone app, and the user.
I found this SO question
End call, don't return to app automatic in iphone 3.1 version
Which pointed to an article on apple dev forums
https://devforums.apple.com/message/128046 (dev account required)
Which says it was a change in iOS 3.1 but a "workaround" is
use UIWebView to open the tel: url, after the call, your app will relaunch, but you get the annoying do you want to make this call alert.
I have't verified this works as described, just thought I'd point it out
From iOS 5, use below...
NSString *phoneNumber = [#"telprompt://" stringByAppendingString:#"12345678"];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNumber]];
Just use telprompt:// instead of tel://
telprompt will prompt the user first, and when call ends,it will go back to your application.
NSString *myNumber = [#"telprompt://" stringByAppendingString:txtMobileNo.titleLabel.text];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:myNumber]];

Detecting programmatically whether an app is installed on iPhone

I am in this situation where I have to display a button which says "Open myApp" (if myApp is installed on the device) or it says "Download myApp" (if myApp is not installed on the device) in an iphone app. To do this, I need to detect whether an app (with a known custom URL) has been installed on the device. How can I do this? Thanks in advance.
UPDATED 8th January 2014 - 3 things you can do
I actually had to do this for a client again. They wanted users to be able to open their second app from the main app if it had been installed.
This is my finding. Use the canOpenURL method to check if an app is installed or/and then use the openURL method to
Open the application installed on the iOS device
Take the user to the app store directly pointing them to the app/your list of developer apps
Take them to a website instead
All code samples available for each scenario
//Find out if the application has been installed on the iOS device
- (BOOL)isMyAppInstalled {
return [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:#"nameOfMyApp:"]];
}
- (IBAction)openOrDownloadApp {
//This will return true if the app is installed on the iOS device
if ([self myAppIsInstalled]){
//Opens the application
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:#"nameOfMyApp:"]];
}
else { //App is not installed so do one of following:
//1. Take the user to the apple store so they can download the app
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:#"itms://itunes.com/apps/nameOfMyApp"]];
//OR
//2. Take the user to a list of applications from a developer
//or company exclude all punctuation and space characters.
//for example 'Pavan's Apps'
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:#"itms://itunes.com/apps/PavansApps"]];
//OR
//3. Take your users to a website instead, with maybe instructions/information
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:#"http://www.pavan.com/WhyTheHellDidTheAppNotOpen_what_now.html"]];
}
}
Choose one option, I've just spoiled you with choice. Choose one that fits your requirements.
In my case I had to use all three options in different areas of the program.
If the URL scheme for your app is "myapp:", then
BOOL myAppInstalled = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:#"myapp:"]];
(Requires iOS 3.0.)
To check app is install in device or not
1) In info.plist add LSApplicationQueriesSchemes as below example
2) and in URL Types
3) Now to check app is install or not
- (IBAction)openAppPressed:(UIButton *)sender {
NSString *urlString = #"XYZAPP://";
NSURL *url = [NSURL URLWithString:urlString];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}
else {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:#"itunes link for download app"]];
}
}
You can add a simple meta tag in the head of any page that needs this app-sniffing.
For more info, go here:
http://developer.apple.com/library/ios/#documentation/AppleApplications/Reference/SafariWebContent/PromotingAppswithAppBanners/PromotingAppswithAppBanners.html
For those using canOpenURL it is always safe to migrate from this to openURL:options:completionHandler:
NSString *urlString = #"XYZAPP://";
NSURL *url = [NSURL URLWithString:urlString];
[[UIApplication sharedApplication] openURL:url options:#{} completionHandler:^(BOOL success) {
if (!success) {
[[UIApplication sharedApplication] openURL:appStoreUrl options:#{} completionHandler:nil];
}
}];
because that doesn't require you to declare the scheme ahead of time.
canOpenURL which is deprecated already has some odd limitations because Twitter used it to detect hundreds of apps long ago.