我试着在这和这这样的帖子中寻找解决方案,人们问了同样的问题:如何使用SwiftUI共享Facebook的url
我甚至尝试过这个职位,有人问我如何使用SwiftUI导出文件,但我的问题是,特别是Facebook,因为我没有问题将urls共享到诸如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的原因是我希望用户选择他们想要共享的网址(Whatsapp、Twitter、Facebook等)。
以下是代码:
ContentView
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/")!])
}
}
}UIViewControllerRepresentable
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开发人员文档告诉我,为了共享一个链接,我需要编写以下代码:
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不适用于ViewControllers。如何创建一个ViewController作为fromViewController中ShareDialog中的一个参数,以便成功地将我的URL共享到Facebook?
发布于 2022-07-21 13:38:17
像这样使用,
guard let url = URL(string: "https://developers.facebook.com") else {
// handle and return
}
let content = ShareLinkContent()
content.contentURL = url
let dialog = ShareDialog(
viewController: UIApplication.shared.windows.first!.rootViewController,
content: content,
delegate: UIApplication.shared.windows.first!.rootViewController
)
dialog.show()https://stackoverflow.com/questions/71166022
复制相似问题