วิธีเปิด Safari และเปิด URL จากแอพ iOS


215

ในหน้าการตั้งค่าฉันต้องการรวมสามลิงก์ไปยัง

  • ไซต์สนับสนุนแอพของฉัน
  • บทแนะนำแอป YouTube
  • ไซต์หลักของฉัน (เช่น: เชื่อมโยงกับป้ายกำกับ 'สร้างโดย Dale Dietrich')

ฉันค้นหาเว็บไซต์นี้และเว็บและเอกสารของฉันแล้วและฉันไม่พบสิ่งใดที่ชัดเจน

หมายเหตุ:ฉันไม่ต้องการเปิดหน้าเว็บภายในแอพของฉัน ฉันแค่ต้องการส่งลิงค์ไปที่ Safari และลิงค์นั้นจะเปิดอยู่ที่นั่น ฉันได้เห็นแอพจำนวนมากที่ทำสิ่งเดียวกันในหน้าการตั้งค่าของพวกเขาดังนั้นมันจึงเป็นไปได้


ปัญหาเดียวกันที่ฉันกำลังเผชิญในการพัฒนาแบบไฮบริดโดยใช้แอพ Ionic Cordova
Sopo

คำตอบ:


387

นี่คือสิ่งที่ฉันทำ:

  1. ฉันสร้าง IBAction ในไฟล์ header. h ดังนี้:

    - (IBAction)openDaleDietrichDotCom:(id)sender;
  2. ฉันเพิ่ม UIButton ในหน้าการตั้งค่าที่มีข้อความที่ฉันต้องการเชื่อมโยง

  3. ฉันเชื่อมต่อปุ่มกับ IBAction ในเจ้าของไฟล์อย่างเหมาะสม

  4. จากนั้นใช้สิ่งต่อไปนี้:

Objective-C

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

รวดเร็ว

(IBAction ใน viewController แทนที่จะเป็นไฟล์ส่วนหัว)

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

8
แต่นี่ไม่ใช่ 100% เพราะถ้ามีคนใช้ iOS แหกคุกแล้วใช้ Chrome หรืออะไรก็ได้ที่เป็นเบราว์เซอร์เริ่มต้นสิ่งนี้จะเปิดขึ้นไม่ใช่ Safari
Laszlo

214
ฉันรู้สึกว่าถ้ามีใครบางคนไปใช้ความพยายามแหกคุกโทรศัพท์เพื่อทำให้ Chrome เป็นเบราว์เซอร์เริ่มต้นของพวกเขาการเคารพในการตั้งค่านั้นอาจเป็นพฤติกรรมในอุดมคติ
rpowell

ฉันเข้าใจสิ่งนี้ แต่ถ้าฉันเปิดเว็บไซต์และผู้ใช้ท่องเว็บไซต์ตอนนี้ถ้าเขาหยุดโดยหน้าใดหน้าหนึ่งจากนั้นฉันจะได้รับลิงค์หน้าเว็บปัจจุบันในรหัสของฉันได้อย่างไร
Varun Jain

3
วิธีการข้างต้นเลิกใช้แล้วตอนนี้ใช้วิธีต่อไปนี้ [[UIApplication sharedApplication] openURL: [NSURL URLWithString: self.advertise.url] ตัวเลือก: @ {} completeHandler: ^ (ความสำเร็จ BOOL) {}];
Mashhadi

@Laszlo นอกจากนี้ในการตั้งค่าเราสามารถปิดการใช้งาน Safari ในข้อ จำกัด ฉันเขียนรหัสแอปด้วยแบบแผน URL http และ https เพื่อเปิดเบราว์เซอร์อื่นเมื่อเปิด URL http หรือ https และ Safari ปิดใช้งาน ดังนั้นแม้จะไม่มี Jailbreak เราก็สามารถเปลี่ยนเว็บเบราว์เซอร์เริ่มต้นทางเทคนิคได้
ColdGrub1384

164

ไวยากรณ์ของ Swift:

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

New Swift Syntax สำหรับ iOS 9.3 และก่อนหน้า

ในฐานะเวอร์ชั่นใหม่ของ Swift (อาจจะเป็น swift 2?), UIApplication.sharedApplication () ตอนนี้เป็น UIApplication.shared (ใช้ประโยชน์จากคุณสมบัติที่คำนวณได้ดีขึ้นฉันคาดเดา) นอกจากนี้ URL จะไม่สามารถแปลงเป็น NSURL ได้อีกต่อไปโดยจะต้องถูกแปลงด้วย!

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

