आईओएस ऐप से सफारी और ओपन यूआरएल कैसे लॉन्च करें


215

सेटिंग्स पृष्ठ पर, मैं तीन लिंक शामिल करना चाहता हूं

  • मेरा ऐप सपोर्ट साइट
  • YouTube ऐप ट्यूटोरियल
  • मेरी प्राथमिक साइट (यानी: rich डेल डिट्रिच द्वारा निर्मित ’लेबल से जुड़ी हुई है।)

मैंने इस साइट और वेब और मेरे प्रलेखन को खोजा है और मुझे ऐसा कुछ भी नहीं मिला है जो स्पष्ट हो।

नोट: मैं अपने ऐप के भीतर वेब पेज नहीं खोलना चाहता। मैं सिर्फ सफारी के लिए लिंक भेजना चाहता हूं और यह लिंक वहां खुला होना चाहिए। मैंने कई ऐप्स को अपने सेटिंग पेज में एक ही काम करते देखा है, इसलिए यह संभव होना चाहिए।


इसी मुद्दे पर मैं आयनिक कॉर्डोवा ऐप
सोपो

जवाबों:


386

यहाँ मैंने क्या किया है:

  1. मैंने हेडर में।

    - (IBAction)openDaleDietrichDotCom:(id)sender;
  2. मैंने उस सेटिंग पृष्ठ पर एक UIButton जोड़ा जिसमें वह पाठ है जिसे मैं लिंक करना चाहता हूं।

  3. मैंने फाइल ओनर के बटन को उचित तरीके से IBAction से जोड़ा।

  4. फिर निम्नलिखित को लागू करें:

उद्देश्य सी

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

तीव्र

(हेडर फ़ाइल के बजाय viewController में आईबीए)

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

8
लेकिन यह 100% नहीं है, क्योंकि अगर कोई जेलब्रेक किए गए iOS का उपयोग करता है और क्रोम या किसी डिफ़ॉल्ट ब्राउज़र के रूप में उपयोग करता है, तो यह खुलेगा, न कि सफारी
लेज़्ज़्लो

214
मुझे लगता है कि अगर कोई क्रोम को अपना डिफ़ॉल्ट ब्राउज़र बनाने के लिए अपने फोन को जेलब्रेक करने के प्रयास में चला गया है, तो यह मानकर कि सेटिंग शायद आदर्श व्यवहार है।
rpowell

मुझे यह समझ में आया लेकिन अगर मैं एक वेबसाइट खोल रहा हूं और उपयोगकर्ता अब वेबसाइट पर सर्फिंग कर रहा है यदि वह किसी विशेष पृष्ठ से बंद हो जाता है तो क्या मुझे अपने कोड में वर्तमान वेबपेज लिंक मिल सकता है?
वरुण जैन

3
ऊपर विधि अब पदावनत है निम्नलिखित का उपयोग करें। [[UIApplication sharedApplication] OpenURL: [NSURL URLWithString: self.advertisement.url] विकल्प: @ {} पूर्णहैंडलर: ^ (BOOL सफलता) {}];
मशहदी १ '

@Laszlo इसके अलावा, सेटिंग्स में हम सफारी को प्रतिबंधों में अक्षम कर सकते हैं। जब मैंने http या https URL खोला है और Safari अक्षम हो गया है, तो मैंने अन्य ब्राउज़र खोलने के लिए URL और http योजनाओं के साथ एक ऐप को कोडित किया है। इसलिए, जेलब्रेक के बिना भी, हम तकनीकी रूप से डिफ़ॉल्ट वेब ब्राउज़र को बदल सकते हैं।
शीतगृह 1384

164

स्विफ्ट सिंटैक्स:

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

आईओएस 9.3 और उससे पहले के लिए नई स्विफ्ट सिंटैक्स

स्विफ्ट के कुछ नए संस्करण (संभवतः स्विफ्ट 2?) के रूप में, UIApplication.saredApplication () अब UIApplication.sared (गणना की गई संपत्तियों का बेहतर उपयोग कर रहा हूं जो मैं अनुमान लगा रहा हूं)। इसके अतिरिक्त URL अब NSURL के लिए अनुमानित रूप से परिवर्तनीय नहीं है, इसे स्पष्ट रूप से रूप में परिवर्तित किया जाना चाहिए!

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

आईओएस 10.0 के रूप में नई स्विफ्ट सिंटैक्स

OpenURL विधि को हटा दिया गया है और एक अधिक बहुमुखी विधि के साथ बदल दिया गया है जो एक विकल्प वस्तु और एक अतुल्यकालिक पूरा करने वाला हैंडलर iOS 10.0 के रूप में लेता है

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

31
स्विफ्ट डेवलपर्स के लिए उत्तर के स्विफ्ट संस्करण बेहद उपयोगी हैं, यह बहुत सारी प्रलेखन, एस्प के बिना एक नई भाषा है। असली दुनिया आईओएस समस्याओं को हल करने पर। मेरे मामले में, स्वत: पूर्ण ने "fileURLWithPath:" चयनकर्ता को चुना था और मुझे नहीं पता था कि मेरा URL क्यों नहीं खुल रहा था, यह केवल डस्टिन के उत्तर को पढ़ने से था जो मैंने देखा कि मुझे "स्ट्रिंग:" चयनकर्ता का उपयोग करना चाहिए था । इसलिए डस्टिन को उखाड़ा जाना चाहिए, उसका पीछा नहीं किया जाना चाहिए।
SafeFastExpressive

