Cách khởi chạy Safari và mở URL từ ứng dụng iOS


215

Trên trang cài đặt, tôi muốn bao gồm ba liên kết đến

  • Trang web hỗ trợ ứng dụng của tôi
  • Hướng dẫn ứng dụng YouTube
  • Trang web chính của tôi (ví dụ: được liên kết với nhãn 'Được tạo bởi Dale Dietrich'.)

Tôi đã tìm kiếm trang web này và web và tài liệu của tôi và tôi không tìm thấy gì rõ ràng.

LƯU Ý: Tôi không muốn mở các trang web trong ứng dụng của mình. Tôi chỉ muốn gửi liên kết đến Safari và liên kết đó được mở ở đó. Tôi đã thấy một số ứng dụng làm điều tương tự trong trang Cài đặt của chúng, vì vậy nó phải có thể.


Vấn đề tương tự tôi gặp phải trong quá trình phát triển Hybrid bằng ứng dụng Ionic Cordova
Sopo

Câu trả lời:


386

Đây là những gì tôi đã làm:

  1. Tôi đã tạo một IBAction trong các tệp .h tiêu đề như sau:

    - (IBAction)openDaleDietrichDotCom:(id)sender;
  2. Tôi đã thêm một UIButton trên trang Cài đặt có chứa văn bản mà tôi muốn liên kết đến.

  3. Tôi đã kết nối nút với IBAction trong Chủ sở hữu tệp một cách thích hợp.

  4. Sau đó thực hiện như sau:

Mục tiêu-C

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

Nhanh

(IBAction trong viewContoder, thay vì tệp tiêu đề)

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

8
Nhưng đây không phải là 100%, bởi vì nếu ai đó sử dụng iOS đã bẻ khóa và sử dụng Chrome hoặc một cái gì đó làm trình duyệt mặc định, thì điều này sẽ mở ra, chứ không phải Safari
Laszlo

214
Tôi cảm thấy như có ai đó đã nỗ lực bẻ khóa điện thoại của họ để biến Chrome thành trình duyệt mặc định của họ, tôn vinh cài đặt đó có lẽ là hành vi lý tưởng.
rpowell

Tôi hiểu điều này nhưng nếu tôi đang mở một trang web và người dùng đang lướt trang web ngay bây giờ nếu anh ta dừng lại bởi một trang cụ thể thì tôi có thể nhận được liên kết trang web hiện tại trong mã của mình không?
Varun Jain

3
Phương pháp trên không được dùng nữa. [[UIApplication sharedApplication] openURL: [NSURL URLWithString: self.adSpaceement.url] tùy chọn: @ {} xongHandler: ^ (BOOL thành công) {}];
Mashhadi

@Laszlo Ngoài ra, trong cài đặt, chúng tôi có thể tắt Safari trong Hạn chế. Tôi đã mã hóa một ứng dụng với các lược đồ URL http và https để mở các trình duyệt khác khi URL http hoặc https được mở và Safari bị tắt. Vì vậy, ngay cả khi không Bẻ khóa, chúng tôi có thể thay đổi kỹ thuật trình duyệt web mặc định.
ColdGrub1384

164

Cú pháp Swift:

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

Cú pháp Swift mới cho iOS 9.3 trở về trước

Kể từ một số phiên bản mới của Swift (có thể là swift 2?), UIApplication. SharedApplication () hiện là UIApplication. Shared (sử dụng tốt hơn các thuộc tính được tính toán mà tôi đoán). Ngoài ra, URL không còn có thể chuyển đổi hoàn toàn thành NSURL, phải được chuyển đổi rõ ràng bằng!

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

Cú pháp Swift mới kể từ iOS 10.0

Phương thức openURL không được dùng nữa và được thay thế bằng một phương thức linh hoạt hơn, lấy một đối tượng tùy chọn và trình xử lý hoàn thành không đồng bộ kể từ iOS 10.0

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

31
Các phiên bản câu trả lời của Swift cực kỳ hữu ích cho các nhà phát triển Swift, đó là một ngôn ngữ mới mà không có nhiều tài liệu, đặc biệt. về giải quyết các vấn đề iOS trong thế giới thực. Trong trường hợp của tôi, tự động hoàn tất đã chọn bộ chọn "fileURLWithPath:" và tôi không nhận ra đó là lý do tại sao URL của tôi không mở, chỉ bằng cách đọc câu trả lời của Dustin mà tôi thấy rằng tôi nên sử dụng bộ chọn "chuỗi:" . Vì vậy, Dustin nên được nâng cấp, không bị trừng phạt.
SafeFastExpressive

3
@g_fred. Tại sao anh ta không thể bao gồm một phiên bản Swift?
ericgu

2
openURL(_:)không được dùng trong iOS 10.0, thay vào đó bạn nên gọi phương thức cá thể open(_:options:completionHandler:)trên UIApplication.
Ryan H.

2
Bạn có thể trực tiếp sử dụng URL thay vì NSURL để bạn có thể lưu diễn viên.
soái ca

