Swift에서 UIActivityViewController와 텍스트 또는 이미지를 공유하는 기본 예제


131

iOS에서 다른 앱과 공유 할 수있는 방법을 알고 검색을 시작했습니다. 두 가지 중요한 방법은

  • UIActivityViewController
  • UIDocumentInteractionController

이 방법과 다른 방법은 이 SO 답변 에서 비교됩니다 .

새로운 개념을 배우고있을 때 종종 시작하기위한 기본 예를보고 싶습니다. 기본 설정이 완료되면 나중에 좋아하는 방식으로 수정할 수 있습니다.

와 관련된 많은 SO 질문이 UIActivityViewController있지만 간단한 예를 요구하는 것을 찾을 수 없었습니다. 방금이 작업을 수행하는 방법을 배웠으므로 아래에서 내 답변을 제공 할 것입니다. 더 나은 버전 (또는 Objective-C 버전)을 자유롭게 추가하십시오.

답변:


279

UIActivityViewController 예제 프로젝트

두 개의 버튼으로 스토리 보드를 설정하고 뷰 컨트롤러에 연결하십시오 (아래 코드 참조).

여기에 이미지 설명을 입력하십시오

Assets.xcassets에 이미지를 추가하십시오. 나는 "사자"라고 불렀습니다.

여기에 이미지 설명을 입력하십시오

암호

import UIKit
class ViewController: UIViewController {

    // share text
    @IBAction func shareTextButton(_ sender: UIButton) {

        // text to share
        let text = "This is some text that I want to share."

        // set up activity view controller
        let textToShare = [ text ]
        let activityViewController = UIActivityViewController(activityItems: textToShare, applicationActivities: nil)
        activityViewController.popoverPresentationController?.sourceView = self.view // so that iPads won't crash

        // exclude some activity types from the list (optional)
        activityViewController.excludedActivityTypes = [ UIActivityType.airDrop, UIActivityType.postToFacebook ]

        // present the view controller
        self.present(activityViewController, animated: true, completion: nil)

    }

    // share image
    @IBAction func shareImageButton(_ sender: UIButton) {

        // image to share
        let image = UIImage(named: "Image")

        // set up activity view controller
        let imageToShare = [ image! ]
        let activityViewController = UIActivityViewController(activityItems: imageToShare, applicationActivities: nil)
        activityViewController.popoverPresentationController?.sourceView = self.view // so that iPads won't crash

        // exclude some activity types from the list (optional)
        activityViewController.excludedActivityTypes = [ UIActivityType.airDrop, UIActivityType.postToFacebook ]

        // present the view controller
        self.present(activityViewController, animated: true, completion: nil)
    }

}

결과

"텍스트 공유"를 클릭하면 왼쪽에 결과가 표시되고 "이미지 공유"를 클릭하면 오른쪽에 결과가 표시됩니다.

여기에 이미지 설명을 입력하십시오

노트

  • iOS 11 및 Swift 4에서 이것을 다시 테스트했습니다. 시간이 초과되어 작동하기 전에 시뮬레이터에서 몇 번 실행해야했습니다. 내 컴퓨터가 느리기 때문일 수 있습니다.
  • 이러한 선택 중 일부를 숨기려면 excludedActivityTypes위의 코드 와 같이 그렇게 할 수 있습니다 .
  • popoverPresentationController?.sourceView줄을 포함하지 않으면 iPad에서 실행될 때 앱이 중단됩니다.
  • 텍스트 나 이미지를 다른 앱과 공유 할 수 없습니다. 당신은 아마 그것을 원할 것 UIDocumentInteractionController입니다.

또한보십시오


1
왜 어떤 예제는 1 개의 아이템 배열을 보여주고 어떤 예제는 2를 보여줍니까? 이미지 공유를 가정합니다.
Lim Thye Chean

@ Suragch : 안녕하세요. 텍스트에 추천 코드를 공유하고 싶습니다. 숫자를 보낼 때 발생하는 클릭 또는 탭으로 해당 코드를 복사해야합니다.
이시카

73

공유 : 텍스트

@IBAction func shareOnlyText(_ sender: UIButton) {
    let text = "This is the text....."
    let textShare = [ text ]
    let activityViewController = UIActivityViewController(activityItems: textShare , applicationActivities: nil)
    activityViewController.popoverPresentationController?.sourceView = self.view 
    self.present(activityViewController, animated: true, completion: nil)
}
}

공유 : 이미지

@IBAction func shareOnlyImage(_ sender: UIButton) {
    let image = UIImage(named: "Product")
    let imageShare = [ image! ]
    let activityViewController = UIActivityViewController(activityItems: imageShare , applicationActivities: nil)
    activityViewController.popoverPresentationController?.sourceView = self.view 
    self.present(activityViewController, animated: true, completion: nil)
 }

