0

我尝试在诸如此类的帖子中寻找解决方案,并且人们在这些帖子中提出了同样的问题:如何使用SwiftUI将 url 共享到 Facebook ?

我什至尝试过这篇文章,有人问如何使用 SwiftUI 导出文件,但我的问题特别出在 Facebook,因为我没有问题将 URL 共享到诸如 Whatsapp 之类的应用程序。然而,我没有找到答案……

UIKit

通过阅读Facebook 的开发者文档,我找到了一种使用 UIKit 分享帖子的方法。

我创建了一个非常简单的示例项目以确保我理解了该主题。这是 UIKit 中的示例项目:

import UIKit
import FBSDKShareKit

class ProfileViewController: UIViewController {
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }


    @IBAction func share(_ sender: UIButton) {
        shareLink(url: URL(string: "http://www.apple.com")!)
    }
    
    func shareLink(url: URL) {
        let content = ShareLinkContent()
        content.contentURL = url

        let dialog = ShareDialog(
            fromViewController: self,
            content: content,
            delegate: nil
        )
        dialog.show()
    }
}

幸运的是,这立即奏效了。通过使这个项目工作,我确认我没有忘记将我的 AppBundleID 链接到 Facebook,或者忘记在我的 info.plist 中添加我的 FacebookAppID 或任何其他需要的文件。

SwiftUI

然后我尝试在 SwiftUI 中复制相同的项目,看看是否可以让它工作。我使用 ViewControllerRepresentable 能够将 UIActivityViewController 包含到 SwiftUI 中。

使用 UIActivityViewController 的原因是因为我希望用户选择他们想要共享 URL 的位置(Whatsapp、Twitter、Facebook 等)。

这是代码:

内容视图

struct ContentView: View {
    @State var showSharingView = false
    var body: some View {
        Button("Share Link") {
            showSharingView.toggle()
        }
        
        .sheet(isPresented: $showSharingView) {
           ActivityViewController(activityItems: [URL(string: "https://www.apple.com/")!])
        }
    }
}

UIViewController 可表示

struct ActivityViewController: UIViewControllerRepresentable {

    var activityItems: [URL]
    var applicationActivities: [UIActivity]? = nil
    
    func makeUIViewController(context: UIViewControllerRepresentableContext<ActivityViewController>) -> UIActivityViewController {
        
        let controller = UIActivityViewController(activityItems: activityItems, applicationActivities: applicationActivities)
        
        controller.completionWithItemsHandler = { (activityType, completed, returnedItems, error) in
            
            if activityType == .postToFacebook {     
                shareLink(from: activityItems.first!)
            }
            
        }
        return controller
    }

    func updateUIViewController(_ uiViewController: UIActivityViewController, context: UIViewControllerRepresentableContext<ActivityViewController>) {}

    func shareLink(from url: URL) {
        
        // controller was created so I would have a UIViewControllerType to put as a parameter for fromViewController in ShareDialog, even though I don't think it fits
        let controller = UIActivityViewController(activityItems: activityItems, applicationActivities: applicationActivities)
        
        
        let content = ShareLinkContent()
        content.contentURL = url
        
        let dialog = ShareDialog(fromViewController: controller, content: content, delegate: nil)
        dialog.show()
    }
    
}

此代码不起作用,因为我假设是controller初始化 ShareDialog 时使用的变量。(self 也不起作用,因为“XCode 无法将 'ActivityViewController' 类型的值转换为预期的参数类型 'UIViewController?'”

问题

Facebook Developer 的文档告诉我,我需要编写以下代码才能共享链接:

guard let url = URL(string: "https://developers.facebook.com") else {
    // handle and return
}

let content = ShareLinkContent()
content.contentURL = url

let dialog = ShareDialog(
    viewController: self, //<--this has been changed to 'fromViewController'
    content: content,
    delegate: self
)
dialog.show()

但是,SwiftUI 不适用于 ViewController。如何创建一个 ViewController 用作参数,fromViewController以便ShareDialog成功地将我的 URL 分享到 Facebook?

4

0 回答 0