0

thisthisなどの投稿で解決策を探してみましたが、人々はまったく同じ質問をしました: 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

4

0 に答える 0