iOS - делитесь видео на Facebook с помощью диалогового окна - PullRequest
0 голосов
/ 22 ноября 2018

У моего приложения была возможность делиться онлайн-видео на Facebook с помощью API Graph и оно работало до августа 2018 года. Я только что обнаружил, что publish_action устарело и что мы не можем использовать API Graph для обмена видео на Facebook.Поэтому я попробовал другое решение: загрузить видео локально, скопировать его в ресурсы, а затем использовать старый FBSDKShareDialog, чтобы поделиться им (установка URL-адреса на iOS ниже 11 и установка ресурса на iOS> = 11), но пост в Facebook появилсябез видео только текст.Затем я попробовал его, используя новый класс ShareDialog и, поскольку он работает только с URL-адресом видео, после того, как я скопировал его в ресурсы, я не смог получить URL-адрес его ресурса, но URL-адрес файла, поэтому я получил следующую ошибку в журналах:

"Error while sharing video content Error Domain=com.facebook.sdk.share Code=2 "(null)" UserInfo={com.facebook.sdk:FBSDKErrorArgumentValueKey=file:///var/mobile/Media/DCIM/105APPLE/IMG_5953.MP4, com.facebook.sdk:FBSDKErrorDeveloperMessageKey=Must refer to an asset file., com.facebook.sdk:FBSDKErrorArgumentNameKey=videoURL}".

Вот мой код.Пожалуйста, скажите мне, что я должен изменить, чтобы поделиться видео на Facebook.Если я поделюсь URL-адресом, он покажет только URL-адрес в сообщении, и я не смогу показать видео ниже.Заранее спасибо!

    private func downloadVideoForUploadOnFacebook(urlString: String, videoId: Int, isMyVideo: Bool, successHandler: @escaping () -> Void, failureHandler: @escaping (String) -> Void) {
        guard let url = URL(string: urlString) else {delegate.stopActivityIndicator(); return}

        let request = Alamofire.request(URLRequest(url: url))
        request.responseData {[weak self] (response) in
            if let data = response.result.value {

                let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
                let videoURL = documentsURL.appendingPathComponent("video.mp4")
                do {
                    try data.write(to: videoURL)
                    self?.showShareDialog(localVideoUrl: videoURL, completion: {
                        print("success")
                        successHandler()
                    }, failure: { (error) in
                        print(error)
                        failureHandler(error)
                    })
                } catch {
                    print("Something went wrong!")
                }
            }
            }.downloadProgress { (progress) in
                print(progress)
        }
    }

    private func showShareDialog(localVideoUrl: URL, completion: @escaping () -> Void, failure: @escaping (String) -> Void) {
        guard let navigationController = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController, let vc = navigationController.viewControllers.last else {return}
        if PHPhotoLibrary.authorizationStatus() == .authorized {
            showFacebookShareDialog(localVideoUrl: localVideoUrl, vc: vc, completion: completion, failure: failure)
        } else {
            PHPhotoLibrary.requestAuthorization({[weak self] (status) in
                switch status {
                case .authorized:
                    self?.showFacebookShareDialog(localVideoUrl: localVideoUrl, vc: vc, completion: completion, failure: failure)
                default:
                    print(status)
                    failure("Authorization error")
                }
            })
        }
    }

    private func showFacebookShareDialog(localVideoUrl: URL, vc: UIViewController, completion: @escaping () -> Void, failure: @escaping (String) -> Void) {
        var placeHolder : PHObjectPlaceholder?
        do {
            try PHPhotoLibrary.shared().performChangesAndWait {
                let creationRequest = PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: localVideoUrl )
                placeHolder = creationRequest?.placeholderForCreatedAsset
            }
        }
        catch {
            print(error)
            failure(error.localizedDescription)
        }


        let result = PHAsset.fetchAssets(withLocalIdentifiers: [placeHolder!.localIdentifier], options: nil)
        if let phAsset = result.firstObject {
            getURL(ofPhotoWith: phAsset, completionHandler: {[weak self] (url) in
                guard let url = url else {return}
                self?.showNewDialog(localVideoUrl: url, vc: vc, completion: completion, failure: failure)
//                if #available(iOS 11.0, *) {
//                    self?.showOldDialog(asset: phAsset, vc: vc)
//                } else {
//                    self?.showOldDialog(localVideoUrl: url, vc: vc)
//                }
            })
        } else {
            failure("Error at assets")
        }
    }

func showOldDialog(localVideoUrl: URL, vc: UIViewController) {
        let video = FBSDKShareVideo()
        video.videoURL = localVideoUrl
        let content = FBSDKShareVideoContent()
        content.video = video

        let shareDialog: FBSDKShareDialog = FBSDKShareDialog()
        shareDialog.shareContent = content
        shareDialog.fromViewController = vc
        DispatchQueue.main.async {
            shareDialog.show()
        }
    }

    func showOldDialog(asset: PHAsset, vc: UIViewController) {
        let video = FBSDKShareVideo()
        video.videoAsset = asset
        let content = FBSDKShareVideoContent()
        content.video = video

        let shareDialog: FBSDKShareDialog = FBSDKShareDialog()
        shareDialog.shareContent = content
        shareDialog.fromViewController = vc
        DispatchQueue.main.async {
            shareDialog.show()
        }
    }

    func showNewDialog(localVideoUrl: URL, vc: UIViewController, completion: @escaping () -> Void, failure: @escaping (String) -> Void) {
        let video = FacebookShare.Video(url: localVideoUrl)
        let content = VideoShareContent(video: video)
        let shareDialog = ShareDialog(content: content)
        shareDialog.mode = .native
        shareDialog.failsOnInvalidData = true
        shareDialog.presentingViewController = vc
        shareDialog.completion = { result in
            switch result {
            case .success:
                print("Share succeeded")
                completion()
            case .failed:
                print(result)
                failure("Error while sharing on facebook")
            case .cancelled:
                print("Share cancelled")
            }
        }

        DispatchQueue.main.async {
            do {
                try shareDialog.show()
            } catch {
                print(error)
                failure("Error while sharing video content \(error)")
            }
        }
    }
...