Search code examples
iosfirebase-dynamic-linksimessage

Firebase Dynamic Links with Social Metadata not showing image on iMessage (iOS Messages)


I'm having issues with dynamic links and social metadata. Seems to work fine when sharing on Facebook... image is attached properly. But when I share using Messages on iOS... no image appears. Just the Firebase folder logo.

enter image description here


Solution

  • I had the exact same issue and I found a way to show preview image in iMessage by creating LPLinkMetadata of LinkPresentation. It seems to be working even though it's not solving the core issue.

    Basically, I downloaded the image to show in the preview first and create LPLinkMetadata based on that image.

    let image = UIImage(data: data)! //Image to show in preview
    let metadata = LPLinkMetadata()
    metadata.imageProvider = NSItemProvider(object: image)
    metadata.originalURL = url //dynamic links
    metadata.title = "Holland Bloorview Kids Rehabilitation Hospital on Flixxaid"
    
    let metadataItemSource = LinkPresentationItemSource(metaData: metadata)
    let activity = UIActivityViewController(activityItems: [metadataItemSource], applicationActivities: [])
    self.present(activity, animated: true)
    

    And LinkPresentaionItemSource is from this blog.

    class LinkPresentationItemSource: NSObject, UIActivityItemSource {
        var linkMetaData = LPLinkMetadata()
    
        //Prepare data to share
         func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? {
            return linkMetaData
        }
    
        //Placeholder for real data, we don't care in this example so just return a simple string
        func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
            return "Placeholder"
        }
    
        /// Return the data will be shared
        /// - Parameters:
        ///   - activityType: Ex: mail, message, airdrop, etc..
        func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
            return linkMetaData.originalURL
        }
        
        init(metaData: LPLinkMetadata) {
            self.linkMetaData = metaData
        }
    }