New Swift Syntax ตั้งแต่ iOS 10.0

วิธีการ openURL ได้รับการคัดค้านและแทนที่ด้วยวิธีการที่หลากหลายมากขึ้นซึ่งใช้วัตถุตัวเลือกและตัวจัดการความสมบูรณ์แบบอะซิงโครนัสเมื่อ iOS 10.0

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

31
คำตอบเวอร์ชันของ Swift มีประโยชน์อย่างยิ่งสำหรับนักพัฒนา Swift ซึ่งเป็นภาษาใหม่ที่ไม่มีเอกสารจำนวนมากโดยเฉพาะ ในการแก้ปัญหา iOS ในโลกแห่งความจริง ในกรณีของฉันการเติมข้อความอัตโนมัติได้เลือกตัวเลือก "fileURLWithPath:" และฉันไม่ทราบว่าเป็นสาเหตุที่ URL ของฉันไม่เปิดขึ้นมาเป็นเพียงการอ่านคำตอบของ Dustin ที่ฉันเห็นว่าฉันควรใช้ตัวเลือก "string:" . ดังนั้นดัสตินควรถูกยกขึ้นไม่ใช่การตีสอน
SafeFastExpressive

3
@g_fred เหตุใดเขาจึงไม่สามารถรวมรุ่น Swift ได้
ericgu

2
openURL(_:)เลิกใช้แล้วใน iOS 10.0 แต่คุณควรเรียกวิธีการอินสแตนซ์open(_:options:completionHandler:)บน UIApplication แทน
Ryan H.

2
คุณสามารถใช้ URL โดยตรงแทน NSURL เพื่อให้คุณสามารถบันทึกการส่ง
marsbear

1
ฉันแนะนำไม่ให้บังคับแกะ if let url = NSURL(string:"http://www.reddit.com/") { UIApplication.shared.open(url) }จะให้บริการคุณดีกว่าเสมอ อาจต้องการassertและข้อผิดพลาดในelseคำสั่งเพื่อตรวจจับการพิมพ์ผิด
philipp

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

สวิฟท์ 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://ลิงก์ธรรมดา)


ขอบคุณทิม คุณพูดถูก ฉันกำลังเพิ่มคำตอบของคุณเองเมื่อคุณเข้ามาขอโทษเกี่ยวกับเรื่องนั้น แต่อย่างน้อยตอนนี้ก็มีวิธีการง่าย ๆ สำหรับผู้ที่ติดตามฉัน
Dale Dietrich

ไม่ต้องกังวล - ดีใจที่คุณพบทางออก!
ทิม

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ที่นี่) จะไม่ได้รับการกำหนดค่าตายตัวและคุณต้องการรหัสเช่นนี้
ความหมายมีความสำคัญ

@ วลาดคุณผิดหวังหรือไม่และถ้าใช่เป็นอย่างไร / ทำไม? ฉันคิดว่าผู้คนไม่เพียงแค่คัดลอกรหัสด้านบน
ความหมายมีความสำคัญ

1
ความหมายเรื่องมันขึ้นอยู่กับคุณ :)
ลาด

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 คำตอบอื่น ๆ ใช้งานได้เฉพาะในแอพและไม่สามารถใช้ในส่วนขยายได้
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 วัตถุประสงค์ - ค

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

3

openURL ( :)เลิกใช้แล้วใน iOS 10.0 แต่คุณควรใช้วิธีอินสแตนซ์ต่อไปนี้บน UIApplication: open ( : ตัวเลือก: completeHandler :)

ตัวอย่างการใช้ Swift
จะเป็นการเปิด " https://apple.com " ใน Safari

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

อ้างอิง:

OpenURL ใน iOS10


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)

ได้โปรดบอกฉันว่ารหัสใหม่ที่คุณเขียนและคุณทำเครื่องหมายลงคะแนนคืออะไร
Dilip Tiwari

-2

โซลูชัน Swift 4:

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

1
รุ่น Swift 4 ที่เหมาะสมจะใช้ URL ไม่ใช่ NSURL และการคัดเลือก NSURL ในฐานะ URL นั้นไม่เหมือนกัน ดู stackoverflow.com/a/37812485/2227743 สำหรับคำอธิบาย นอกจากนี้การบังคับให้เปิดออกก็ไม่ดีเช่นกัน
Eric Aya
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.