App store link for "rate/review this app" - iphone

I want to put a "rate/review this app" feature into my app.
Is there a way to link directly to the screen in the app store where they review the app? So the customer doesn't have to click through the main app link. Thanks.
EDIT: starting a bounty on this due to the lack of response. Just to make sure it is crystal clear: I am aware that I can link to my app's page in the store, and ask the user to click from there to the "review this app" screen. The question is whether it is possible to link directly to the "review this app" screen so they don't have to click through anything.

For versions lower than iOS 7 use the old one:
itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=YOUR_APP_ID
This works on my end (Xcode 5 - iOS 7 - Device!):
itms-apps://itunes.apple.com/app/idYOUR_APP_ID
For iOS 8 or later:
itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=YOUR_APP_ID&onlyLatestVersion=true&pageNumber=0&sortOrdering=1&type=Purple+Software
Code snippet (you can just copy & paste it):
#define YOUR_APP_STORE_ID 545174222 //Change this one to your ID
static NSString *const iOS7AppStoreURLFormat = #"itms-apps://itunes.apple.com/app/id%d";
static NSString *const iOSAppStoreURLFormat = #"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=%d";
[NSURL URLWithString:[NSString stringWithFormat:([[UIDevice currentDevice].systemVersion floatValue] >= 7.0f)? iOS7AppStoreURLFormat: iOSAppStoreURLFormat, YOUR_APP_STORE_ID]]; // Would contain the right link

Update:
Swift 5.1, Xcode 11
Tested on Real Device iOS 13.0 (Guarantee to work)
import StoreKit
func rateApp() {
if #available(iOS 10.3, *) {
SKStoreReviewController.requestReview()
} else {
let appID = "Your App ID on App Store"
let urlStr = "https://itunes.apple.com/app/id\(appID)" // (Option 1) Open App Page
let urlStr = "https://itunes.apple.com/app/id\(appID)?action=write-review" // (Option 2) Open App Review Page
guard let url = URL(string: urlStr), UIApplication.shared.canOpenURL(url) else { return }
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(url) // openURL(_:) is deprecated from iOS 10.
}
}
}

EDIT: iOS 11 Solution
This is the solution to my original answer (see below). When using the iOS 11 the following link format will work:
https://itunes.apple.com/us/app/appName/idAPP_ID?mt=8&action=write-review
Simply replace APP_ID with your specific app ID. The key to make the link work is the country code. The link above uses the us code but it actually doesn't matter which code is used. The user will automatically be redirected to his store.
iOS 11 Update:
It seems that none of the solutions presented in the other answers to get directly to the Review Page works on iOS 11.
The problem most likely is, that an app page in the iOS 11 App Store app does NOT have a Review Tab anymore. Instead the reviews are now located directly below the description and the screenshots. Of course it could still be possible to reach this section directly (e.g. with some kind of anchor), but it seems that this is not supported / intended by Apple.
Using one of the following links does not work anymore. They still bring the users to the App Store app but only to a blank page:
itms-apps://itunes.apple.com/app/idYOUR_APP_ID?action=write-review
itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=YOUR_APP_ID&onlyLatestVersion=true&pageNumber=0&sortOrdering=1&type=Purple+Software
Everyone how still uses these links should update their apps ASAP, because referring the users to a blank App Store page is most likely not what you intended.
Links which do not refer to the Review page but to the App page, still work however, e.g.
itms-apps://itunes.apple.com/app/idYOUR_APP_ID (same as above, but without write-review parameter)
So, you can still get the users to your apps Store page, but not directly to the review section anymore. Users now have to scroll down to the review section manually to leave their feedback.
Without a question this a "great and awesome benefit for User Experience and will help developers to engage users to leave high quality reviews without annoying them". Well done Apple...

