본문 바로가기

iOS/니카내카

[니카내카] 앱에서 다른 앱 호출

728x90

(= 앱 간 이동 / 앱에서 다른 앱으로 이동하기 등등 ..)

 

니카내카의 경우 쏘카/그린카의 예약 현황 정보를 제공하고

정보를 확인한 후에 각각의 앱으로 이동할 수 있도록 기획/디자인을 했다.

 

 

오 사진을 넣고 보니까 .. 오른쪽 디자인은 수정되기 전이네 .. 아무튼 흐린눈 해주세요;

 


 

이런 식의 앱 사이의 이동은 어떻게 할 수 있을까?!

iOS에서는 URL Scheme을 통해서 다른 앱과 통신이 가능하다.

URL Scheme을 통해 다른 앱의 실행을 요청하거나 간단한 데이터도 전달할 수 있다.

예를 들어서 전화하고 싶은 번호를 입력하면 바로 전화 어플로 연결되어 전화를 할 수 있다.*실제 기기로 테스트를 해야한다. 시뮬에서는 sms만 가능하다. 

 


 

🔥 iOS Built-in URL Scheme

iOS는 기본으로 설치된 메일, 전화, 메시지 지도 앱과 통신할 수 있는 내장 URL Scheme을 제공한다.

자세한 정보와 사용법은 아래 사이트에서 볼 수 있다. 

 

 

About Apple URL Schemes

About Apple URL Schemes This document describes several URL schemes that are supported by system apps on iOS, macOS, and watchOS 2 and later. Native iOS apps and web apps running in Safari on any platform can use these schemes to integrate with system apps

developer.apple.com

mailto:이메일주소 메일 앱을 통해 새로운 메일 작성 화면 표시
tel://전화번호 전화 연결
sms://전화번호 메시지 연결
facetime://FaceTImeID FaceTime 연결
http://웹사이트 URL
https://웹사이트 URL
Safari 앱을 통해 웹사이트 표시
http://maps.apple.com/?q=검색어 
http://maps.apple.com/?ll=위도, 경도
지도 앱을 통해 지역 표시
앱이름: 이동하고 싶은 앱으로 연결

 


이동하고자 하는 앱이 기본 앱인지, 기본 앱이 아닌지에 따라서 과정이 조금 다르다.

먼저 기본 앱이 아닌 경우를 살펴보자. 

 

🟢  OpenURL 사용하여 다른 앱과 통신하기 - 기본앱 X

Info.plist에 등록 

만약 해당 앱에서 기본 앱이 아닌 앱으로 이동하는 경우에는 Info.plist에 등록하는 과정이 필요하다 !!

먼저, Info.plist로 이동해서 LSApplicationQueriesSchemes 항목을 추가한 뒤,

현재 Type이 String으로 되어 있는데, 앱 2개를 추가할 것이므로 Array로 수정한다.

 

 

위와 같이 Array를 선택하면 된다.

 

그리고 이동하고 싶은 앱의 이름을 아래와 같이 추가한다.

 

 

만약 Info.plist 파일에 추가하지 않으면,

위와 같은 오류가 발생한다.

그러므로 반드시 Info.plist에 이동하고자 하는 앱의 이름을 작성해줘야 한다.

 

 

URL로 앱 호출

그리고 앱의 이동이 필요한 곳에서 (위의 화면에서는 '앱으로 이동' 버튼을 눌렀을 때) 이동하고 싶은 앱의 주소를 입력하면 된다.

extension DetailViewController: DetailViewDelegate {
    func touchUpOpenButton() {
        var url = ""
        
        if brandType == .socar {
            url = "socar:"
        } else {
            url = "greencar:"
        }
        
        if let openApp = URL(string: url), UIApplication.shared.canOpenURL(openApp) {
            if #available(iOS 10.0, *) {
                UIApplication.shared.open(openApp, options: [:], completionHandler: nil)
            }
        } else {
            presentAlert(title: "\(brandType.brandNameKR) 앱을 설치해주세요")
            print("링크 주소 : \(url)")
        }
    }
}

 


 

 

🟢  OpenURL 사용하여 다른 앱과 통신하기 - 기본앱

기본앱일 경우는 위의 Info.plist에 등록하는 과정을 하지 않아도 된다.

 

1.  위의 원하는 url scheme 형식에 맞게 URL 인스턴스 생성

  • 전화 걸기 : tel://010-1234-5678
  • 메일 보내기 : mailto:sokyte@test.com
  • 문자 보내기 : sms://010-1234-5678
  • 링크 이동 : https://naver.com

2. canOpenURL(_:) 메소드를 통해서 URL 체계를 처리하는 데 앱을 사용할 수 있는지 여부 확인

func canOpenURL(_ url: URL) -> Bool

3. open(_:options:completionHandler:) 메소드를 호출해서 다른 앱 호출

func open(_ url: URL, options: [UIApplication.OpenExternalURLOptionsKey : Any] = [:], completionHandler completion: ((Bool) -> Void)? = nil)

*- (BOOL)openURL:(NSURL *)url; 은 iOS10에서 deprecate 됨

 

 

코드는 아래와 같다.

let url = "sms://01012345678"

if let openApp = URL(string: _url), UIApplication.shared.canOpenURL(openApp) {
    // 버전별 처리
    if #available(iOS 10.0, *) {
        UIApplication.shared.open(openApp, options: [:], completionHandler: nil)
    }
    else {
        UIApplication.shared.openURL(openApp)
    }
}

//스키마명을 사용해 외부앱 실행이 불가능한 경우
else {
    print("[goDeviceApp : 디바이스 외부 앱 열기 실패]")
    print("링크 주소 : \(_url)")
}