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.