꾸르꾸르

[iOS/Swift] UIActivityViewController - 파일 공유 하는법 (share 기능) - iphone 본문

개발/Swift

[iOS/Swift] UIActivityViewController - 파일 공유 하는법 (share 기능) - iphone

GGUGGU- 2020. 4. 19. 12:19

다시 포스팅 시작!

오늘은 iOS에서 파일을 다른앱 또는 내 아이폰에 저장하기 등을 하기 위해 share panel을 띄우고 거기로 파일을 공유하는 방법에 대해 알아보려고 합니다.

share panel이 뭔데? 라고 하시는분들이 계실거에요.

바로바로바로 이것입니다.

다들 이런 화면 한번쯤 보신적 있을꺼에요 ! (안드로이드에도 있는 기능이죠~! )

무언가를 공유하기 눌렀을때 밑에서 슝 하고 올라오는 이것!

이것을 share panel 이라고 부릅니다.

그럼 이 share(공유하기) 기능을 사용해보도록 하죠.ㅎㅎ

 

 

 

일단 xcode에서 테스트 프로젝트를 하나 만들어줍니다.

기본적인 싱글뷰로 ㄱ
Storyboard로만들고 unit test 와 ui테스트는 빼줍시다.

이렇게하고 프로젝트 생성!

하고 바로 main스토리보드로 가서 버튼 1개를 만듭시다!

버튼을 하나 만들어줍니다.
가운데 대충 놓아봅니다

이제 요 버튼이 눌리면 짠하고 share패널이 뜨게 해볼거에요~

share버튼 연결!

 

버튼 클릭시 동작 연결

 

짠~ 요렇게 해줍니당

 

요렇게 버튼을 뷰컨트롤러에 가져와주고 버튼 클릭시 액션도 가져와줍니다.

그리고 코딩해줍시당

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var shareButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    @IBAction func doShare(_ sender: Any) {
        let shareText: String = "share text test!"
        var shareObject = [Any]()
        
        shareObject.append(shareText)
        
        let activityViewController = UIActivityViewController(activityItems : shareObject, applicationActivities: nil)
        activityViewController.popoverPresentationController?.sourceView = self.view

        //activityViewController.excludedActivityTypes = [UIActivity.ActivityType.airDrop, UIActivity.ActivityType.postToFacebook,UIActivity.ActivityType.postToTwitter,UIActivity.ActivityType.mail]

        self.present(activityViewController, animated: true, completion: nil)
    }
    
}

 

 

 

사실 안에 내용은 별로 없고 

shareObject 요거를 Any배열로 만들어서 뭐든 집어 넣으시면됩니다.

텍스트던 url이던 동영상이던 파일이던.. 해서 배열에 append하고 UIActivityViewController를 만들어서 present를 뿅 하고 해주시면 됩니다.

주석 쳐놓은 excludedActivityTypes는 말그대로 공유 기능시 제외하고 싶은 어플을 등록하시는겁니다. 

저기에 저렇게 추가해놓으면 공유하기 누를시 해당 어플이 안뜹니당.

그리고 실행해보시면

짜잔!~ 요렇게 쉐어패널이뜹니당

요런식으로 짜잔하고 뜹니다!~ 

여기서 한발짝 더 나아가볼까요?

이제 쉐어를 성공했을때, 취소버튼을 눌렀을때, 쉐어도중 에러가 발생했을때 뭔가 새로운 처리를 해주고 싶은 경우 어떻게 해야할까요?

바로 completionWithItemsHandler 를 이용해주는것입니다!

이걸이용해서 성공 취소 에러했을때 toast메시지가 나오게 해보겠습니다.

(toast 메시지를 나오게 하는 방법은 해당 포스팅을 참고해주세요.)

https://royhelen.tistory.com/46

 

[iOS/Swift] Toast Message 만들기

이번 포스팅은 Toast Message를 만드는 방법을 포스팅하겠습니다~ 일단 Toast 메시지가 뭔지부터 보여드리겠습니다~ 바로 이것입니다. 기본적으로 Toast Message를 띄우는건 안드로이드에서는 자체 라이브러리가..

royhelen.tistory.com

코드를 추가해봅시다!

