Safariを起動してiOSアプリからURLを開く方法


215

設定ページに、3つのリンクを追加します

  • 私のアプリサポートサイト
  • YouTubeアプリのチュートリアル
  • 私のプライマリサイト(つまり、「Created by Dale Dietrich」ラベルにリンクされています。)

私はこのサイトとWebと私のドキュメントを検索しましたが、明白なものは何も見つかりませんでした。

注:アプリ内でWebページを開きたくありません。リンクをSafariに送信し、そのリンクをそこに開いておきたいだけです。多くのアプリが設定ページで同じことをしているのを見たので、それは可能であるに違いない。


Ionic Cordovaアプリを使用したハイブリッド開発で私が直面しているのと同じ問題
Sopo

回答:


386

これが私がしたことです:

  1. 次のように、ヘッダーの.hファイルにIBActionを作成しました。

    - (IBAction)openDaleDietrichDotCom:(id)sender;
  2. リンク先のテキストを含むUIButtonを[設定]ページに追加しました。

  3. ボタンをファイル所有者のIBActionに適切に接続しました。

  4. 次に、以下を実装します。

Objective-C

- (IBAction)openDaleDietrichDotCom:(id)sender {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.daledietrich.com"]];
}

迅速

(ヘッダーファイルではなく、viewControllerのIBAction)

if let link = URL(string: "https://yoursite.com") {
  UIApplication.shared.open(link)
}

8
しかし、これは100%ではありません。誰かがジェイルブレイクされたiOSを使用し、Chromeまたは何かをデフォルトのブラウザーとして使用すると、Safariではなくそれが開きます
Laszlo

214
誰かが自分の電話をジェイルブレイクしてChromeをデフォルトのブラウザにしようと努力しているような気がします。その設定を尊重することはおそらく理想的な動作です。
rpowell 14

私はこれを理解しましたが、私がウェブサイトを開いていて、ユーザーが特定のページに立ち寄ったときにウェブサイトをサーフィンしている場合、コードで現在のウェブページのリンクを取得できますか?
Varun Jain

3
上記のメソッドは非推奨になりました。以下を使用してください。[[UIApplication sharedApplication] openURL:[NSURL URLWithString:self.advertisement.url] options:@ {} completionHandler:^(BOOL success){}];
Mashhadi 2017

@Laszloまた、制限でSafariを無効にすることもできます。URLスキームとしてhttpおよびhttpsを使用してアプリをコーディングし、httpまたはhttpsのURLが開かれ、Safariが無効になっているときに他のブラウザーを開くようにしました。したがって、Jailbreakがなくても、技術的にデフォルトのWebブラウザを変更できます。
ColdGrub1384 2018

164

Swift構文:

UIApplication.sharedApplication().openURL(NSURL(string:"http://www.reddit.com/")!)

iOS 9.3以前の新しいSwift構文

Swiftのいくつかの新しいバージョン(Swift 2?の可能性があります)では、UIApplication.sharedApplication()がUIApplication.sharedになりました(私が推測している計算されたプロパティをより有効に利用しています)。さらに、URLは暗黙的にNSURLに変換できなくなり、as!で明示的に変換する必要があります。

UIApplication.sharedApplication.openURL(NSURL(string:"http://www.reddit.com/") as! URL)

iOS 10.0以降の新しいSwift構文

openURLメソッドは非推奨になり、iOS 10.0のオプションオブジェクトと非同期完了ハンドラーを使用するより用途の広いメソッドに置き換えられました

UIApplication.shared.open(NSURL(string:"http://www.reddit.com/")! as URL)

31
回答のSwiftバージョンは、Swift開発者にとって非常に便利です。これは、特に大量のドキュメントがない新しい言語です。実世界のiOS問題の解決に。私の場合、オートコンプリートが「fileURLWithPath:」セレクターを選択していたので、URLが開かなかったのはそのためにわかりませんでした。ダスティンの回答を読んだだけで、「string:」セレクターを使用する必要があることがわかりました。 。だからダスティンは恥をかかされるべきではなく、賛成されるべきです。
SafeFastExpressive 2015年

3
@g_fred。なぜ彼はSwiftバージョンを含めることができないのでしょうか?
ericgu 2015年

2
openURL(_:)iOS 10.0で廃止されました。代わりにopen(_:options:completionHandler:)、UIApplicationのインスタンスメソッドを呼び出す必要があります。
Ryan H.

2
キャストを保存できるように、NSURLの代わりにURLを直接使用できます。
marsbear 2017

1
アンラップを強制しないことをお勧めします。 if let url = NSURL(string:"http://www.reddit.com/") { UIApplication.shared.open(url) }常により良いサービスを提供します。タイプミスをキャッチassertするためにelseステートメントにエラーを入れたい場合があります。
フィリップ2017

53

ここで、開く予定のURLがデバイスまたはシミュレーターで開くことができるかどうかを確認する必要があります。ときどき(主にシミュレーターで)、クラッシュの原因になることがわかりました。

Objective-C

NSURL *url = [NSURL URLWithString:@"some url"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
   [[UIApplication sharedApplication] openURL:url];
}

Swift 2.0

let url : NSURL = NSURL(string: "some url")!
if UIApplication.sharedApplication().canOpenURL(url) {
     UIApplication.sharedApplication().openURL(url)
}

Swift 4.2

