LinusG.
LinusG.

Reputation: 28922

Open AppStore through button

Could you guys help me to translate the following code into Swift?

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms://itunes.apple.com/de/app/x-gift/id839686104?mt=8&uo=4"]];

(or do I have to take this link: itms://itunes.apple.com/app/id839686104?)

Upvotes: 81

Views: 119445

Answers (18)

Fattie
Fattie

Reputation: 12648

2024 era, if using old-fashioned storyboards:

Save you typing:

@IBAction func tapOpenAppStore() {
    if let u = URL(string: "itms-apps://itunes.apple.com"),
      UIApplication.shared.canOpenURL(u) {
        UIApplication.shared.open(u)
    }
}

Note, simulators have no app store. It does nothing (and does not crash or hiccup) if run on a simulator.

Upvotes: 0

MatBuompy
MatBuompy

Reputation: 2093

In recent versions (iOS 15+) of SwiftUI you could do something like this:

Link("To App Store", destination: URL(string: "itms-apps://itunes.apple.com")!)
                .buttonStyle(.borderedProminent) // <-- iOS 15+ only

And if you want to be sure the URL is valid:

if let url = URL(string: "itms-apps://itunes.apple.com"), 
             UIApplication.shared.canOpenURL(url) {
                    Link("To App Store", destination: url)
                }

Upvotes: 1

tanmoy
tanmoy

Reputation: 1438

For those looking for the updated working solution

Most of the given solutions here are outdated & deprecated, like "canOpenURL", "openURL" etc.

let appStoreLink = "https://apps.apple.com/app/{app-name}/{app-id}"

guard let url = URL(string: appStoreLink) else { return }
UIApplication.shared.open(url)

Upvotes: 2

Atomix
Atomix

Reputation: 13842

Here. But I highly suggest you learn the basics of Swift!

UIApplication.sharedApplication().openURL(NSURL(string: "itms://itunes.apple.com/de/app/x-gift/id839686104?mt=8&uo=4")!)

If you wanna open the AppStore in Swift 5:

if let url = URL(string: "itms-apps://itunes.apple.com/app/id1629135515") {
    UIApplication.shared.open(url)
}

Upvotes: 167

nirav dinmali
nirav dinmali

Reputation: 249

SwiftUI

import StoreKit

struct StoreView: UIViewControllerRepresentable {

    let appID: String
 
     
    func makeUIViewController(context: UIViewControllerRepresentableContext<StoreView>) -> SKStoreProductViewController {
        let sKStoreProductViewController = SKStoreProductViewController()
        let parameters = [ SKStoreProductParameterITunesItemIdentifier : appID]
        sKStoreProductViewController.loadProduct(withParameters: parameters)
        return sKStoreProductViewController
    }

    func updateUIViewController(_ uiViewController: SKStoreProductViewController, context: UIViewControllerRepresentableContext<StoreView>) {

    }

}

//how to use

.sheet(isPresented: $showAppAtStore){
StoreView(appID: "12345678") 
}

Upvotes: 3

user1039695
user1039695

Reputation: 1061

Swift 5.0:

import StoreKit

extension YourViewController: SKStoreProductViewControllerDelegate {
    func openStoreProductWithiTunesItemIdentifier(_ identifier: String) {
        let storeViewController = SKStoreProductViewController()
        storeViewController.delegate = self

        let parameters = [ SKStoreProductParameterITunesItemIdentifier : identifier]
        storeViewController.loadProduct(withParameters: parameters) { [weak self] (loaded, error) -> Void in
            if loaded {
                self?.present(storeViewController, animated: true, completion: nil)
            }
        }
    }
    private func productViewControllerDidFinish(viewController: SKStoreProductViewController) {
        viewController.dismiss(animated: true, completion: nil)
    }
}

// How to use

openStoreProductWithiTunesItemIdentifier("12345")

Upvotes: 7

Shakeel Ahmed
Shakeel Ahmed

Reputation: 6023

Swift 5

let url = "your app url"
if #available(iOS 10.0, *) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
 } 