3
@g_fred। वह एक स्विफ्ट संस्करण को शामिल करने में सक्षम क्यों नहीं होगा?
इरीगू

2
openURL(_:)iOS 10.0 में पदावनत किया गया था, इसके बजाय आपको open(_:options:completionHandler:)UIApplication पर इंस्टेंस विधि को कॉल करना चाहिए ।
रयान एच।

2
आप सीधे NSURL के बजाय URL का उपयोग कर सकते हैं ताकि आप कलाकारों को बचा सकें।
मार्सबियर

1
मेरा सुझाव है कि अनचाहे ज़बरदस्ती न करें। if let url = NSURL(string:"http://www.reddit.com/") { UIApplication.shared.open(url) }हमेशा आपकी बेहतर सेवा करेगा। टाइपो को पकड़ने के assertलिए elseकथन में त्रुटि और त्रुटि हो सकती है ।
दीक्षा

53

यहां एक चेक की आवश्यकता होती है कि जो url ओपन होने वाला है, वह डिवाइस या सिम्युलेटर द्वारा ओपन किया जा सकता है या नहीं। क्योंकि कुछ समय (सिम्युलेटर में बहुमत) मैंने पाया कि यह दुर्घटनाओं का कारण बनता है।

उद्देश्य सी

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

स्विफ्ट 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वर्तमान ऐप को छोड़ने के बिना ऐप की स्थापना का पता लगाने के लिए मुख्य रूप से उपयोग किया जाता है।
बेन फ्लिन

1
openURL(_:)iOS 10.0 में पदावनत किया गया था, इसके बजाय आपको open(_:options:completionHandler:)UIApplication पर इंस्टेंस विधि को कॉल करना चाहिए ।
रयान एच।

20

-openURL:UIApplication पर विधि पर एक नज़र डालें । यह आपको सिस्टम में एक NSURL उदाहरण को पारित करने की अनुमति देनी चाहिए, जो यह निर्धारित करेगा कि किस एप्लिकेशन को इसे खोलना है और उस एप्लिकेशन को लॉन्च करना है। (ध्यान रखें कि आप शायद -canOpenURL:पहले जांच करना चाहते हैं , बस अगर सिस्टम पर वर्तमान में इंस्टॉल किए गए ऐप्स द्वारा URL को संभाला नहीं जा सकता है - हालांकि यह सादे http://लिंक के लिए समस्या नहीं है ।)


धन्यवाद टिम। आप ठीक बिंदु पर हैं। मैं अपना जवाब जोड़ रहा था जैसे कि तुम्हारा आया था। इसके बारे में क्षमा करें। लेकिन कम से कम अब मेरे लिए एक आसान तरीका है, जो मेरा अनुसरण करते हैं।
डेल डिट्रिच

कोई चिंता नहीं - खुशी है कि आप समाधान मिल गया!
टिम

1
openURL(_:)iOS 10.0 में पदावनत किया गया था, इसके बजाय आपको open(_:options:completionHandler:)UIApplication पर इंस्टेंस विधि को कॉल करना चाहिए ।
रयान एच।

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];

@ व्लाद यह केवल एक कठिन-कोडित उदाहरण है। अक्सर यूआरएल स्ट्रिंग ( textयहां) हार्ड-कोड नहीं किया जाएगा और आपको इस तरह कोड की आवश्यकता होगी।
अर्थ-मामले 19

@ व्लाद आप निराश थे, और यदि हाँ तो / क्यों? मुझे लगता है कि लोग ऊपर दिए गए कोड को कॉपी नहीं करते हैं।
अर्थ-मायने

1
अर्थ-मायने यह आपके ऊपर है :)
व्लाद

13

गैर-वियोजित उद्देश्य-सी संस्करण होगा:

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

10

स्विफ्ट 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

एक बटन के साथ 3 समाधान स्विफ्ट

भूलना मत import SafariServices

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

यह सही उत्तर है जो आईओएस और आईओएस एक्सटेंशन्स दोनों में काम करता है। अन्य उत्तर केवल ऐप्स में काम करते हैं और एक्सटेंशन में उपयोग नहीं किए जा सकते हैं।
ओवेन झाओ

5

क्योंकि यह उत्तर आईओएस 10.0 के बाद से हटा दिया गया है, इसलिए बेहतर उत्तर होगा:

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

y एन ऑब्जेक्टिव-सी

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

3

OpenURL ( :) को iOS 10.0 में पदावनत किया गया था, इसके बजाय आपको UIApplication पर निम्न आवृत्ति विधि का उपयोग करना चाहिए: खुला ( : विकल्प: पूर्णहैंडलर :)

उदाहरण स्विफ्ट का उपयोग करके
यह सफारी में " 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

स्विफ्ट 1.2 , में यह कोशिश करें:

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

plz मुझे बताएं कि कोड में नया क्या है, जो आपने लिखा है और आपने मुझे वोट के रूप में चिह्नित किया है
दिलीप तिवारी

-2

स्विफ्ट 4 समाधान:

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

1
एक उचित स्विफ्ट 4 संस्करण URL का उपयोग करेगा न कि NSURL का। और URL के रूप में NSURL कास्टिंग करना समान नहीं है। स्पष्टीकरण के लिए stackoverflow.com/a/37812485/2227743 देखें। इसके अलावा, बल प्रयोग करना बुरा है।
एरिक आया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.