thisやthisなどの投稿で解決策を探してみましたが、人々はまったく同じ質問をしました: How to share a url to Facebook using SwiftUI ?
SwiftUI を使用してファイルをエクスポートする方法を誰かが尋ねたこの投稿も試しましたが、Whatsapp などのアプリに URL を共有するのに問題がないため、私の問題は特に Facebook にあります。しかし、私は答えを見つけられませんでした...
UIKit
Facebook の Developer documentationを読んで、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/")!])
}
}
}
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 を初期化するときに使用される変数であると私が想定しているため、機能しません。( 「XCodeはタイプ 'ActivityViewController'の値を予期される引数タイプ 'UIViewController'に変換できないため、selfも機能しませんか?」 )
質問
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 では機能しません。URL を Facebook に正常に共有するためにfromViewController
、パラメーターとして使用する ViewController を作成するにはどうすればよいですか?ShareDialog