1
Tôi khuyên bạn không bao giờ nên ép buộc. if let url = NSURL(string:"http://www.reddit.com/") { UIApplication.shared.open(url) }sẽ luôn phục vụ tốt hơn của bạn. Có thể muốn assertvà lỗi trong elsecâu lệnh để bắt lỗi chính tả.
philipp

53

Ở đây một kiểm tra được yêu cầu là url sẽ được mở có thể mở bằng thiết bị hoặc trình giả lập hay không. Bởi vì một số lần (phần lớn trong trình giả lập) tôi thấy nó gây ra sự cố.

Mục tiêu-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
Bạn luôn có thể mở HTTP / HTTPS. Kể từ iOS 9, bạn cần đưa vào danh sách trắng bất kỳ URL nào bạn muốn gọi canOpenURL. Tôi không thấy lý do tại sao bạn không đơn giản gọi openURL:urlvà nếu thất bại, hãy đối phó với thất bại. canOpenURLchủ yếu được sử dụng để phát hiện cài đặt ứng dụng mà không cần rời khỏi ứng dụng hiện tại.
Ben Flynn

1
openURL(_:)không được dùng trong iOS 10.0, thay vào đó bạn nên gọi phương thức cá thể open(_:options:completionHandler:)trên UIApplication.
Ryan H.

20

Hãy xem -openURL:phương pháp trên UIApplication. Nó sẽ cho phép bạn truyền một thể hiện NSURL cho hệ thống, nó sẽ xác định ứng dụng nào sẽ mở nó và khởi chạy ứng dụng đó. (Hãy nhớ rằng bạn có thể muốn kiểm tra -canOpenURL:trước, chỉ trong trường hợp URL không thể được xử lý bởi các ứng dụng hiện được cài đặt trên hệ thống - mặc dù điều này có thể không phải là vấn đề đối với http://các liên kết đơn giản .)


Cảm ơn Tim. Bạn đang phải vào điểm. Tôi đã thêm câu trả lời của riêng tôi khi bạn đến. Xin lỗi về điều đó. Nhưng ít nhất bây giờ có một cách dễ dàng cho những người theo tôi.
Dale Dietrich

Đừng lo lắng - rất vui vì bạn đã tìm thấy giải pháp!
Tim

1
openURL(_:)không được dùng trong iOS 10.0, thay vào đó bạn nên gọi phương thức cá thể open(_:options:completionHandler:)trên UIApplication.
Ryan H.

17

Và, trong trường hợp bạn không chắc chắn liệu URL được cung cấp textcó sơ đồ hay không:

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 Đây chỉ là một ví dụ được mã hóa cứng. Thường thì chuỗi url ( textở đây) sẽ không được mã hóa cứng và bạn cần mã như thế này.
ý nghĩa-vấn đề

@Vlad Bạn có nản lòng không, và nếu có thì thế nào / tại sao? Tôi giả sử mọi người không chỉ sao chép qua đoạn mã trên.
ý nghĩa-vấn đề

1
ý nghĩa-vấn đề Đó là tùy thuộc vào bạn :)
Vlad

13

Phiên bản Objective-C không dùng nữa sẽ là:

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

Điều này cũng hỗ trợ các thiết bị chạy các phiên bản iOS cũ hơn


10

Giải pháp Swift 3 với nút Xong

Đừng quên import SafariServices

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

Đây là câu trả lời hoàn hảo hoạt động trong cả Tiện ích mở rộng iOS và iOS. Các câu trả lời khác chỉ hoạt động trong các ứng dụng và không thể được sử dụng trong các tiện ích mở rộng.
Owen Zhao

5

Vì câu trả lời này không được chấp nhận kể từ iOS 10.0, nên câu trả lời tốt hơn sẽ là:

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

y en Mục tiêu-c

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

3

openURL ( :) không được dùng trong iOS 10.0, thay vào đó, bạn nên sử dụng phương thức ví dụ sau trên UIApplication: open ( : Options: xongHandler :)

Ví dụ sử dụng Swift
Điều này sẽ mở " https://apple.com " trong 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

Trong SWift 3.0

               if let url = URL(string: "https://www.google.com") {
                 UIApplication.shared.open(url, options: [:])
               }

2

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

Sử dụng:

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

Tài liệu tham khảo:

OpenURL trong iOS10


1

Thử cái này:

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

0

Trong Swift 1.2, hãy thử điều này:

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

Xin vui lòng cho tôi biết mã mới mà bạn đã viết là gì và bạn đã đánh dấu tôi bỏ phiếu
Dilip Tiwari

-2

Giải pháp Swift 4:

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

1
Một phiên bản Swift 4 thích hợp sẽ sử dụng URL chứ không phải NSURL. Và truyền NSURL làm URL không giống nhau. Xem stackoverflow.com/a/37812485/2227743 để được giải thích. Ngoài ra, lực lượng unrapping là xấu.
Eric Aya
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.