else {
    // Earlier versions 
    if UIApplication.shared.canOpenURL(url as URL) {
        UIApplication.shared.openURL(url as URL)
    }
}

Upvotes: 2

Hardik Thakkar
Hardik Thakkar

Reputation: 15951

For Swift 5 (tested code) to open App Store link

if let url = URL(string: "https://itunes.apple.com/in/app/your-appName/id123456?mt=8") 
{
           if #available(iOS 10.0, *) {
              UIApplication.shared.open(url, options: [:], completionHandler: nil)
           }
           else {
                 if UIApplication.shared.canOpenURL(url as URL) {
                    UIApplication.shared.openURL(url as URL)
                }
           }
} 

Upvotes: 12

Naresh
Naresh

Reputation: 17902

In Swift 4.2 and Xcode 10.2

You have two ways to open App Store or iTunes Store

If you want to open App Store use https or if you want to open iTunes Store use itms

Ex: https://itunes.apple.com/in/app/yourAppName/id14****4?mt=8 //For App Store

itms://itunes.apple.com/in/app/yourAppName/id14****4?mt=8 //For iTunes Store

Method 1: This is simple direct and old approach

let url  = NSURL(string: "https://itunes.apple.com/in/app/smsdaddy/id1450172544?mt=8")//itms   https
    if UIApplication.shared.canOpenURL(url! as URL) {
        UIApplication.shared.openURL(url! as URL)
    }

Method 2: New approach

if let url = URL(string: "https://itunes.apple.com/in/app/smsdaddy/id1450172544?ls=1&mt=8") {
   if #available(iOS 10.0, *) {
       UIApplication.shared.open(url, options: [:], completionHandler: nil)
   } else {
       // Earlier versions
       if UIApplication.shared.canOpenURL(url as URL) {
          UIApplication.shared.openURL(url as URL)
       }
   }
}

Upvotes: 3

Devesh.452
Devesh.452

Reputation: 911

If you want to open in app store use

 let appstoreUrl =  "https://itunes.apple.com/in/app/myapp-test/id11111111?mt=8"
 UIApplication.shared.openURL(URL(string: appstoreUrl)!)

if you want in itune store use

  let ituneUrl =  "itms-apps://itunes.apple.com/in/app/myapp-test/id11111111?mt=8"
 UIApplication.shared.openURL(URL(string: ituneUrl)!)

Upvotes: 3

meow2x
meow2x

Reputation: 2124

For the new AppStore, simply open your app's link on AppStore and replace the https scheme to itms-apps scheme. Example on Swift 4:

if let url = URL(string: "itms-apps://itunes.apple.com/us/app/my-app/id12345678?ls=1&mt=8") {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}

You can find your app's link on the App Information page.

Upvotes: 2

mobilecat
mobilecat

Reputation: 1459

Swift 4 with completion handler:

Make sure to update your id in the appStoreUrlPath

func openAppStore() {
    if let url = URL(string: "itms-apps://itunes.apple.com/app/id..."),
        UIApplication.shared.canOpenURL(url){
        UIApplication.shared.open(url, options: [:]) { (opened) in
            if(opened){
                print("App Store Opened")
            }
        }
    } else {
        print("Can't Open URL on Simulator")
    }
}

Upvotes: 15

Marco Weber
Marco Weber

Reputation: 839

For me didn't worked one of this answers. (Swift 4) The app always opened the iTunes Store not the AppStore.

I had to change the url to "http://appstore.com/%Appname%" as described at this apple Q&A: https://developer.apple.com/library/archive/qa/qa1633/_index.html

for example like this

private let APPSTORE_URL = "https://appstore.com/keynote"
UIApplication.shared.openURL(URL(string: self.APPSTORE_URL)!)

(remove spaces from the app-name)

Upvotes: 1

Stuart Casarotto
Stuart Casarotto

Reputation: 1187

Swift 3 Syntax and improved with an 'if let'