activityViewController.completionWithItemsHandler = { (activityType: UIActivity.ActivityType?, completed: Bool, arrayReturnedItems: [Any]?, error: Error?) in
    if completed {
        self.showToast(message: "share success")
    } else {
        self.showToast(message: "share cancel")
    }
    if let shareError = error {
        self.showToast(message: "\(shareError.localizedDescription)")
    }
}

뭐 코드는 어렵지 않죠?

위에서 만드신 코드에서 self.present 뒤에다가 이걸 붙여넣어주시면 끝! 

그럼 어떻게 작동되는지 직접 봐야겠죠?

일단 아까 만든 프로젝트에서 share버튼을 눌러서 share패널을 띄워봅시다.

이 상태에서 copy 버튼을 눌러줍니다. 어떤 동작이든 상관없어요. 저기서 어떤 action을 취해줍니다 (x표누르는것만 빼구요)

이렇게 하단에 토스트 메시지가 뙇!!

이번엔 X를 눌러볼까요?

share cancel 메시지가 뙇!!

요렇게 짜잔~ 실행됩니다!

즉 아까 if completed구문에 완료시 동작, cancel시 동작을 넣어주면 됩니다!

또한 에러시에 동작도 처리해줄수있겠죠~ 

 

프로젝트에 사용된 코드 전체를 보시려면 밑에 더보기를 클릭하세요

더보기
//
//  ViewController.swift
//  SharePanelPractice
//
//  Created by royhelen on 2020/04/19.
//  Copyright © 2020 royhelen. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var shareButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    @IBAction func doShare(_ sender: Any) {
        let shareText: String = "share text test!"
        var shareObject = [Any]()
        
        shareObject.append(shareText)
        
        let activityViewController = UIActivityViewController(activityItems : shareObject, applicationActivities: nil)
        activityViewController.popoverPresentationController?.sourceView = self.view

        //activityViewController.excludedActivityTypes = [UIActivity.ActivityType.airDrop, UIActivity.ActivityType.postToFacebook,UIActivity.ActivityType.postToTwitter,UIActivity.ActivityType.mail]

        self.present(activityViewController, animated: true, completion: nil)
        
        activityViewController.completionWithItemsHandler = { (activityType: UIActivity.ActivityType?, completed: Bool, arrayReturnedItems: [Any]?, error: Error?) in
            if completed {
                self.showToast(message: "share success")
            } else {
                self.showToast(message: "share cancel")
            }
            if let shareError = error {
                self.showToast(message: "\(shareError.localizedDescription)")
            }
        }
    }
    
    func showToast(message : String, font: UIFont = UIFont.systemFont(ofSize: 14.0)) {
        let toastLabel = UILabel(frame: CGRect(x: self.view.frame.size.width/2 - 75, y: self.view.frame.size.height-100, width: 150, height: 35))
        toastLabel.backgroundColor = UIColor.black.withAlphaComponent(0.6)
        toastLabel.textColor = UIColor.white
        toastLabel.font = font
        toastLabel.textAlignment = .center;
        toastLabel.text = message
        toastLabel.alpha = 1.0
        toastLabel.layer.cornerRadius = 10;
        toastLabel.clipsToBounds  =  true
        self.view.addSubview(toastLabel)
        UIView.animate(withDuration: 4.0, delay: 0.1, options: .curveEaseOut, animations: {
             toastLabel.alpha = 0.0
        }, completion: {(isCompleted) in
            toastLabel.removeFromSuperview()
        })
    }
}

 
정말 간단하게 공유하기 기능 포스팅 끝~!

 

ipad에서는 조금 더 줘야하는 설정들이 있는데 이건 요 포스팅을 참고해주세요!

https://royhelen.tistory.com/53

 

[iOS/Swift] 파일 공유 하는법 (share 기능) - ipad

안녕하세요! 지난번 포스팅에서 share panel을 만드는방법에 대해 포스팅했었는데요! (하단포스팅참조) http://royhelen.tistory.com/25 [iOS/Swift] 파일 공유 하는법 (share 기능) 다시 포스팅 시작! 오늘은 iOS..

royhelen.tistory.com

 

(궁금한점은 댓글 부탁드립니다)
Comments