Share image on whatsapp using Swift

后端 未结 3 1817
深忆病人
深忆病人 2021-01-15 19:03

I\'m creating an application to share images via social media platforms but on WhatsApp especially. I tried using UIActivityViewController but it doesn\'t displ

相关标签:
3条回答
  • 2021-01-15 19:54

    You need to make the controller a member variable of the class, because controller must be retained.

    0 讨论(0)
  • 2021-01-15 20:04

    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 {
                   print("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

    0 讨论(0)
  • 2021-01-15 20:06

    I would like to share mini class for sharing image on Whatsapp, Instagram, Facebook and activity, it may helps someone..

    /* Common steps to use these codes */
    // 1- Download FBSharekit for sharing on Facebook
    // 2- Copy and Paste the following text to your "info.plist" (anywhere)
    /*
        <key>FacebookAppID</key>
        <string>08760425023140553</string> //This is a mock id, you must add your own real app id else it never will work
        <key>FacebookDisplayName</key>
        <string>DoYourBest</string> //Add your real app name here
        <key>LSApplicationQueriesSchemes</key>
        <array>
            <string>whatsapp</string>
            <string>instagram</string>
            <string>fbapi</string>
            <string>fb-messenger-share-api</string>
            <string>fbauth2</string>
            <string>fbshareextension</string>
        </array>
    */
    
    import FBSDKShareKit
    
    class ShareHelper: NSObject  {
    
        static func shareImageViaWhatsapp(image: UIImage, onView: UIView) {
            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) {
    
                        guard let imageData = image.pngData() else { debugPrint("Cannot convert image to data!"); return }
    
                        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: onView, animated: true)
    
                        } catch {
                            self.callAlertView(title: NSLocalizedString("information", comment: ""),
                                               message: "There was an error while processing, please contact our support team.",
                                               buttonText: "Close", fromViewController: topViewController!)
                            return
                        }
    
                    } else {
                        self.callAlertView(title: NSLocalizedString("warning", comment: ""),
                                           message: "Cannot open Whatsapp, be sure Whatsapp is installed on your device.",
                                           buttonText: "Close", fromViewController: topViewController!)
                    }
                }
            }
        }
    
        static func shareImageViaInstagram(image: UIImage, onView: UIView) {
            let urlWhats = "instagram://app"
            if let urlString = urlWhats.addingPercentEncoding(withAllowedCharacters:CharacterSet.urlQueryAllowed) {
                if let whatsappURL = URL(string: urlString) {
    
                    if UIApplication.shared.canOpenURL(whatsappURL as URL) {
    
                        guard let imageData = image.pngData() else { debugPrint("Cannot convert image to data!"); return }
    
                        let tempFile = URL(fileURLWithPath: NSHomeDirectory()).appendingPathComponent("Documents/fitbestPhoto.igo")
                        do {
                            try imageData.write(to: tempFile, options: .atomic)
                            self.documentInteractionController = UIDocumentInteractionController(url: tempFile)
                            self.documentInteractionController.uti = "com.instagram.exclusivegram"
                            self.documentInteractionController.presentOpenInMenu(from: CGRect.zero, in: onView, animated: true)
    
                        } catch {
                            self.callAlertView(title: NSLocalizedString("information", comment: ""),
                                               message: "There was an error while processing, please contact our support team.",
                                               buttonText: "Close", fromViewController: topViewController!)
                            return
                        }
    
                    } else {
                        self.callAlertView(title: NSLocalizedString("warning", comment: ""),
                                           message: "Cannot open Instagram, be sure Instagram is installed on your device.",
                                           buttonText: "Close", fromViewController: topViewController!)
                    }
                }
            }
        }
    
        static func shareImageViaFacebook(image: UIImage, fromViewController: UIViewController) {
    
            let sharePhoto = FBSDKSharePhoto()
            sharePhoto.image = image
            sharePhoto.isUserGenerated = true
    
            let content = FBSDKSharePhotoContent()
            content.photos = [sharePhoto]
    
            let dialog = FBSDKShareDialog()
            dialog.delegate = (fromViewController as! FBSDKSharingDelegate)
            dialog.fromViewController = fromViewController
            dialog.shareContent = content
            dialog.mode = .shareSheet
            dialog.show()
        }
    
        static func shareImageViaActivity(image: UIImage, onView: UIViewController) {
            let vc = UIActivityViewController(activityItems: [image], applicationActivities: [])
            // so that iPads won't crash
            if UIDevice.currentDevice().userInterfaceIdiom == .Pad {
                if let popoverController = vc.popoverPresentationController {
                    popoverController.sourceView = onView.view
                    popoverController.sourceRect = CGRect(x: onView.view.bounds.midX, y: onView.view.bounds.maxY, width: 0, height: 0)
                    popoverController.permittedArrowDirections = []
                }
            }
    
            // exclude some activity types from the list (optional)
            onView.present(vc, animated: true)
    
        }
    }
    

    NOTE = self.callAlertView(params...) is a method for calling customized UIAlertViewController so you can remove it and put your own logic code there.

    ////////////////////////////////////////////////////////////////////////

    UPDATE = I added sharing video via Whatsapp inside same function it it should changed like this :

    /**
     Shares photo or video via Whatsapp app if it's installed on device
     else it will navigate user to App Store Whatsapp page
    
      - Parameter sender: UIButton to show popup on this component.
      - Variable `isVideoMode`: Define var as `Bool` to specify type of sharing content.
      - Used functions: `getVideoData()` it's simple func converting video url to data
      - Used function: `CommonUtils.callAlertView(...)` it's simple func shows alert popup
    */
    private func shareViaWhatsapp(sender: UIButton) {
        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) {
    
                    let mediaData = isVideoMode ? getVideoData() : self.sharingImage?.jpegData(compressionQuality: 1.0)
                    let filepath: String = isVideoMode ? "Documents/whatsAppTmp.wam" : "Documents/whatsAppTmp.wai"
                    let tempFile = URL(fileURLWithPath: NSHomeDirectory()).appendingPathComponent(filepath)
                    let uti: String = isVideoMode ? "net.whatsapp.movie" : "net.whatsapp.image"
    
                    if let mediaData = mediaData {
    
                        do {
                            try mediaData.write(to: tempFile, options: .atomic)
                            self.docIntController = UIDocumentInteractionController(url: tempFile)
                            self.docIntController?.uti = uti
                            self.docIntController?.presentOpenInMenu(from: .zero, in: sender, animated: true)
    
                        } catch let error {
    
                            CommonUtils.callAlertView(title: NSLocalizedString("information", comment: ""),
                                                      message: "There was an error while processing due to :\(error.localizedDescription)",
                                                      buttonText: "Close", fromViewController: self)
                            return
                        }
                    }
    
    
                } else {
                    let storeUrlString = "https://itunes.apple.com/in/app/whatsapp-messenger/id310633997?mt=8"
                    UIApplication.shared.open(URL(string: storeUrlString)!, options: [:], completionHandler: nil)
                }
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题