[iOS] Share 기능 구현하기 +) 메타데이터?

 

Share 기능 구현하기

전체적인 로직은 다음과 같다.

etc-image-0

 

간단하다! 

 

 

 

초반 구현

etc-image-1

    func share(activeVC: UIActivityViewController) {
        activeVC.popoverPresentationController?.sourceView = self.view
        self.present(activeVC, animated: true)
    }

 

요런 식으로 작성했다.

다만, 내가 원하는 거랑 많이 달랐다 ,, ,, ㅠ,ㅠ

 

 

etc-image-2

 

짱나.

 

 

 

왜 내가 원하는 것과 다르게 나오는 걸까?

정답은 ActivityViewController를 구성하는 방법에 있다.

처음 코드에서는 String 배열로 ActivityuViewController에 들어가는 내용을 구성해 주었기 때문에 원하는 형식으로 들어가지 않는 것이다!

고렇다면 어떻게 구성해 주어야 할까?

 

 

 

 

최종 구현

import LinkPresentation
import UIKit

final class SharePinNumberActivityItemSource: NSObject, UIActivityItemSource {
    private var title: String
    private var content: String
    private var image: UIImage
    
    init(title: String, content: String, image: UIImage) {
        self.title = title
        self.content = content
        self.image = image
        
        super.init()
    }
    
    func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
        return content
    }
    
    func activityViewController(
        _ activityViewController: UIActivityViewController,
        itemForActivityType activityType: UIActivity.ActivityType?
    ) -> Any? {
        return content
    }
    
    func activityViewController(
        _ activityViewController: UIActivityViewController,
        subjectForActivityType activityType: UIActivity.ActivityType?
    ) -> String {
        return title
    }
    
    func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? {
        let metaData = LPLinkMetadata()
        metaData.title = title
        metaData.iconProvider = NSItemProvider(object: image)
        metaData.originalURL = URL(fileURLWithPath: content)
        return metaData
    }
}
    @objc func shareButtonTapped() {
        guard let post else { return }
        var thumb = UIImage()
        if let imageURL = post.image.first {
            KingfisherHelper.shared.fetchImage(imageURL: imageURL) { image, size in
                thumb = image
            } errorHandler: { error in
                print(error)
                self.delegate?.alert(title: error.localizedDescription)
                return
            }
        } else {
            contentView.backgroundColor = .background
            thumb = contentView.asImage()
        }
        let title = "\(post.nickname ?? "")님의 게시글 공유하기"
        let content = post.content ?? ""
        
        let items = [SharePinNumberActivityItemSource(title: title, content: content, image: thumb)]
        let activityVC = UIActivityViewController(activityItems: items, applicationActivities: nil)
        delegate?.share(activeVC: activityVC)
    }

 

위와 같이 구성해주었다.

SharePinNumberActivityItemSource class의 activityViewControllerLinkMetadata(_:) 함수를 통해 ActivityViewController의 metaData를 구성해 준다.

 

 

 

 

아하, 우리가 구성해 주고 싶었던 그 윗부분들은 .. ..

etc-image-3

 

각각의 메타데이터로 구성되어 있는 것이다! 

 

~,~ 간단하게 메타데이터가 뭔지 알아보구 가자.

 

 

메타데이터

  • 데이터를 설명하기 위한 데이터
  • 어떤 정보가 미리 포함되어 있는지 알려주는 역할을 함
  • 특정 정보의 인덱스 역할
  • 사용하는 사람에게는 보이지 않지만 컴퓨터는 이를 이해하고 이용한다.

 

... ... 요기까지만 들었을 때는 아니 몬소린데?!?!!?!? 싶다.

 

나는 메타데이터가 링크와 검색에 사용된다는 걸 듣고 빡 이해가 됐다.

@: 왜 혼자만 이해하시는데요?

아니들어보세요!!

 

메타데이터는 데이터를 설명하기 위한 데이터라고 했다. 그러니까, 회원가입이라는 데이터가 있다고 하자. 이 데이터를 메타라고 한다.

회원가입 안에는 회원가입을 구성하는 여러 데이터들이 있을 것이다. 뭐, 아이디도 있고 성별도 있고 나이도 있고....

우리는 아이디와 성별, 나이 같은 메타의 작은 데이터들을 메타 데이터라고 한다.

또한, 이 회원가입이라는 데이터 안에서 특정 기준으로 검색을 하거나 하려고 한다면? 설정한 아이디나 나이, 성별을 통해서 검색할 수 있을 것이다. 왜, 여자인 회원. 아님 20살이 넘는 회원~ 이렇게!!!!!!!!!!!!!!!!!!!

