iOS 앱에서 Safari를 시작하고 URL을 여는 방법


215

설정 페이지에서 3 개의 링크를 포함하고 싶습니다

  • 내 앱 지원 사이트
  • YouTube 앱 튜토리얼
  • 내 기본 사이트 (예 : 'Created by Dale Dietrich'라벨에 연결)

이 사이트와 웹, 문서를 검색했는데 분명한 것이 없습니다.

참고 : 내 앱에서 웹 페이지를 열고 싶지 않습니다. Safari로 링크를 보내고 싶습니다. 링크가 열려 있습니다. 설정 페이지에서 동일한 작업을 수행하는 많은 앱을 보았으므로 가능해야합니다.


Ionic Cordova 앱을 사용하여 하이브리드 개발에서 직면하고있는 동일한 문제
— Sopo

답변:


387

내가 한 일은 다음과 같습니다.

  1. 다음과 같이 헤더 .h 파일에 IBAction을 작성했습니다.

    - (IBAction)openDaleDietrichDotCom:(id)sender;
  2. 설정하려는 페이지에 연결하려는 텍스트가 포함 된 UIButton을 추가했습니다.

  3. 파일 소유자의 버튼을 IBAction에 적절하게 연결했습니다.

  4. 그런 다음 다음을 구현하십시오.

목표 -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
누군가가 jailbreaked 아이폰 OS를 사용하고 기본 브라우저로 크롬이나 뭔가를 사용하는 경우 때문에 그러나 이것은, 100 % 아닌, 다음이 아니라 사파리가 열립니다
— 라즐로

214
누군가가 크롬을 기본 브라우저로 만들기 위해 휴대 전화를 탈옥하려는 노력을 기울이고 있다면 설정이 이상적인 행동 일 것입니다.
— rpowell

나는 이것을 이해했지만 웹 사이트를 열고 사용자가 웹 사이트를 서핑하고 있다면 특정 페이지에서 멈 추면 코드에서 현재 웹 페이지 링크를 얻을 수 있습니까?
— Varun Jain 2016 년

3
위의 방법은 더 이상 사용되지 않으며 다음을 사용하십시오. [[UIApplication sharedApplication] openURL : [NSURL URLWithString : self.advertisement.url] 옵션 : @ {} completionHandler : ^ (BOOL 성공) {}];
— Mashhadi

@Laszlo 또한 설정에서 Safari를 제한에서 비활성화 할 수 있습니다. http 또는 https URL이 열리고 Safari가 비활성화되었을 때 다른 브라우저를 열도록 URL 체계 http 및 https로 앱을 코딩했습니다. 따라서 탈옥이 없어도 기본 웹 브라우저를 기술적으로 변경할 수 있습니다.
— ColdGrub1384

164

신속한 구문 :

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

iOS 9.3 이하의 새로운 Swift Syntax

Swift의 새로운 버전 (아마도 신속한 2?)에서 UIApplication.sharedApplication ()은 이제 UIApplication.shared입니다 (전산 적 인 속성을보다 잘 사용합니다). 또한 URL은 더 이상 암시 적으로 NSURL로 변환 할 수 없으므로 다음과 같이 명시 적으로 변환해야합니다!

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 개발자에게 매우 유용합니다. 많은 문서가없는 새로운 언어입니다 (예 : esp). 실제 iOS 문제를 해결하는 데 필자의 경우, 자동 완성 기능이 "fileURLWithPath :"선택기를 선택했는데 이것이 URL이 열리지 않는 이유를 알지 못했습니다. "string :"선택기를 사용해야했던 Dustin의 답변을 읽음으로써 만 가능했습니다. . 따라서 더스틴은 쫓겨나 지 말고 공복해야합니다.
— SafeFastExpressive

3
@g_fred. 왜 Swift 버전을 포함시킬 수 없습니까?
— ericgu

2
openURL(_:)iOS 10.0에서는 더 이상 사용되지 않으며 대신 open(_:options:completionHandler:)UIApplication 에서 인스턴스 메소드 를 호출해야합니다 .
— Ryan H.

2
캐스트를 저장할 수 있도록 NSURL 대신 URL을 직접 사용할 수 있습니다.
— marsbear

1
포장을 풀지 마십시오. if let url = NSURL(string:"http://www.reddit.com/") { UIApplication.shared.open(url) }항상 더 나은 서비스를 제공합니다. 오타를 잡기 위해 문장 assert에서 오류를 원할 수도 else있습니다.
— philipp

53

여기서는 열려있는 URL이 장치 또는 시뮬레이터로 열 수 있는지 확인해야합니다. 몇 시간 (시뮬레이터의 대다수) 때문에 충돌이 발생한다는 것을 알았습니다.

목표 -C

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 에서 인스턴스 메소드 를 호출해야합니다 .
— Ryan H.

20

-openURL:UIApplication 의 메소드를 살펴보십시오 . NSURL 인스턴스를 시스템에 전달하면 시스템에서 열 응용 프로그램을 시작하고 해당 응용 프로그램을 시작할 앱을 결정할 수 있습니다. ( -canOpenURL:현재 시스템에 설치된 앱에서 URL을 처리 할 수없는 경우를 대비하여 먼저 확인하고 싶을 수도 http://있습니다. 일반 링크 에는 문제가되지 않습니다 .)


고마워 팀. 당신은 바로 맞습니다. 당신이 들어 왔을 때 나는 내 자신의 대답을 추가하고 있었다. 미안하다. 그러나 적어도 저를 따르는 사람들에게는 쉬운 방법이 있습니다.
— 데일 Dietrich

걱정할 필요가 없습니다. 해결책을 찾았습니다.
— 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 문자열 ( texthere)은 하드 코딩되지 않으며 이와 같은 코드가 필요합니다.
— 의미 문제

@ 블라드 당신은 좌절했다, 그렇다면 어떻게 / 왜? 사람들이 위의 코드를 지나서 복사하지 않는다고 가정합니다.
— 의미 문제

1
의미 문제 그것은 당신에게 달려 있습니다 :)
— Vlad

13

사용되지 않는 Objective-C 버전은 다음과 같습니다.

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

완료 버튼이있는 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 ko 목표 -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

SWIFT 3.0에서

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

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는 당신이 작성한 코드의 새로운 점을 말해 주시면 투표권을
— 받았습니다.

-2

스위프트 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을 참조하십시오. 또한 강제 랩핑 해제가 나쁩니다.
— Eric Aya
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.