我尝试在诸如此类的帖子中寻找解决方案,并且人们在这些帖子中提出了同样的问题:如何使用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?