วิธีเปิด URL ใน Swift3


149

openURLเลิกใช้แล้วใน Swift3 ทุกคนสามารถให้ตัวอย่างของวิธีการเปลี่ยนopenURL:options:completionHandler:ทำงานเมื่อพยายามที่จะเปิด URL?

คำตอบ:


385

สิ่งที่คุณต้องการคือ:

guard let url = URL(string: "http://www.google.com") else {
  return //be safe
}

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

ถ้าฉันใช้ตัวดำเนินการ '+' ใน URL ของฉัน ตัวอย่างเช่น: " xxxxx.com./ " เช่นนี้ สตริงนั้นทำให้ฉันมีข้อผิดพลาด "ไม่ 'ผู้สมัคร' + 'สร้างประเภทผลลัพธ์ตามบริบทที่คาดหวัง' URL"
Ibrahim BOLAT

คุณต้องใช้โอเปอเรเตอร์ + StringแทนของคุณในURL
Devran Cosmo Uenal

หมายเหตุด้านข้าง: อย่าพยายามทำสิ่งนี้: UIApplication.shared.openURL (URL (สตริง: "ใส่ url ที่นี่")!) คอมไพเลอร์บน XCode 8 จะสับสนและไม่สามารถสร้างได้อย่างถูกต้อง ดังนั้นเพียงแค่ใช้วิธีนี้ตามที่เป็นอยู่ ใช้งานได้ดี! ขอบคุณ
Joel

ฉันจะเปิด URL โดยไม่เปิด Safari ได้อย่างไร ฉันจะให้ url เป็น "open" ในพื้นหลังได้อย่างไร กรุณาตอบคำถามของฉันที่: stackoverflow.com/questions/43686252/...
Christian Kreiter

1
คุณหมายถึง Swift ไม่ได้ทำให้คุณปีนกำแพงเพื่อทำอะไรที่ซับซ้อนพอ ๆ กับการเปิด URL ใช่ไหม [ขากรรไกรหลุด]
Daniel Springer

36

คำตอบข้างต้นถูกต้อง แต่ถ้าคุณต้องการตรวจสอบcanOpenUrlหรือไม่ลองเช่นนี้

let url = URL(string: "http://www.facebook.com")!
if UIApplication.shared.canOpenURL(url) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
    //If you want handle the completion block than 
    UIApplication.shared.open(url, options: [:], completionHandler: { (success) in
         print("Open url : \(success)")
    })
}

หมายเหตุ:หากคุณไม่ต้องการจัดการความสมบูรณ์คุณสามารถเขียนเช่นนี้ได้

UIApplication.shared.open(url, options: [:])

ไม่จำเป็นต้องเขียนcompletionHandlerเนื่องจากมีค่าเริ่มต้นnilตรวจสอบเอกสารประกอบของ Appleเพื่อดูรายละเอียดเพิ่มเติม


28

หากคุณต้องการเปิดภายในแอพแทนการออกจากแอพคุณสามารถนำเข้า SafariServicesและใช้งานได้

import UIKit
import SafariServices

let url = URL(string: "https://www.google.com")
let vc = SFSafariViewController(url: url!)
present(vc, animated: true, completion: nil)

1
วิธีนี้เป็นวิธีปฏิบัติที่ดีที่สุดตามแนวทาง iOS
gtrujillos

8

รุ่นSwift 3

import UIKit

protocol PhoneCalling {
    func call(phoneNumber: String)
}

extension PhoneCalling {
    func call(phoneNumber: String) {
        let cleanNumber = phoneNumber.replacingOccurrences(of: " ", with: "").replacingOccurrences(of: "-", with: "")
        guard let number = URL(string: "telprompt://" + cleanNumber) else { return }

        UIApplication.shared.open(number, options: [:], completionHandler: nil)
    }
}

replacingOccurrencesคุณสามารถใช้การแสดงออกปกติด้วย
Sulthan

2

ฉันใช้ macOS Sierra (v10.12.1) Xcode v8.1 Swift 3.0.1 และนี่คือสิ่งที่ใช้ได้กับฉันใน ViewController.swift:

//
//  ViewController.swift
//  UIWebViewExample
//
//  Created by Scott Maretick on 1/2/17.
//  Copyright © 2017 Scott Maretick. All rights reserved.
//

import UIKit
import WebKit

class ViewController: UIViewController {

    //added this code
    @IBOutlet weak var webView: UIWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Your webView code goes here
        let url = URL(string: "https://www.google.com")
        if UIApplication.shared.canOpenURL(url!) {
            UIApplication.shared.open(url!, options: [:], completionHandler: nil)
            //If you want handle the completion block than
            UIApplication.shared.open(url!, options: [:], completionHandler: { (success) in
                print("Open url : \(success)")
            })
        }
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


};

2
import UIKit 
import SafariServices 

let url = URL(string: "https://sprotechs.com")
let vc = SFSafariViewController(url: url!) 
present(vc, animated: true, completion: nil)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.