공유 : 텍스트-이미지-URL

   @IBAction func shareAll(_ sender: UIButton) {
    let text = "This is the text...."
    let image = UIImage(named: "Product")
    let myWebsite = NSURL(string:"https://stackoverflow.com/users/4600136/mr-javed-multani?tab=profile")
    let shareAll= [text , image! , myWebsite]
    let activityViewController = UIActivityViewController(activityItems: shareAll, applicationActivities: nil)
    activityViewController.popoverPresentationController?.sourceView = self.view 
    self.present(activityViewController, animated: true, completion: nil)
   }

여기에 이미지 설명을 입력하십시오


4
이봐, 작동하지 않아. FB에서만 링크는 이미지와 텍스트가 아닌 공유입니다.
Ekta Padaliya

@ 스크립트 키티. i 클라우드 계정으로 메시지 앱이 올바르게 구성되어 있습니까?
Awais Fayyaz

1
@EktaPadaliya. FB 업데이트 정책에 따라 URL 또는 이미지를 공유 할 수 있습니다. 텍스트 수 없습니다
Awais Fayyaz


2
@ Mr.JavedMultani 이미지는 whatsapp에서 공유되지 않습니다
NickCoder

10

전체 화면을 공유하려면이 기능이 완벽하게 작동한다는 것을 알았습니다.

@IBAction func shareButton(_ sender: Any) {

    let bounds = UIScreen.main.bounds
    UIGraphicsBeginImageContextWithOptions(bounds.size, true, 0.0)
    self.view.drawHierarchy(in: bounds, afterScreenUpdates: false)
    let img = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    let activityViewController = UIActivityViewController(activityItems: [img!], applicationActivities: nil)
    activityViewController.popoverPresentationController?.sourceView = self.view
    self.present(activityViewController, animated: true, completion: nil)
}

9

참고로 iPad에도 사용할 수 있습니다.

activityViewController.popoverPresentationController?.sourceView = sender

따라서 팝 오버는 발신자 (이 경우 버튼)에서 팝업됩니다.


activityViewController.popoverPresentationController? .sourceView = 발신자로? UIView-나를 위해 일했습니다. :) 감사합니다
Brian

공유 상자가 iPad 용으로 제공되지 않았습니다. 이것은 내가 가진 iPad 문제를 해결했습니다!
Asp 업로드

3

프로젝트의 도우미 클래스 중 하나에서 작성한 다음 기능을 사용할 수 있습니다.

그냥 전화

showShareActivity(msg:"message", image: nil, url: nil, sourceRect: nil) 

iPhone과 iPad 모두에서 작동합니다. sourceRect로보기의 CGRect 값을 전달하면 iPad에도 작은 화살표가 표시됩니다.

func topViewController()-> UIViewController{
    var topViewController:UIViewController = UIApplication.shared.keyWindow!.rootViewController!

    while ((topViewController.presentedViewController) != nil) {
        topViewController = topViewController.presentedViewController!;
    }

    return topViewController
}

func showShareActivity(msg:String?, image:UIImage?, url:String?, sourceRect:CGRect?){
    var objectsToShare = [AnyObject]()

    if let url = url {
        objectsToShare = [url as AnyObject]
    }

    if let image = image {
        objectsToShare = [image as AnyObject]
    }

    if let msg = msg {
        objectsToShare = [msg as AnyObject]
    }

    let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
    activityVC.modalPresentationStyle = .popover
    activityVC.popoverPresentationController?.sourceView = topViewController().view
    if let sourceRect = sourceRect {
        activityVC.popoverPresentationController?.sourceRect = sourceRect
    }

    topViewController().present(activityVC, animated: true, completion: nil)
}

완벽하게 작동합니다! 👍🏻
Ravindra_Bhati

일련의 if진술 대신을 쓸 수 있습니다 [url, image, msg].compactMap({ $0 }).
Avi

3

위의 구현을 사용했으며 지금은 iOS 13을 실행하는 iPad에서 작동하지 않는다는 것을 알게되었습니다.

//avoiding to crash on iPad
if let popoverController = activityViewController.popoverPresentationController {
     popoverController.sourceRect = CGRect(x: UIScreen.main.bounds.width / 2, y: UIScreen.main.bounds.height / 2, width: 0, height: 0)
     popoverController.sourceView = self.view
     popoverController.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
}

그것이 나를 위해 작동하는 방법입니다

func shareData(_ dataToShare: [Any]){

        let activityViewController = UIActivityViewController(activityItems: dataToShare, applicationActivities: nil)

        //exclude some activity types from the list (optional)
        //activityViewController.excludedActivityTypes = [
            //UIActivity.ActivityType.postToFacebook
        //]

        //avoiding to crash on iPad
        if let popoverController = activityViewController.popoverPresentationController {
            popoverController.sourceRect = CGRect(x: UIScreen.main.bounds.width / 2, y: UIScreen.main.bounds.height / 2, width: 0, height: 0)
            popoverController.sourceView = self.view
            popoverController.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
        }

        self.present(activityViewController, animated: true, completion: nil)
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.