स्विफ्ट में UIActivityViewController के साथ पाठ या छवि साझा करने के लिए मूल उदाहरण


131

मैंने यह जानना चाह कर अपनी खोज शुरू की कि मैं आईओएस में अन्य ऐप्स को कैसे साझा कर सकता हूं। मुझे पता चला कि दो महत्वपूर्ण तरीके हैं

  • UIActivityViewController
  • UIDocumentInteractionController

इन और अन्य तरीकों की तुलना इस एसओ उत्तर में की जाती है

अक्सर जब मैं एक नई अवधारणा सीख रहा होता हूं तो मुझे आरंभ करने के लिए एक मूल उदाहरण देखना पसंद होता है। एक बार जब मुझे कुछ बुनियादी सेट मिल जाता है तो मैं इसे संशोधित कर सकता हूं कि मुझे बाद में कैसा लगता है।

इससे संबंधित कई SO प्रश्न हैं UIActivityViewController, लेकिन मुझे ऐसा कोई भी नहीं मिला जो केवल एक सरल उदाहरण के लिए पूछ रहा हो। चूंकि मैंने अभी सीखा कि यह कैसे करना है, मैं नीचे अपना जवाब दूंगा। एक बेहतर (या एक उद्देश्य-सी संस्करण) जोड़ने के लिए स्वतंत्र महसूस करें।

जवाबों:


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 और स्विफ्ट 4 के साथ रिटेन किया। मुझे काम करने से पहले इसे सिम्युलेटर में एक दो बार चलाना पड़ा क्योंकि यह टाइमिंग आउट था। ऐसा इसलिए हो सकता है क्योंकि मेरा कंप्यूटर धीमा है।
  • यदि आप इनमें से कुछ विकल्प छिपाना चाहते हैं, तो आप ऐसा कर सकते हैं excludedActivityTypesजैसा कि ऊपर दिए गए कोड में दिखाया गया है।
  • popoverPresentationController?.sourceViewएक iPad पर चलने पर लाइन शामिल नहीं होने के कारण आपका ऐप क्रैश नहीं होगा।
  • यह आपको अन्य ऐप्स पर टेक्स्ट या चित्र साझा करने की अनुमति नहीं देता है। आप शायद उसके लिए चाहते हैं UIDocumentInteractionController

यह सभी देखें


1
कुछ उदाहरणों में 1 आइटम की सरणी क्यों दिखाई देती है, और कुछ 2 से पता चलता है? एक छवि को साझा करना मानते हैं।
लिम थी चने

@ Suragch: नमस्ते, मैं पाठ में एक रेफ़रल कोड साझा करना चाहता हूं और उस कोड को क्लिक पर कॉपी करने की आवश्यकता है या जब हम एक नंबर भेजते हैं तो ऐसा होता है।
इशिका 12

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

शेयर: पाठ - छवि - यूआरएल

   @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 में केवल लिंक ही शेयर है न कि इमेज और टेक्स्ट।
एकता पडलिया

@ScriptKitty। क्या i क्लाउड अकाउंट से मैसेज ऐप को ठीक से कॉन्फ़िगर किया गया है?
आवा फयाज

1
@EktaPadaliya। एफबी अपडेट नीति के अनुसार, एक यूआरएल या एक छवि साझा की जा सकती है। पाठ नहीं कर सकते
Awais Fayyaz


2
@ Mr.JavedMultani की छवि व्हाट्सएप में साझा नहीं की गई है
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

तो पॉपओवर प्रेषक (उस मामले में बटन) से पॉप होता है।


activityViewController.popoverPresentationController ?sourceView = प्रेषक के रूप में? UIView मेरे लिए काम करता है। :) धन्यवाद
ब्रायन

शेयर बॉक्स iPads के लिए नहीं आ रहा था। यह मेरे पास होने वाले 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 })
एवी

3

मैंने ऊपर कार्यान्वयन का उपयोग किया है और अभी मुझे पता चला है कि यह आईओएस पर चलने वाले आईपैड पर काम नहीं करता है। मुझे इन लाइनों को वर्तमान () कॉल से पहले जोड़ना था ताकि यह काम कर सके

//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)
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.