首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI如何使用FBSDKShareKit和ShareDialog共享Facebook的URL?

SwiftUI如何使用FBSDKShareKit和ShareDialog共享Facebook的URL?
EN

Stack Overflow用户
提问于 2022-02-17 22:12:20
回答 1查看 166关注 0票数 2

我试着在这样的帖子中寻找解决方案,人们问了同样的问题:如何使用SwiftUI共享Facebook的url

我甚至尝试过这个职位,有人问我如何使用SwiftUI导出文件,但我的问题是,特别是Facebook,因为我没有问题将urls共享到诸如Whatsapp之类的应用程序。但是我没有找到答案..。

UIKit

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

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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开发人员文档告诉我,为了共享一个链接,我需要编写以下代码:

代码语言:javascript
复制
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作为fromViewControllerShareDialog中的一个参数,以便成功地将我的URL共享到Facebook?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-21 13:38:17

像这样使用,

代码语言:javascript
复制
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()
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71166022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档