ตัวอย่างพื้นฐานสำหรับการแชร์ข้อความหรือรูปภาพกับ UIActivityViewController ใน Swift


132

ฉันเริ่มการค้นหาโดยต้องการทราบว่าฉันจะแชร์กับแอปอื่น ๆ ใน 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: สวัสดีฉันต้องการแบ่งปันรหัสอ้างอิงในข้อความและต้องการให้คัดลอกรหัสเมื่อคลิกหรือแตะตามที่เกิดขึ้นเมื่อเราส่งหมายเลข
Ishika

74

แบ่งปัน:ข้อความ

@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

@ScriptKitty แอพข้อความถูกกำหนดค่าอย่างเหมาะสมกับบัญชี i cloud หรือไม่
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

คุณสามารถใช้สิ่งนี้กับไอแพดได้เช่นกัน:

activityViewController.popoverPresentationController?.sourceView = sender

ดังนั้น popover จะปรากฏขึ้นจากผู้ส่ง (ปุ่มในกรณีนั้น)


activityViewController.popoverPresentationController? .sourceView = ผู้ส่งเป็น? UIView ทำงานสำหรับฉัน :) ขอบคุณ
Brian

กล่องแบ่งปันไม่ได้เกิดขึ้นสำหรับ iPads นี่เป็นการแก้ไขปัญหาของ iPad ที่ฉันมี!
Asp อัพโหลด

3

คุณอาจใช้ฟังก์ชั่นต่อไปนี้ซึ่งฉันเขียนไว้ในหนึ่งในคลาสผู้ช่วยของฉันในโครงการ

เพียงแค่โทร

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

และมันจะใช้ได้ทั้ง iPhone และ iPad หากคุณผ่านค่า CGRect ของมุมมองใด ๆ ตาม sourceRect มันจะแสดงลูกศรเล็ก ๆ ใน 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

ฉันใช้การดำเนินการด้านบนและตอนนี้ฉันรู้ว่ามันไม่ทำงานบน iPad ที่ใช้ iOS 13 ฉันต้องเพิ่มบรรทัดเหล่านี้ก่อนการโทรปัจจุบัน () เพื่อให้สามารถใช้งานได้

//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.