4T2F / ThinkBig

πŸŒŸμ”½ν¬λΉ… μŠ€ν„°λ””πŸŒŸ
5 stars 1 forks source link

iOS - SharePanel [ ShareLink & UIActivityViewController ] #83

Open Phangg opened 1 month ago

Phangg commented 1 month ago

iOS 의 SharePanel ?

SwiftUI - ShareLink

UIKit - UIActivityViewController

Phangg commented 1 month ago

iOS - SharePanel

SharePanel

μ•±μ—μ„œ 보톡 이런 곡유λ₯Ό μœ„ν•œ μ‹œνŠΈλ₯Ό SharePanel 이라고 ν‘œν˜„ ( ShareSheet ) κ·Έλ ‡λ‹€λ©΄ iOS μ—μ„œλŠ” μ–΄λ–»κ²Œ μ € κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆμ„κΉŒ? UI λ₯Ό λ‹΄λ‹Ήν•˜λŠ” 2κ°€μ§€μ˜ ν”„λ ˆμž„μ›Œν¬μ—μ„œ 각각 μ•Œμ•„λ³΄μž


SwiftUI - ShareLink

ShareLink


UIKit - UIActivityViewController

// MARK: - ActivityItem // UIActivityViewController 의 activityItems 에 λ“€μ–΄κ°ˆ ꡬ쑰체 νƒ€μž… 생성 struct ActivityItem: Equatable { var items: [ActivityItemSource] // Any κ°€ μ•„λ‹Œ, ActivityItemSource νƒ€μž…μ„ μ‚¬μš© var activities: [UIActivity]? var excludedTypes: [UIActivity.ActivityType]

static func == (lhs: ActivityItem, rhs: ActivityItem) -> Bool {
    lhs.activities == rhs.activities
}

// items: `UIActivityViewController` λ₯Ό 톡해 κ³΅μœ ν•  μ•„μ΄ν…œ
// activities: μ‹œνŠΈμ— ν¬ν•¨μ‹œν‚€κ³ μž ν•˜λŠ” μ»€μŠ€ν…€ `UIActivity`
init(
    items: [ActivityItemSource],
    activities: [UIActivity]? = nil,
    excludedTypes: [UIActivity.ActivityType] = []
) {
    self.items = items
    self.activities = activities
    self.excludedTypes = excludedTypes
}

}

```swift
// MARK: - Custom 된 ActivityItemSource
// μ•„μ΄ν…œ νƒ€μž… μ»€μŠ€ν…€ - UIActivityItemSource 채택
final class ActivityItemSource: NSObject, UIActivityItemSource {
    private let url: URL

    init(url: URL) {
        self.url = url
        super.init()
    }

    func activityViewControllerPlaceholderItem(
        _ activityViewController: UIActivityViewController
    ) -> Any {
        return url
    }

    func activityViewController(
        _ activityViewController: UIActivityViewController,
        itemForActivityType activityType: UIActivity.ActivityType?
    ) -> Any? {
        return url
    }

    func activityViewController(
        _ activityViewController: UIActivityViewController,
        subjectForActivityType activityType: UIActivity.ActivityType?
    ) -> String {
        return AppLocalized.fileDescription
    }

    func activityViewController(
        _ activityViewController: UIActivityViewController,
        thumbnailImageForActivityType activityType: UIActivity.ActivityType?,
        suggestedSize size: CGSize
    ) -> UIImage? {
        return UIImage(named: AppLocalized.appIcon) ?? UIImage()
    }

    func activityViewControllerLinkMetadata(
        _ activityViewController: UIActivityViewController)
    -> LPLinkMetadata? {
        let metadata = LPLinkMetadata()
        metadata.iconProvider = NSItemProvider(
            object: UIImage(named: AppLocalized.appIcon) ?? UIImage())
        metadata.title = url.lastPathComponent
        let size = url.formattedFileSize()
        let type = AppLocalized.fileDescription
        let subtitleString = "\(type) \(size)"
        metadata.originalURL = URL(fileURLWithPath: subtitleString)
        return metadata
    }
}

참고자료

ShareLink - κ·Έλ¦° λΈ”λ‘œκ·Έ ShareLink - appcoda κΈ€ UIActivityViewController - κ³΅μ‹λ¬Έμ„œ UIActivityViewController / UIActivityItemSource - κ³΅μ‹λ¬Έμ„œ UIActivityViewController - ActivityType κ΄€λ ¨ UIActivityViewController - medium λΈ”λ‘œκ·Έ UIActivityViewController - μœ„ medium λΈ”λ‘œκ·Έ GitHub μ½”λ“œ UIActivityViewController / Metadata - λΈ”λ‘œκ·Έ