이번에는 다른 앱을 호출하고, 파라미터를 넘겨주는 방법을 함께 알아볼 것이다.

간단하게 사용자의 id와 pw를 입력받고, 이 중 id를 다른 앱에 넘겨주는 예제를 진행해보려한다.

 

1. 다른 앱 호출 할 준비하기 (AppA)

  • AppA의 info.plist에 아래 항목을 추가해주어야 'AppB'라는 앱을 호출할 수 있는 권한을 얻는다.

LSApplicationQueriesSchemes의 하위항목을 추가하는 방법을 몰라서 헤맸었는데, 오른쪽 타입을 'Array' 로 해주면 하위 항목을 입력할 수 있다.

 

  • Info.plist에 이를 추가해주지 않으면 아래와 같은 에러가 발생한다.

 

 

2. 다른 앱에서 호출받을 준비 하기 (AppB)

  • AppB의 URL Type에 본인의 앱 스킴이 무엇인지 정의해야, 다른 앱에서 해당 스킴으로 호출할 수 있다.

  • 아래와 같이 Project > Info > URL Types 에 번들id 와 url Schemes를 정해준다.

 

3. 다른 앱 호출하기 (AppA)

  • AppB:// 와 같이 다른 앱에서 정의해 놓은 url Schemes로 url을 생성한다.

    이 때 파라미터를 넣고 싶은 경우에는 AppB://id=hello 와 같은 타입으로 url을 정의한다.

  • 그 다음 canOpenUrl 을 이용해 해당 앱을 실행시킬 수 있는지 확인하고,

    가능할 경우 open(url: , options: , completionHandler: ) 메서드를 이용해 앱을 호출한다.

    ( 기존에는 openURL(string: ) 메서드가 존재했으나, deprecate되었다. )

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
	/*처리하는 부분은 내일해야지!!*/
}
@IBAction func login(_ sender: Any) {
	var id = userID.text ?? ""      
	let urlString = "AppB://" + "id=" + id
        
	if let appUrl = URL(string: urlString){
		if(UIApplication.shared.canOpenURL(appUrl)){
			UIApplication.shared.open(appUrl, options: [:], completionHandler: nil)
		}else{
			let showAlert = UIAlertController(title: "안내", message: "앱이 설치되어있지 않습니다.", preferredStyle: UIAlertController.Style.alert)
		}
	}
}

 

 

4. 호출될 때 넘겨받은 파라미터 처리하기 (AppB)

  • Url scheme을 이용해 앱이 호출되면 AppDelegate의 application(_:open:options:) 메서드가 호출된다. 파라미터를 처리해주기 위해 해당 메서드를 재정의한다.

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
	/*처리하는 부분은 내일해야지!!*/
}

 

 

 

 

# 공부를 위해 정리하는 글이므로, 정확하지 않을 수 있습니다. 

 

 

> 객체간 통신하는 방법에는 세 가지가 있다.

1. Notification
2. Delegate
3. Callback

 이 중, Notification 을 이용해 통신하는 방법에 대해 먼저 알아볼 것이다.

 

 

> Notification은 다른 뷰를 보고있음에도 띄워지지 않은 뷰의 메서드를 사용해 어떠한 이벤트를 처리하는 방법을 말한다. 예를 들어, 뷰A 버튼을 클릭했을 때 뷰B의 라벨 텍스트를 변경하는 것 등이 있을 것이다.

방법을 간단하게 살펴보면,

  1. addObserver를 이용해 NotificationCenter에 Notification 을 등록하고,

  2. post 를 이용해 노티를 발송해 연결된 함수를 실행한다.

 


[예제] NotiViewController에서 버튼 클릭 시, ViewController의 배경색을 변경한다.

 

- ViewController에서 노티피케이션을 등록한다.

NotificationCenter.default.addObserver(self,
                                       selector: #selector(changeBackground),
                                       name: NSNotification.Name(rawValue: "FirstNotification"),
                                       object: nil)

 

  • #selecter 에는 노티피케이션 수신 시 실행될 메서드를 넣어준다.

  • name에는 해당 노티피케이션의 고유 이름을 정해준다.

  • 여기서는 배경색을 바꿔주는 changeBackgroundColor 메서드를 호출했다.

    근데, #selector(changeBackground) 부분에서 'Argument of '#selector' refers to instance method 'changeBackground()' that is not exposed to Objective-C' 라는 오류메시지가 났다.

    func changeBackground()@objc changeBackground 로 변경해줘서 오류메시지가 사라졌는데, 왜 그런지 이유를 모르겠다..

 

- NotiViewController 에서 노티피케이션을 보낸다

NotificationCenter.default.post(name: Notification.Name(rawValue: "FirstNotification"), object: message)
  • name: 부분에 addObserver 메서드에서 정해놓은 고유이름을 넣어준다.

 

 

> 결과화면은 다음과 같다.

# 공부를 위해 정리하는 글이므로, 정확하지 않을 수 있습니다. 

 

 

* AppA에서 AppB 실행시키기 *

 

 

1. AppB의 URL Type 정의

 

  • 웹이든, 앱이든 url을 이용해 어떤 앱을 실행시키기 위해서는 그 앱 ID가 정의되어 있어야 한다.

    그렇기 때문에 호출될 AppB에 이 작업을 해둬야 한다.

  • Project > Info > URL Types 에 번들id 와 앱을 호출할 때 사용할 url Schemes를 정해준다.

     

2. AppA에 open 메서드 호출

  • 버튼 클릭 시 호출되는 메서드에서 다른 앱을 호출하는 메서드를 호출한다.

UIApplication.shared.open(URL(string: "AppB://")!, options: [:], completionHandler: nil)

 

 

 


open 함수에 웹url 을 입력하면 웹페이지도 호출할 수 있다.

UIApplication.shared.open(URL(string: "http://www.naver.com")!, options: [:], completionHandler: nil)

 

 

앱 설치여부나 실행가능여부 등을 확인하지 않고, 아주 간단하게 코드 한 줄로 다른 앱을 호출하는 방법에 대해 알아보았다.

다음에는 openURL 함수를 이용하는 방법, 데이터를 넘기는 방법에 대해 알아보려 한다.

+ Recent posts