Dinesh Jeyasankar
Dinesh Jeyasankar

Reputation: 1063

Swift UIActivityViewController Image Share not working

I am using UIActivityViewController to share image. After the WhatsApp recent changes to allow share i am able to see WhatsApp in the share option. I am sharing an image and message, I can see the text message but i am not able to share images. The same code works fine with Viber, FB, twitter etc., Not sure what i am missing for WhatsApp.

func shareImage() {
    var messageStr:String  = "Check out my awesome photo!"
    var img: UIImage = currentPhoto!

    var shareItems:Array = [img, messageStr]

    let activityViewController:UIActivityViewController = UIActivityViewController(activityItems: shareItems, applicationActivities: nil)
    activityViewController.excludedActivityTypes = [UIActivityTypePrint, UIActivityTypePostToWeibo, UIActivityTypeCopyToPasteboard, UIActivityTypeAddToReadingList, UIActivityTypePostToVimeo]

    self.presentViewController(activityViewController, animated: true, completion: nil)

}

Upvotes: 18

Views: 23050

Answers (3)

Nithinbemitk
Nithinbemitk

Reputation: 2720

In Swift 3 use this code

 @IBAction func whatsappShareWithImages(_ sender: AnyObject)
    {

        let urlWhats = "whatsapp://app"
        if let urlString = urlWhats.addingPercentEncoding(withAllowedCharacters:CharacterSet.urlQueryAllowed) {
            if let whatsappURL = URL(string: urlString) {

                if UIApplication.shared.canOpenURL(whatsappURL as URL) {

                    if let image = UIImage(named: "whatsappIcon") {
                        if let imageData = UIImageJPEGRepresentation(image, 1.0) {
                            let tempFile = URL(fileURLWithPath: NSHomeDirectory()).appendingPathComponent("Documents/whatsAppTmp.wai")
                            do {
                                try imageData.write(to: tempFile, options: .atomic)
                                self.documentInteractionController = UIDocumentInteractionController(url: tempFile)
                                self.documentInteractionController.uti = "net.whatsapp.image"
                                self.documentInteractionController.presentOpenInMenu(from: CGRect.zero, in: self.view, animated: true)

                            } catch {
                                print(error)
                            }
                        }
                    }

                } else {
                    // Cannot open whatsapp
                }
            }
        }

    }

Add this code in your app "plist"

  <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>whatsapp</string>
    </array>

You can also refer to small app for reference : https://github.com/nithinbemitk/iOS-Whatsapp-Share

Upvotes: 0

Zaid Pathan
Zaid Pathan

Reputation: 16820

To share Text || Image try this Swift.

func share(shareText shareText:String?,shareImage:UIImage?){

    var objectsToShare = [AnyObject]()

    if let shareTextObj = shareText{
        objectsToShare.append(shareTextObj)
    }

    if let shareImageObj = shareImage{
        objectsToShare.append(shareImageObj)
    }

    if shareText != nil || shareImage != nil{
        let activityViewController = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
        activityViewController.popoverPresentationController?.sourceView = self.view

        presentViewController(activityViewController, animated: true, completion: nil)
    }else{
        print("There is nothing to share")
    }
}

To share just call like this:

let imageToShare = UIImage(named: "myImage")
share(shareText: "Sharing this text", shareImage: imageToShare)

Upvotes: 6

Dinesh Jeyasankar
Dinesh Jeyasankar

Reputation: 1063

It seems like WhatsApp shares image only when the array contains images and not combination of both image and text.

func shareImage() {
    //var messageStr:String  = "Check out my awesome iPicSafe photo!"
    var img: UIImage = currentPhoto!
    //var shareItems:Array = [img, messageStr]
    var shareItems:Array = [img]
    let activityViewController:UIActivityViewController = UIActivityViewController(activityItems: shareItems, applicationActivities: nil)
    activityViewController.excludedActivityTypes = [UIActivityTypePrint, UIActivityTypePostToWeibo, UIActivityTypeCopyToPasteboard, UIActivityTypeAddToReadingList, UIActivityTypePostToVimeo]
    self.presentViewController(activityViewController, animated: true, completion: nil)
}

Upvotes: 24

Related Questions