Contoh dasar untuk berbagi teks atau gambar dengan UIActivityViewController di Swift

132

Saya memulai pencarian saya dengan ingin tahu bagaimana saya bisa berbagi ke aplikasi lain di iOS. Saya menemukan bahwa ada dua cara penting

  • UIActivityViewController
  • UIDocumentInteractionController

Metode ini dan lainnya dibandingkan dalam jawaban SO ini .

Seringkali ketika saya mempelajari konsep baru, saya suka melihat contoh dasar untuk memulai. Setelah saya mendapatkan pengaturan dasar, saya dapat memodifikasinya sesuka saya.

Ada banyak pertanyaan SO terkait UIActivityViewController, tetapi saya tidak dapat menemukan yang hanya meminta contoh sederhana. Karena saya baru belajar cara melakukan ini, saya akan memberikan jawaban saya sendiri di bawah ini. Jangan ragu untuk menambahkan yang lebih baik (atau versi Objective-C).

Suragch
sumber

Jawaban:

279

Contoh Proyek UIActivityViewController

Siapkan papan cerita Anda dengan dua tombol dan kaitkan ke pengontrol tampilan Anda (lihat kode di bawah).

masukkan deskripsi gambar di sini

Tambahkan gambar ke Assets.xcassets Anda. Saya menyebut milik saya "singa".

masukkan deskripsi gambar di sini

Kode

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)
    }

}

Hasil

Mengklik "Bagikan beberapa teks" memberikan hasil di sebelah kiri dan mengklik "Bagikan gambar" memberikan hasilnya di sebelah kanan.

masukkan deskripsi gambar di sini

Catatan

  • Saya menguji ulang ini dengan iOS 11 dan Swift 4. Saya harus menjalankannya beberapa kali di simulator sebelum berhasil karena waktunya habis. Ini mungkin karena komputer saya lambat.
  • Jika Anda ingin menyembunyikan beberapa pilihan ini, Anda dapat melakukannya dengan excludedActivityTypesseperti yang ditunjukkan pada kode di atas.
  • Tidak termasuk popoverPresentationController?.sourceViewgaris akan menyebabkan aplikasi Anda mogok saat dijalankan di iPad.
  • Ini tidak memungkinkan Anda untuk berbagi teks atau gambar ke aplikasi lain. Anda mungkin menginginkannya UIDocumentInteractionController.

Lihat juga

Suragch
sumber
1
Mengapa beberapa contoh menunjukkan array 1 item, dan beberapa menunjukkan 2? Dengan asumsi berbagi gambar.
Lim Thye Chean
@ Suragch: Hai, saya ingin membagikan kode referensi dalam teks dan memerlukan kode itu untuk disalin pada klik atau ketuk seperti yang terjadi ketika kita mengirim nomor.
Ishika
74

Bagikan: Teks

@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)
}
}

Bagikan: Gambar

@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)
 }

Bagikan: Teks - Gambar - 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)
   }

masukkan deskripsi gambar di sini

Mr.Javed Multani
sumber
4
hei itu tidak bekerja. Di FB hanya tautan yang berbagi bukan gambar dan teks.
Ekta Padaliya
@ScriptKitty. Apakah aplikasi pesan dikonfigurasi dengan benar dengan akun i cloud?
Awais Fayyaz
1
@EktaPadaliya. Menurut kebijakan pembaruan FB, URL atau gambar dapat dibagikan. teks tidak bisa
Awais Fayyaz
2
@ Gambar Mr.JavedMultani tidak dibagikan di whatsapp
NickCoder
10

Saya menemukan ini berfungsi dengan sempurna jika Anda ingin berbagi seluruh layar.

@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)
}
Diavel Rider
sumber
9

Sama seperti catatan, Anda juga dapat menggunakan ini untuk iPad:

activityViewController.popoverPresentationController?.sourceView = sender

Jadi popover muncul dari pengirim (tombol dalam kasus itu).

Adrien Brecheteau
sumber
activityViewController.popoverPresentationController? .sourceView = pengirim sebagai? UIView -bekerja untuk saya. :) terima kasih
Brian
Kotak Bagikan tidak muncul untuk iPad. Ini memperbaiki masalah iPad yang saya alami!
Asp Upload
3

Anda dapat menggunakan fungsi berikut yang saya tulis di salah satu kelas pembantu saya dalam sebuah proyek.

panggil saja

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

dan itu akan bekerja untuk iPhone dan iPad. Jika Anda melewatkan nilai CGRect tampilan apa pun oleh sourceRect, itu juga akan menampilkan panah kecil di 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)
}
Mahmud Ahsan
sumber
Bekerja Sempurna! 👍🏻
Ravindra_Bhati
Alih-alih serangkaian ifpernyataan, Anda dapat menulis [url, image, msg].compactMap({ $0 }).
Avi
3

Saya telah menggunakan implementasi di atas dan baru saja saya mengetahui bahwa itu tidak berfungsi di iPad yang menjalankan iOS 13. Saya harus menambahkan baris-baris ini sebelum panggilan present () untuk membuatnya berfungsi

//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)
}

Begitulah cara kerjanya bagi saya

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)
    }
Bréndal Teixeira
sumber