if let url = URL(string: "itms-apps://itunes.apple.com/app/id1024941703"),
UIApplication.shared.canOpenURL(url){
    UIApplication.shared.openURL(url)
}

UPDATE 7/5/17 (Thank you Oscar for pointing this out):

if let url = URL(string: "itms-apps://itunes.apple.com/app/id1024941703"),
    UIApplication.shared.canOpenURL(url)
{
    if #available(iOS 10.0, *) {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
    } else {
        UIApplication.shared.openURL(url)
    }
}

Upvotes: 74

Raj Joshi
Raj Joshi

Reputation: 2669

Check newer app update available on iTunes in Swift 3

let currentAppVersion = Bundle.main.infoDictionary
Alamofire.request("http://itunes.apple.com/jp/lookup/?id=548615", method: .get, parameters: nil, headers: nil).responseJSON { response in
        if let value = response.result.value as? [String: AnyObject] {
            let versionNum = value["results"]?.value(forKey: "version") as? NSArray
            if versionNum?[0] as! String != currentAppVersion?["CFBundleShortVersionString"] as! String {
                self.alertForUpdateApp()
            }
        }
    }

func alertForUpdateApp() {

    let alertController = UIAlertController(title: "Update Available", message: "There is a newer version of this app available", preferredStyle: .alert)
    let alertActionCancel = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
    let alertActionUpdate = UIAlertAction(title: "Update", style: .default, handler: { _ in
        if let url = URL(string: Constants.API_REDIRECT_TO_ITUNES),
            UIApplication.shared.canOpenURL(url){
            UIApplication.shared.open(url, options: [:], completionHandler: nil)

        }
    })

    alertController.addAction(alertActionCancel)
    alertController.addAction(alertActionUpdate)

    let pushedViewControllers = (self.window?.rootViewController as! UINavigationController).viewControllers
    let presentedViewController = pushedViewControllers[pushedViewControllers.count - 1]

    presentedViewController.present(alertController, animated: true, completion: nil)

}

Upvotes: 4

djdance
djdance

Reputation: 3209

I use this combination, its better for rate/shopping.

(partially from here)

    @IBAction func rateMe(sender: AnyObject) {
    if #available(iOS 8.0, *) {
        openStoreProductWithiTunesItemIdentifier("107698237252");
    } else {
        var url  = NSURL(string: "itms://itunes.apple.com/us/app/xxxxxxxxxxx/id107698237252?ls=1&mt=8")
        if UIApplication.sharedApplication().canOpenURL(url!) == true  {
            UIApplication.sharedApplication().openURL(url!)
        }

    }
}
func openStoreProductWithiTunesItemIdentifier(identifier: String) {
    let storeViewController = SKStoreProductViewController()
    storeViewController.delegate = self

    let parameters = [ SKStoreProductParameterITunesItemIdentifier : identifier]
    storeViewController.loadProductWithParameters(parameters) { [weak self] (loaded, error) -> Void in
        if loaded {
            // Parent class of self is UIViewContorller
            self?.presentViewController(storeViewController, animated: true, completion: nil)
        }
    }
}
func productViewControllerDidFinish(viewController: SKStoreProductViewController) {
    viewController.dismissViewControllerAnimated(true, completion: nil)
}

don't forget to import and delegate:

import StoreKit

class RateMeViewController: UIViewController, SKStoreProductViewControllerDelegate {

Upvotes: 20

    var url  = NSURL(string: "itms-apps://itunes.apple.com/app/id1024941703")
    if UIApplication.sharedApplication().canOpenURL(url!) == true  {
        UIApplication.sharedApplication().openURL(url!)
    }

Xcode 6.4

Upvotes: 1

Andrej
Andrej

Reputation: 7426

Since other answers didn't work for me (Swift, Xcode 6.1.1) here I post my solution:

var url  = NSURL(string: "itms://itunes.apple.com/de/app/x-gift/id839686104?mt=8&uo=4")

if UIApplication.sharedApplication().canOpenURL(url!) {
    UIApplication.sharedApplication().openURL(url!)
}

Upvotes: 11

Related Questions