Everything, written above is correct. Just a sample to insert into the app and change {YOUR APP ID} to actual app id, taken from iTunesconnect to show the Review page. Please note, as it was commented above, that it is not working on the Simulator - just the device.
Correcting because of iOS 7 changes.
Correcting for iOS 10+ openURL changes
For iOS 13.6+ review URL is accessible with the one, used before version 6.0. It drives directly to the review page. Code updated
NSString * appId = #"{YOUR APP ID}";
NSString * theUrl = [NSString stringWithFormat:#"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=%#&onlyLatestVersion=true&pageNumber=0&sortOrdering=1&type=Purple+Software",appId];
int vers = (int) [[UIDevice currentDevice].systemVersion integerValue];
if (vers > 6 && vers < 12 ) theUrl = [NSString stringWithFormat:#"itms-apps://itunes.apple.com/app/id%#",appId];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:theUrl] options:#{} completionHandler:nil];

All above approaches are correct, but nowadays using SKStoreProductViewController leads to better user experience. To use it you need to do the following:
implement SKStoreProductViewControllerDelegate protocol in your app delegate
add required productViewControllerDidFinish method:
- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController {
[viewController dismissViewControllerAnimated: YES completion: nil];
}
Check if SKStoreProductViewController class is available and either show it or switch to the App Store:
extern NSString* cAppleID; // must be defined somewhere...
if ([SKStoreProductViewController class] != nil) {
SKStoreProductViewController* skpvc = [[SKStoreProductViewController new] autorelease];
skpvc.delegate = self;
NSDictionary* dict = [NSDictionary dictionaryWithObject: cAppleID forKey: SKStoreProductParameterITunesItemIdentifier];
[skpvc loadProductWithParameters: dict completionBlock: nil];
[[self _viewController] presentViewController: skpvc animated: YES completion: nil];
}
else {
static NSString* const iOS7AppStoreURLFormat = #"itms-apps://itunes.apple.com/app/id%#";
static NSString* const iOSAppStoreURLFormat = #"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=%#";
NSString* url = [[NSString alloc] initWithFormat: ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0f) ? iOS7AppStoreURLFormat : iOSAppStoreURLFormat, cAppleID];
[[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];
}

Solution for iOS 11
Short App Store URLs do not correctly open the "write a review" interface in the new iOS 11 App Store. For example, this does not work:
https://itunes.apple.com/app/id333903271?mt=8&action=write-review
The workaround is to include a two-letter country code and app name in the URL, such as this:
https://itunes.apple.com/us/app/twitter/id333903271?mt=8&action=write-review
or
itms-apps://itunes.apple.com/us/app/twitter/id333903271?mt=8&action=write-review
You can get the full URL of your app from here: https://linkmaker.itunes.apple.com/
This successfully opens the "write a review" interface in the iOS 11 App Store.
Edit: As #Theo mentions below, the country code does not need to be localized and the app name in the URL does not need to be updated if the app name changes.
Hopefully Apple will fix this soon for the shorter URL. See rdar://34498138

Swift 2 version
func jumpToAppStore(appId: String) {
let url = "itms-apps://itunes.apple.com/app/id\(appId)"
UIApplication.sharedApplication().openURL(NSURL(string: url)!)
}

All previous links no more direct to "Reviews" tab,
This link would direct to "Reviews Tab" directly:
​
https://itunes.apple.com/app/viewContentsUserReviews?id=AppID
or
​
itms-apps://itunes.apple.com/app/viewContentsUserReviews?id=AppID

There is a new way to do this in iOS 11+ (new app store). You can open the "Write a Review" dialog directly.
iOS 11 example:
itms-apps://itunes.apple.com/us/app/id1137397744?action=write-review
or
https://itunes.apple.com/us/app/id1137397744?action=write-review
Notes:
A country code is required (/us/). It can be any country code, doesn't matter.
Change the app id (1137397744) to your app id (get it from iTunes URL).
If you want to support older iOS version (pre 11), you'll want some conditional logic to only link this way if the OS version is great than or equal to 11.

Using this URL was the perfect solution for me. It takes the user directly to the Write a Review section. Credits to #Joseph Duffy. MUST TRY
URL = itms-apps://itunes.apple.com/gb/app/idYOUR_APP_ID_HERE?action=write-review&mt=8
Replace YOUR_APP_ID_HERE with your AppId
For a sample code try this :
Swift 3, Xcode 8.2.1 :
let openAppStoreForRating = "itms-apps://itunes.apple.com/gb/app/id1136613532?action=write-review&mt=8"
if let url = URL(string: openAppStoreForRating), UIApplication.shared.canOpenURL(url) {
UIApplication.shared.openURL(url)
} else {
showAlert(title: "Cannot open AppStore",message: "Please select our app from the AppStore and write a review for us. Thanks!!")
}
Here showAlert is a custom function for an UIAlertController.

You can use this link in your url launcher function
https://apps.apple.com/app/APP_ID?action=write-review

In iOS7 the URL that switch ur app to App Store for rate and review has changed:
itms-apps://itunes.apple.com/app/idAPP_ID
Where APP_ID need to be replaced with your Application ID.
For iOS 6 and older, URL in previous answers are working fine.
Source: Appirater
Enjoy Coding..!!

Starting from iOS 10.3 you can attach action=write-review query item to your https://itunes.apple.com/... and https://appsto.re/... URLs. On iOS 10.3 and up it will open Write a review automatically, while on lower iOS releases will fall back to the app's App Store page.
iOS 11 update:
Use Apple's linkmaker: linkmaker.itunes.apple.com
and append &action=write-review, seems to be the most safe way to go.

iOS 4 has ditched the "Rate on Delete" function.
For the time being the only way to rate an application is via iTunes.
Edit: Links can be generated to your applications via iTunes Link Maker. This site has a tutorial.

NSString *url = [NSString stringWithFormat:#"https://itunes.apple.com/us/app/kidsworld/id906660185?ls=1&mt=8"];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];

Swift 2 version that actually takes you to the review page for your app on both iOS 8 and iOS 9:
let appId = "YOUR_APP_ID"
let url = "itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=\(appId)"
UIApplication.sharedApplication().openURL(NSURL(string: url)!)

For >= iOS8: (Simplified #EliBud's answer).
#define APP_STORE_ID 1108885113
- (void)rateApp{
static NSString *const iOSAppStoreURLFormat = #"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=%d";
NSURL *appStoreURL = [NSURL URLWithString:[NSString stringWithFormat:iOSAppStoreURLFormat, APP_STORE_ID]];
if ([[UIApplication sharedApplication] canOpenURL:appStoreURL]) {
[[UIApplication sharedApplication] openURL:appStoreURL];
}
}

I'm having the same issue in iOS 10 and I could open the iTunes rate section calling:
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=YOUR_APP_ID&pageNumber=0&sortOrdering=2&type=Purple+Software&mt=7
Basically it changed the last url var to "mt=7"
Cheers

quote from Apple Developer Documentation
In addition, you can continue to include a persistent link in the
settings or configuration screens of your app that deep-links to your
App Store product page. To automatically open a page on which users
can write a review in the App Store, append the query parameter
action=write-review to your product URL.
So the URL would be the following:
itms-apps://itunes.apple.com/app/idYOUR_APP_ID?action=write-review

let rateUrl = "itms-apps://itunes.apple.com/app/idYOUR_APP_ID?action=write-review"
if UIApplication.shared.canOpenURL(rateUrl) {
UIApplication.shared.openURL(rateUrl)
}

Link to any App in the AppStore via SKStoreProductViewController
It is easy to link to your app at the app store via SKStoreProductViewController. But I struggled a little bit, so I decided to show here the whole process and some code necessary. This technique also makes sure that always the correct store will be used (important for localized apps).
To present the product screen of any app of the app store within your app with any of your apps ViewControllers follow this steps:
Add the StoreKit.framework in your project settings (Target, Build Phases -> Link Binary With Libraries
Import StoreKit into the ViewController class
Make your ViewController conforms this protocol
SKStoreProductViewControllerDelegate
Create the method to present the StoreView with the product screen you want
Dismiss the StoreView
But most important: This - for some reason - does not work in the simulator - you have to build and install on a real device with internet connectivity.
Adding the StorKit.framework to your project:
SWIFT 4: This is the code according to the described steps ahead:
// ----------------------------------------------------------------------------------------
// 2. Import StoreKit into the ViewController class
// ----------------------------------------------------------------------------------------
import StoreKit
// ...
// within your ViewController
// ----------------------------------------------------------------------------------------
// 4. Create the method to present the StoreView with the product screen you want
// ----------------------------------------------------------------------------------------
func showStore() {
// Define parameter for product (here with ID-Number)
let parameter : Dictionary<String, Any> = [SKStoreProductParameterITunesItemIdentifier : NSNumber(value: 742562928)]
// Create a SKStoreProduktViewController instance
let storeViewController : SKStoreProductViewController = SKStoreProductViewController()
// set Delegate
storeViewController.delegate = self
// load product
storeViewController.loadProduct(withParameters: parameter) { (success, error) in
if success == true {
// show storeController
self.present(storeViewController, animated: true, completion: nil)
} else {
print("NO SUCCESS LOADING PRODUCT SCREEN")
print("Error ? : \(error?.localizedDescription)")
}
}
}
// ...
// ----------------------------------------------------------------------------------------
// 3. Make your ViewController conforming the protocol SKStoreProductViewControllerDelegate
// ----------------------------------------------------------------------------------------
extension ViewController : SKStoreProductViewControllerDelegate {
// ----------------------------------------------------------------------------------------
// 5. Dismiss the StoreView
// ----------------------------------------------------------------------------------------
func productViewControllerDidFinish(_ viewController: SKStoreProductViewController) {
print("RECEIVED a FINISH-Message from SKStoreProduktViewController")
viewController.dismiss(animated: true, completion: nil)
}
}

Here is the code that I am using in my app;
-(void)rateApp {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[#"itms-apps://itunes.apple.com/app/" stringByAppendingString: #"id547101139"]]];
}

The accepted answer failed to load the "Reviews" tab. I found below method to load the "Review" tab without "Details" tab.
[[UIApplication sharedApplication] openURL:[NSURL URLWithString: #"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id={APP_ID}&pageNumber=0&sortOrdering=2&mt=8"]];
Replace {APP_ID} with your app apps store app id.

SWIFT 3
fileprivate func openAppStore() {
let appId = "YOUR_APP_ID"
let url_string = "itms-apps://itunes.apple.com/app/id\(appId)"
if let url = URL(string: url_string) {
UIApplication.shared.openURL(url)
}
}

This works fine on iOS 9 - 11.
Haven't tested on earlier versions.
[NSURL URLWithString:#"https://itunes.apple.com/app/idXXXXXXXXXX?action=write-review"];

Starting in iOS 10.3:
import StoreKit
func someFunction() {
SKStoreReviewController.requestReview()
}
but its has been just released with 10.3, so you will still need some fallback method for older versions as described above

Swift 5 Tested in iOS14
Opens the review window with 5 stars selected
private func openReviewInAppStore() {
let rateUrl = "itms-apps://itunes.apple.com/app/idYOURAPPID?action=write-review"
if UIApplication.shared.canOpenURL(URL.init(string: rateUrl)!) {
UIApplication.shared.open(URL.init(string: rateUrl)!, options: [:], completionHandler: nil)
}
}

If your app has been approved for Beta and it's not live then the app review link is available but it won't be live to leave reviews.
Log into iTunes Connect
Click My Apps
Click the App Icon your interested in
Make sure your on the App Store page
Go toApp Information section (it should automatically take you there)
At the bottom of that page there is a blue link that says View on App Store. Click it and it will open to an a blank page. Copy what's in the url bar at the top of the page and that's your app reviews link. It will be live once the app is live.

Know you apple app id, it is the numeric digits in your itunes app url after id field.
Something like this : https://itunes.apple.com/app/id148688859, then 148688859 is your app id.
Then, Redirect to this url using your correct app id : https://itunes.apple.com/app/idYOUR_APP_ID?action=write-review.

Related

Open Setting App from my applicaiton in iPhone iOS 7

I want to open iphone default setting application form my application, Please any one tell me what I have to do. OR is there any code to open it.
I try following code but it dont works.in iOS 7.1.
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:#"prefs:root=LOCATION_SERVICES_Systemservices"]];
Thanks in Advance.
For iOS8 and later use :
// Send the user to the Settings for this app
//iOS 8 only
NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:settingsURL];
Since iOS 5.1, there is no official way to open Settings via App.
Here to Go.
You can use private API to open Settings App from your application. But i'm not sure if it will get accepted from apple.
void (*openApp)(CFStringRef, Boolean);
void *hndl = dlopen("/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices", 0);
openApp = dlsym(hndl, "SBSLaunchApplicationWithIdentifier");
openApp(CFSTR("com.apple.Preferences"), FALSE);
Swift 4
let url = URL(string: UIApplicationOpenSettingsURLString)
if UIApplication.shared.canOpenURL(url!) {
UIApplication.shared.openURL(url!)
}

Detecting programmatically an installed app

I am trying to detect installed Instagram on my device , formerly I used this code to detect an app , but it seems it does not work with iOS 6 or non-JB devices :
NSString *filePath = #"/Applications/Instagram.app";
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
[self checkingInstalledApp];
}
else
{
NSLog(#"no instagram installed");
}
I check this question but his answer gives me a lot errors ! any solution ?
This is invalid code for two reasons.
1) It attempts to interact with an area outside of its sandbox.
2) It relies on an undocumented implementation detail (Perhaps the install location has moved or the application name has changed?)
What you need to do is use the canOpenURL: method on UIApplication to determine if the system can launch an application via its custom scheme (note: If the App has no custom scheme then you are out of luck)
Custom URL Scheme Opening instagram://, followed by one of the following parameters, will open our app and perform a custom action.
For example, for camera, you would direct users on the iPhone to the
custom URL instagram://camera.
NSURL *instagramURL = [NSURL URLWithString:#"instagram://location?id=1"];
if ([[UIApplication sharedApplication] canOpenURL:instagramURL]) {
[[UIApplication sharedApplication] openURL:instagramURL];
}
From Instagram iPhone Hooks

How to open bluetooth settings screen

I am using this code to open Bluetooth screen settings:
NSURL *url = [NSURL URLWithString:#"prefs:root=General&path=Bluetooth"];
[[UIApplication sharedApplication] openURL: url];
But it's not working, I am using iOS 6.0 SDK
I believe opening the settings app is deprecated in iOS 5.1.
Seems like all programmatic ways are either through urls (only works on 5.0 exactly), or directly modifying settings (non-public api).
However, it must also be possible somehow on 5.1+, as for example the "Runtastic"-App does exactly this (shows dialog that asks if you want to open bluetooth settings) when you start it.
Swift 3.0 & iOS 10 and above
func openBluetoothSettings(){
let urlBTSet = URL(string: "App-Prefs:root=Bluetooth")
let objApp = UIApplication.shared
objApp.openURL(urlBTSet!)
}
Objective-c
-(void) openBluetoothSettings{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:#"App-Prefs:root=Bluetooth"]];
}
So, In above code what they have changed is string need to add "App-Prefs:root=Bluetooth" (This the example of opening bluetooth settings)
Don't forgot : 'Goto taget -> info -> URL Types -> Add "prefs" in URL Schemes'
It's question for iOS 6.0 but for iOS 8/9 here is the answer,
Go to your XCode project, under Info -> URL Types section -> "prefs" in URL Scheme
In IOS9: let url = NSURL(string: "prefs:root=Bluetooth")!
IOS8: let url = NSURL(string: "prefs:root=General&path=Bluetooth")!

Access Settings app in iOS

Is there an opportinity to show up the settings.app in iOS by clicking on a button? It should work with iOS 5.1 so the "prefs:root..." url is no option.
Do you have an idea how to solve this?
I know the question is about 5.1 specifically, but in case anyone else is interested:
As of iOS 8, it is possible to take a user from your app directly into the Settings app. They will be deep linked into your app's specific Settings page, but they can back out into the top level Settings screen.
UPDATE:
Thanks to Pavel's comment, I simplified the if statement and avoided the EXC_BAD_ACCESS on iOS 7.
UPDATE 2:
If your deployment target is set to 8.0 or above, Xcode 6.3 will give you the following warning:
Comparison of address of 'UIApplicationOpenSettingsURLString' not equal to a null pointer is always true
This is because the feature was available starting in 8.0, so this pointer will never be NULL. If your deployment target is 8.0+, just remove the if statement below.
if (&UIApplicationOpenSettingsURLString != NULL) {
NSURL *appSettings = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:appSettings];
}
You are not able to do this on iOS 5.1. Most likely Apple removed that ability intentionally (you'll get "Please enter a valid URL", while Twitter can still call the Settings, though). Please refer to:
How to open preferences/settings with iOS 5.1?.
Apple Disables Home Screen Shortcuts For Settings Toggles In iOS 5.1
On iOS 8 Apple gave us the possibility to go to the App Settings right from our app
you can apply this code:
- (IBAction)openSettings:(id)sender {
BOOL canOpenSettings = (UIApplicationOpenSettingsURLString != NULL);
if (canOpenSettings) {
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:url];
}
}
iOS6 shows an option to open the settings app directly from an 'AlertView' (shown automatically) if it detects if you're trying to post to FB or Twitter without having those accounts setup.
I have elaborated this over here
The method openURL: is now deprecated.
iOS 10 +
The correct way to open the settings URL (or any URL for that matter) is as follows:
NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:settingsURL options:#{} completionHandler:^(BOOL success) {
// Do anything here
}];

Using tel: url to initiate a call doesn't return control

I have an app that worked just fine in version 2.2.1 of the iphone, but have ran into an issue when I upgraded my dev iphone to 3.1.2. Before, dialing a number worked fine, as when the call was ended, my application was loaded. Now, after I hit end call, it loads the default phone application. Does anybody know why this is? I've looked at the diff's from sdk 2.x to 3.x and can't find any reason why this would change. Thanks
This was indeed changed from 3.0 to 3.1. If you need the "prompt-for-call" and "relaunch-app-after-call" there are 2 work-arounds:
Option 1: Create a UIWebView and load your tel: URL.
// assuming you have an ivar to store a weak reference to a UIWebView:
// UIWebView *phoneCallWebView;
- (void) dialPhoneNumber:(NSString *)aPhoneNumber
{
NSURL *phoneURL = [NSURL URLWithString:[NSString stringWithFormat:#"tel:%#",aPhoneNumber]];
if ( !phoneCallWebView ) {
phoneCallWebView = [[UIWebView alloc] initWithFrame:CGRectZero];
}
[phoneCallWebView loadRequest:[NSURLRequest requestWithURL:phoneURL]];
}
- (void) dealloc
{
// cleanup
[phoneCallWebView release], phoneCallWebView = nil;
[super dealloc];
}
Option 2: Initiate your call with with the telprompt:<number> URL scheme instead of tel:<number>. Note that this is an undocumented API feature, but it's what UIWebView uses when you tap on a phone number link in a webview (or in MobileSafari). If you are targeting iPhone >= 3.0, there are not any problems using telprompt: (tel: and telprompt: are identical on 3.0). I'm not sure about iPhone OS 2.x.
In general, option 2 works and is easier, but option 1 is actually a "legal" workaround. Unfortunately, there does not seem to be a way to separate the "prompt-for-call" and "relaunch-after-call" behaviors. On iPhoneOS >= 3.1, you can either get both, or neither.
Yes, Apple changed this behavior from 3.0 to 3.1 (I believe, could also be from 2.x to 3.0). They have acknowledged that the change was deliberate and not a bug. There is no workaround that I know of. You just have to live with it a file an enhancement request if you think the old behavior should be made available again.
But both UIWebView and telepump will introduce a "pop up box" require user to confirm if user would like to dial the number. I am wondering if there are some solutions that could get rid of "pop up box" Thank you.
NSURL* url = [[NSURL alloc] initWithString:[NSString stringWithFormat:#"telprompt:%#",[SLUser sharedInstance].ivrNumber]];
[[UIApplication sharedApplication] openURL:url];