구래서 메타 데이터를 설명하는 말에 데이터를 설명하기 위한 데이터, 데이터 안에 어떤 정보가 포함되어 있는지 알려주는 역할, 인덱스 어쩌구 하는 내용이 들어가는 것이다.

 

 

근데 ,, 이 메타 데이터가 왜? 링크에? 사용될까?

빠른답변: 걔도 하나의 데이터고!!! 검색할 때 색인 역할을 할 친구가 필요하니까!!!!!!! (index)

 

 

 

^___^ b

 

 

왠지 코드보다는 메타데이터 설명에 치중된 것 같지만 ,, 기분탓이다

 

 

 

코드는 ,, 따라치면서 저. 혼자 이해햇고 메타데이터를 이해하는 시간은 코드를 이해하는 시간보다 더 걸렸걸랑요

사실 코드와 LinkPresentation은 WWDC 돌려보면 완전히 이해는 안 되지만 ㅇㅋ 어케 쓰는지는 알겠다!! 상태는 되걸랑요

아무튼그렇습니다

 

 

 

얼마 전 새벽에 공유 기능을 구현했는데 오랜만에 꼬리에 꼬리를 물고 질문이 나와서 너무 즐거웠다.

코딩을 완존 처음 했을 때로 돌아간 기분... 새로운 게 왕창 들어와서 뭐가 뭔지 아무것도 모르겠는데 찾아볼수록 아 나 그래도 어제보다 좀 낫네 ㅋㅋ 오늘은 이것도 아네 ㅋㅋ 하는 기분...........

생각의 흐름은 공유 기능 구현하기 -> 근데 이거 왜 맘대루 안 되지? -> 아무튼 구현은 했는데 Link Presentation은 뭘까? -> MetaData로 구성되어 있다고? MetaData가 뭔데? 순으로 갔던 것 같다.

ㄹㅇ 생각의 흐름대로 글도 구성했기 땜에 왠지 중구난방이 된 느낌...

사실 지금 졸려서 그런 것도 있는듯 ㄱ-

 

이번 연휴 기간에 여러 가지로 바빠서 미뤄놨던 글을 꼭!!!! 쓰고 싶어서...

일단 젤 쓰기 쉬운 것부터 그냥 죽죽 쓰고 있는데 이게 잘 쓰고 있는 건지 모르겠다

 

 

 

 

 

참고 자료

https://developer.apple.com/videos/play/wwdc2019/262/

 

Embedding and Sharing Visually Rich Links - WWDC19 - Videos - Apple Developer

The new Link Presentation framework enables app developers to easily present URLs in a rich, beautiful, and consistent way. Learn how to...

developer.apple.com

https://developer.apple.com/documentation/uikit/uiactivityitemsource/3144571-activityviewcontrollerlinkmetada

 

activityViewControllerLinkMetadata(_:) | Apple Developer Documentation

Returns metadata to display in the preview header of the share sheet.

developer.apple.com

https://devtalk.kakao.com/t/topic/115240

 

카카오톡에 링크 공유하기 시, 메타데이터 정보가 하단에 표시되지 않습니다

https://the-cult.co.kr 위의 도메인 링크를 카카오톡에서 공유 했을 경우, 메타데이터 정보가 하단에 일체 표시되지 않습니다. (보통 메타데이터가 없어도 하단에 “미리보기 없음” 이라도 뜨는걸로

devtalk.kakao.com

https://lidium.tistory.com/17

 

[iOS] LinkPresentation

이번주에는 굉장히 생소할 수도 있는 주제를 골랐습니다. 프로젝트를 하나 기획했는데, (비록 물거품이 되었지만) 그 주제에서 필요했던 기능이었습니다. 무위로 돌아갔지만 재미있는 기능이겠

lidium.tistory.com

https://yagom.net/forums/topic/linkpresentation/

 

LinkPresentation - 야곰닷넷

이번주에는 굉장히 생소할 수도 있는 주제를 골랐습니다. ToyProject를 하나 기획했는데, (비록 물거품이 되었지만) 그 주제에서 […]

yagom.net

https://velog.io/@minji0801/iOS-Swift-텍스트-또는-이미지-공유하기

 

[iOS | Swift] 텍스트 또는 이미지 공유하기

UIActivityViewController로 텍스트와 이미지를 공유하기

velog.io

 

'iOS > App' 카테고리의 다른 글

[iOS] 앱의 생명 주기(App's Life Cycle)  (0) 2024.01.30
[SwiftUI] Widget Padding 없애기  (0) 2024.01.07
[iOS] UI Test와 Unit Test  (0) 2023.12.13
[iOS] NavigationBar BackgroundColor 노치까지 채우기  (0) 2023.12.02
[RxSwift] Single  (1) 2023.11.21