SwiftUIでViewを画像としてUIActivityを利用してSNSに共有する

## はじめに🍁
SwiftUIで特定のViewをSNSにシェアするtipsを共有します🍙

## 使いたかったLPLinkMetadata
iOS13から使えるようになったLPLinkMetadataを利用します。
これを
![IMG_0373.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/cc2e1104-b1a5-c216-f985-9c0132d347c2.jpeg)
↓のようにすることができます。
![IMG_0372.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/8901554c-ac3c-1bfd-f39c-e37193ab5934.jpeg)

## UIActivityViewControllerをRepresentaぶる

UIActivityViewControllerをSwiftUIで扱えるようにします。

```swift
struct ShareSheet: UIViewControllerRepresentable {
    let photo: UIImage
          
    func makeUIViewController(context: Context) -> UIActivityViewController {
        let text = "🐥"
        let itemSource = ShareActivityItemSource(shareText: text, shareImage: photo)
        
        let activityItems: [Any] = [photo, text, itemSource]
        
        let controller = UIActivityViewController(
            activityItems: activityItems,
            applicationActivities: nil)
        
        return controller
    }
      
    func updateUIViewController(_ vc: UIActivityViewController, context: Context) {
    }
}
```

## iOS13からのLPLinkMetadataを使う

```swift
import LinkPresentation

class ShareActivityItemSource: NSObject, UIActivityItemSource {
    
    var shareText: String
    var shareImage: UIImage
    var linkMetaData = LPLinkMetadata()
    
    init(shareText: String, shareImage: UIImage) {
        self.shareText = shareText
        self.shareImage = shareImage
        linkMetaData.title = shareText
        super.init()
    }
    
    func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
        return UIImage(named: "AppIcon ") as Any
    }
    
    func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
        return nil
    }
    
    func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? {
        return linkMetaData
    }
}
```



## ViewをUIViewに変換する

[SwiftUI でViewをUIImageに変換する方法](https://qiita.com/tsuzuki817/items/a3d2470ba9df07ed0d99)
前回書いた記事を参考にSwiftUIのViewをUIImageに変更する方法をご参照ください。

## 作成したShareSheetをモーダルで呼び出す

```swift
struct TestPage: View {
    @State private var rect: CGRect = .zero
    @State private var uiImage: UIImage? = nil
  // modalを表示するためのフラグを持つ
    @State private var showShareSheet = false

    var body: some View {
        VStack {
            HStack {
                Image(systemName: "sun.haze")
                    .font(.title)
                    .foregroundColor(.white)
                Text("Hello, World!")
                    .font(.title)
                    .foregroundColor(.white)
            }
            .padding()
            .background(Color.blue)
            .cornerRadius(8)
            .background(RectangleGetter(rect: $rect))
            .onAppear() {
                
            }
            
            Button(action: {
                self.uiImage = UIApplication.shared.windows[0].rootViewController?.view!.getImage(rect: self.rect)
                self.showShareSheet.toggle()
            }) {
                Image(systemName: "square.and.arrow.up")
                    .resizable()
                    .aspectRatio(contentMode: .fit)
                    .frame(width: 50, height: 50)
                    .padding()
                    .background(Color.pink)
                    .foregroundColor(Color.white)
                    .mask(Circle())
            }.sheet(isPresented: self.$showShareSheet) {
              // 共有したいUIImageを渡す
                ShareSheet(photo: self.uiImage!)
            }.padding()
        }
    }
}
```

## 結果

![IMG_0374.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/aaff5732-a225-5bba-5d58-f94abf39d15e.jpeg)

ちゃんとツイートできました！

<blockquote class="twitter-tweet"><p lang="und" dir="ltr">🐥 <a href="https://t.co/tTDTeKlodD">pic.twitter.com/tTDTeKlodD</a></p>&mdash; つっきー@SwiftUI (@tsuzuki817) <a href="https://twitter.com/tsuzuki817/status/1201101604952240129?ref_src=twsrc%5Etfw">December 1, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 全体のコード
https://gist.github.com/tsuzukihashi/d08fce005a8d892741f4cf965533bd56