guard let url = URL(string: "some url") else {
    return
}
if UIApplication.shared.canOpenURL(url) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}

1
いつでもHTTP / HTTPSを開くことができます。iOS 9以降、呼び出すURLをホワイトリストに登録する必要がありますcanOpenURL。なぜあなたが単に電話openURL:urlしないのか分かりませんし、それが失敗した場合は、失敗に対処してください。canOpenURL現在のアプリを離れることなくアプリのインストールを検出するために主に使用されます。
Ben Flynn

1
openURL(_:)iOS 10.0で廃止されました。代わりにopen(_:options:completionHandler:)、UIApplicationのインスタンスメソッドを呼び出す必要があります。
Ryan H.

20

-openURL:UIApplication のメソッドを見てください。NSURLインスタンスをシステムに渡すことができるはずです。これにより、どのアプリでそれを開き、そのアプリケーションを起動するかが決まります。(-canOpenURL:URLが現在システムにインストールされているアプリで処理できない場合に備えて、最初に確認することをお勧めしhttp://ます。ただし、これはプレーンリンクの問題ではない可能性があります。)


ティムありがとう。あなたは正しいです。あなたの答えが来たときに私は自分の答えを追加していました。しかし、少なくとも、今、私に従う人のための簡単なハウツーがあります。
デールディートリッヒ

心配ありません-解決策を見つけてよかったです!
Tim

1
openURL(_:)iOS 10.0で廃止されました。代わりにopen(_:options:completionHandler:)、UIApplicationのインスタンスメソッドを呼び出す必要があります。
Ryan H.

17

また、提供されたURL textにスキームがあるかどうかわからない場合は、次のようにします。

NSString* text = @"www.apple.com";
NSURL*    url  = [[NSURL alloc] initWithString:text];

if (url.scheme.length == 0)
{
    text = [@"http://" stringByAppendingString:text];
    url  = [[NSURL alloc] initWithString:text];
}

[[UIApplication sharedApplication] openURL:url];

@Vladこれはハードコーディングされた例です。多くの場合、URL文字列(textここ)はハードコーディングされておらず、このようなコードが必要です。
意味の問題

@Vladあなたはイライラしていましたか、そしてはいならどのように/なぜですか?私は人々が上記のコードを単にコピーするだけではないと思います。
意味の問題

1
意味事項それはあなた次第です:)
Vlad

13

非推奨のObjective-Cバージョンは次のようになります。

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://apple.com"] options:@{} completionHandler:nil];

10

Swift 3.0

if let url = URL(string: "https://www.reddit.com") {
    if #available(iOS 10.0, *) {
        UIApplication.shared.open(url, options: [:])
    } else {
        UIApplication.shared.openURL(url)
    }
}

これは、iOSの古いバージョンを実行しているデバイスもサポートします


10

[完了]ボタンのあるSwift 3ソリューション

することを忘れないでください import SafariServices

if let url = URL(string: "http://www.yoururl.com/") {
            let vc = SFSafariViewController(url: url, entersReaderIfAvailable: true)
            present(vc, animated: true)
        }

これは、iOSとiOS Extensionsの両方で機能する完璧な答えです。その他の回答はアプリでのみ機能し、拡張機能では使用できません。
Owen Zhao

5

この回答はiOS 10.0以降廃止されているため、より適切な回答は次のとおりです。

if #available(iOS 10.0, *) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}else{
    UIApplication.shared.openURL(url)
}

y en Objective-c

[[UIApplication sharedApplication] openURL:@"url string" options:@{} completionHandler:^(BOOL success) {
        if (success) {
            NSLog(@"Opened url");
        }
    }];

3

openURL(:)はiOS 10.0で廃止されました。代わりに、UIApplicationで次のインスタンスメソッドを使用する必要があります:open(:options:completionHandler :)

Swiftの使用例
これにより、Safariで「https://apple.com」が開きます

if let url = URL(string: "https://apple.com") {
    if UIApplication.shared.canOpenURL(url) {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
    }
}

https://developer.apple.com/reference/uikit/uiapplication/1648685-open



2

スウィフト5:

func open(scheme: String) {
   if let url = URL(string: scheme) {
      if #available(iOS 10, *) {
         UIApplication.shared.open(url, options: [:],
           completionHandler: {
               (success) in
                  print("Open \(scheme): \(success)")
           })
     } else {
         let success = UIApplication.shared.openURL(url)
         print("Open \(scheme): \(success)")
     }
   }
 }

使用法:

open(scheme: "http://www.bing.com")

参照:

iOS10のOpenURL


1

これを試して:

NSString *URL = @"xyz.com";
if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:URL]])
{
     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:URL]];
}

0

Swift 1.2では、これを試してください:

let pth = "http://www.google.com"
    if let url = NSURL(string: pth){
        UIApplication.sharedApplication().openURL(url)

plzは、あなたが書いたコードの新機能を教えてくれ、あなたは私に反対票を投じました
Dilip Tiwari 2017

-2

Swift 4ソリューション:

UIApplication.shared.open(NSURL(string:"http://yo.lo")! as URL, options: [String : Any](), completionHandler: nil)

1
適切なSwift 4バージョンはNSURLではなくURLを使用します。そしてNSURLをURLとしてキャストすることは同じではありません。説明については、stackoverflow.com / a / 37812485/2227743を参照してください。また、強制アンラップが悪いです。
エリックアヤ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.