import UIKitimport SwiftUI// 1. Activity Viewstruct ActivityView: UIViewControllerRepresentable {let text: Stringfunc makeUIViewController(context: UIViewControllerRepresentableContext<ActivityView>) -> UIActivityViewController {return UIActivityViewController(activityItems: [text], applicationActivities: nil)}func updateUIViewController(_ uiViewController: UIActivityViewController, context: UIViewControllerRepresentableContext<ActivityView>) {}}// 2. Share Textstruct ShareText: Identifiable {let id = UUID()let text: String}struct ContentView: View {// 3. Share Text State@State var shareText: ShareText?var body: some View {VStack {Button("Show Activity View") {// 4. New Identifiable Share TextshareText = ShareText(text: "Hola 😀")}.padding()}// 5. Sheet to display Share Text.sheet(item: $shareText) { shareText inActivityView(text: shareText.text)}}}
iOS 16 includes the ShareLink
view which works like this:
Gallery(...).toolbar {ShareLink(item: image, preview: SharePreview("Birthday Effects"))}
Source: https://developer.apple.com/videos/play/wwdc2022/10052/
Time code offset: 25 minutes 28 seconds
To avoid warning, change the way you retrieve the window scene.Do the following:
Button {let TextoCompartido = "Hola 😀 "let AV = UIActivityViewController(activityItems: [TextoCompartido], applicationActivities: nil)let scenes = UIApplication.shared.connectedSceneslet windowScene = scenes.first as? UIWindowScenewindowScene?.keyWindow?.rootViewController?.present(AV, animated: true, completion: nil)}
Tested in in iOS 15 with SwiftUI
func shareViaActionSheet() {if vedioData.vedioURL != nil {let activityVC = UIActivityViewController(activityItems: [vedioData.vedioURL as Any], applicationActivities: nil)UIApplication.shared.currentUIWindow()?.rootViewController?.present(activityVC, animated: true, completion: nil)}}
To avoid iOS 15 method deprecation warning use this extension
public extension UIApplication {func currentUIWindow() -> UIWindow? {let connectedScenes = UIApplication.shared.connectedScenes.filter { $0.activationState == .foregroundActive }.compactMap { $0 as? UIWindowScene }let window = connectedScenes.first?.windows.first { $0.isKeyWindow }return window}}
you could try the following using the answer from: How to get rid of message " 'windows' was deprecated in iOS 15.0: Use UIWindowScene.windows on a relevant window scene instead" with AdMob banner?
Note that your code works for me, but the compiler give the deprecation warning.
public extension UIApplication {func currentUIWindow() -> UIWindow? {let connectedScenes = UIApplication.shared.connectedScenes.filter({$0.activationState == .foregroundActive}).compactMap({$0 as? UIWindowScene})let window = connectedScenes.first?.windows.first { $0.isKeyWindow }return window}}struct ContentView: View {let TextoCompartido = "Hola 😀 "var body: some View {Button(action: {let AV = UIActivityViewController(activityItems: [TextoCompartido], applicationActivities: nil)UIApplication.shared.currentUIWindow()?.rootViewController?.present(AV, animated: true, completion: nil)// This works for me, but the compiler give the deprecation warning// UIApplication.shared.windows.first?.rootViewController?.present(AV, animated: true, completion: nil)}) {Text("Hola click me")}}}