(iOS) UIActivityController 을 통해서 공유를 쉽게하자.
다시 앱과 서비스 개발에 매진을 하고 있는데 최근에 한우찾기 iOS7 작업을 진행하고 있는데 UIActivityController
를 사용한 경험에 대해서 공유하고자 한다. 일단 아래의 불편한 진실을 보고 시작하자.
iOS7에서 깨지는것 외에도 기존의 결과 뷰에서 복사하기, 저장하기 메일로 보내기 버튼이 하단에 있는 문제점과 함께 카카오톡이나 페이스북, 메일, 라인 등으로 보낼수 없다는게 가장 큰 이슈였다. 그래서 생각한 것이 UIActivityController
이다.
이걸 사용해서 가질수 있는 가장 큰 장점은 2가지이다.
2. 공유와 저장을 한번에 할수 있다. 본인이 원하는 메신저 혹은 메일로 누군가에게 보낼수 있고 그게 아니면 내 앱에 저장할수 있도록 제공하였다.
DCLineActivity
를 기준으로 설명을 하자면, DCLineActivity
클래스는 일단 UIActivity
클래스를 상속받아서 사용하는데 (이건 당연하다.)몇가지 함수를 구현하면 된다. 하나하나씩 설명을 하자면 다음과 같다.
위의 3함수는 만든 UIActivity
에 대한 어떤 표시를 해주는 것이다. 그래서 activityType
을 정하고,
activityTitle
를 정하고, activityimage
를 지정해 주어야한다. 물론 nil도 가능하다. 그런데 title의 경우 실제 화면에서 아이콘 아래에 나오는 텍스트이며, image는 실제 보여지는 아이콘이다.
아이콘 이미지 지정시 주의할점 중 하나는 지정된 이미지에 회식의 둥근 테두리 박스가 쳐져서 보여진다는 점과 함께 컬러를 넣어도 흑백이 나온다는 점이다(iOS7에서만 그럴지도) 이 부분은 실제 테스트를 하면서 확인해 보시길 바란다.
자, 이제 보여지는 부분은 됐고, 실제 수행하는 부분을 보자
canPerformWithActivityItems
함수를 보면 LINE 앱의 URL을 열수 있는지 체크하는 부분이 보인다. 즉 이 함수에서는 어떤 행동을 할수 있는지를 검사하는 코드를 넣어야 한다. 어떤 앱과 연결할 것이라면, 해당 앱이 없으면 실행할 수가 없는것 처럼 말이다.
prepareWithActivityItems
함수는 NSArray
에서 데이터를 가져오는 부분을 볼수 있다. 간단히 말해서 이 함수는 어떤 실행 전에 데이터를 가져다 두는 작업을 하는 것이다. 예를 들어, LINE 에 어떤 문자열을 실행하도록 보낸다고 하면 문자열에 해당하는 데이터를 가져와야 한다. 이 데이터는 UIActivityController
를 호출할때 지정하면 된다. 이 부분은 호출하는 코드에서 좀더 자세히 설명하도록 하겠다.
performActivity
함수가 실제 우리가 원하는 액션을 하는 함수이다. 이 함수에서는 원하는 행동을 하는 코드를 작성한다. 위의 예제에서 보면 LINE 앱을 전달하려는 message를 실어서 여는 것을 확인할 수 있다.
별거 없다. 정리하자면, 실행할수 있는지 확인하고, 데이터 가져오고, 실행하고다.
호출하는 쪽 코드를 보자.
카카오, 라인앱에 대한 UIActivity 만든것에 대한 객체를 생성하고, UIActivityController
를 생성을 하는데 주의깊게 보자. 가장 중요한 부분은 activityItem
을 지정하는 부분으로 여기서는 나는 한우정보 문자열을 넣었다. 여기에 앞에서 말한 prepareWithActivityItems
함수에서 가져올 데이터를 넣어주면 된다. 그리고 나서 applicationActivities
에 어떤 UIActivity
를 보여줄것인가를 지정하면 된다. 앞에서 생성한 카카오, 라인앱에 대한 UIActivity
객체를 넣어주면된다.
실제로 해보면 별거 없다. 그냥 하면 된다. 이제 내 앱에 저장하기 기능을 UIActivity
로 만들었던 것을 소개한다. 이건 더 별거 없다. 일단 전체 코드를 보자. 그냥 눈에다 쑤셔박길.
보면 알겠지만 내가 만든 SaveActivity
는 내부에 저장을 한 후에, 저장되었는지 이미 저장이 되어 있는것인지에 따라서 팝업을 띄우게 되어 있다. 그런데 팝업을 처리하는 부분은 SaveActivity
내부가 아니라 호출한 부분에서 completionHandler
에서 activityType
과 bool 형 completed
변수에 따라서 처리를 해주고 있다. activityType
은 앞에서 설명했듯이 상속받는 클래스에서 재정의 해주면되는데 필자는 “SaveActivity” 라는 이름을 지정했다. completed
는 performActivity
함수 이후에 UIActivityViewController
를 닫아야 하는데 닫을때 지정해 줄수 있다. activityDidFinish
함수에 지정해 주면된다.
별거 없다. 필요한거 서브클래싱해서 만들면 되고 적당한 아이콘 웹에서 가져와서 사용하면된다.(저작권 주의, 언제부터?) 약간 분석을 하긴 했지만 그래두 몇 시간 투자해서 고민했던 부분이 깔끔해 져서 좋다. 비슷한 고민이 있으시다면 만들어 보시길.
2014/01/20 – [Programming/iOS] – (iOS) UIImagePickerController 이미지/동영상 저장하기
2013/09/27 – [Programming/iOS] – (iOS) UIAlertView TextField 추가 및 키보드 변경