Как вы показываете диалог, когда делитесь видео с FBSDK? - PullRequest
0 голосов
/ 12 мая 2018

При обмене фотографиями я могу переключить свое приложение на Facebook, чтобы поделиться этим изображением.Похоже, что с видео это не так.

Это фото отлично поделится.Он перемещается в приложение Facebook, чтобы подтвердить сообщение:

let sharePhoto = FBSDKSharePhoto()
sharePhoto.image = photo

let content = FBSDKSharePhotoContent()
content.photos = [sharePhoto]

let shareDialog: FBSDKShareDialog = FBSDKShareDialog()
shareDialog.shareContent = content
shareDialog.mode = .native
shareDialog.show()

Точно так же я не могу сделать это при обмене видео!Нет диалогового окна, не переключается на приложение Facebook и не публикует видео:

let shareVdo: FBSDKShareVideo = FBSDKShareVideo()
shareVdo.videoURL = self.fileURL
let vdoContent = FBSDKShareVideoContent()
vdoContent.video = shareVdo

let shareDialog: FBSDKShareDialog = FBSDKShareDialog()
shareDialog.shareContent = vdoContent
shareDialog.mode = .native
shareDialog.show()

Это позволит поделиться моим видео, но сразу без диалогов или перехода в приложение Facebook первым!

let shareVdo: FBSDKShareVideo = FBSDKShareVideo()
shareVdo.videoURL = self.fileURL
let vdoContent = FBSDKShareVideoContent()
vdoContent.video = shareVdo
FBSDKShareAPI.share(with: vdoContent, delegate:self)

В соответствии с документацией, возможно, мне понадобилось преобразовать мой fileURL в URL ресурса.Мне неясно, должен ли я использовать FBSDKShareAPI или нет:

let shareVdo: FBSDKShareVideo = FBSDKShareVideo()
let asset = AVAsset(url: self.fileURL)
let assetURL = self.getAssetUrl(asset:asset)
shareVdo.videoURL = assetURL
let vdoContent = FBSDKShareVideoContent()
vdoContent.video = shareVdo
//FBSDKShareAPI.share(with: vdoContent, delegate:self)

let shareDialog: FBSDKShareDialog = FBSDKShareDialog()
shareDialog.shareContent = vdoContent
shareDialog.mode = .native
shareDialog.show()

Если я раскомментирую вызов функции FBSDKShareAPI.share, я увижу «Состояние чтения TIC», напечатанное на моей консоли, и в конечном итоге оно будет отправлено в Facebook, но делает это без показа родного общего ресурса.(В основном он незаметно делится на Facebook без визуальной обратной связи с пользователем).Я хочу, чтобы он переместился в приложение Facebook с контентом, который должен подтвердить пользователь, точно так же, как обмен фотографиями работает в моем приложении.

Еще одной попыткой было использование FBSDKShareVideo с аргументами инициализатора «videoURL» и «previewPhoto».Я удостоверился, что видео меньше 12 мегабайт (в моем случае это было 4,4 МБ), sharePhoto и fileURL оба были действительны.Диалоговое окно обмена не работает, то есть не переходит в родное приложение Facebook.Руководство разработчика Facebook показывает его с помощью imagePickerController, что может означать, что SDK требует видео, поступающего с вашей камеры.

let photo = self.uiImages[0]

let sharePhoto = FBSDKSharePhoto()
sharePhoto.image = photo

let filePath = self.fileURL

// get size of video in bytes
do {
    var fileSize : UInt64
    let attr = try FileManager.default.attributesOfItem(atPath: (filePath?.path)!)
    fileSize = attr[FileAttributeKey.size] as! UInt64

    print(fileSize)

} catch {
    print("Error: \(error)")
}

let shareVideo = FBSDKShareVideo(videoURL: self.fileURL, previewPhoto: sharePhoto)

let content = FBSDKShareVideoContent()
content.video = shareVideo

let shareDialog: FBSDKShareDialog = FBSDKShareDialog()

shareDialog.shareContent = content

shareDialog.mode = .native
shareDialog.show()

1 Ответ

0 голосов
/ 04 апреля 2019

Вот как я заставил это работать. Существует определенный формат URL, который требуется FB.

if let lastAsset = fetchResult.firstObject {
  let localID = lastAsset.localIdentifier
  let assetID = localID.replacingOccurrences(of: "/.*", with: "", options: NSString.CompareOptions.regularExpression, range: nil)
  let ext = "mp4"
  let assetURLStr = "assets-library://asset/asset.\(ext)?id=\(assetID)&ext=\(ext)"
  let video = FBSDKShareVideo(videoURL: URL(string: assetURLStr))
  let content = FBSDKShareVideoContent()
  content.video = video                    
  let dialog = FBSDKShareDialog()
  dialog.delegate = self
  dialog.shareContent = content
  dialog.shouldFailOnDataError = true
  dialog.mode = .automatic                    
  dialog.fromViewController = self

  dialog.show()
}

При этом используется другой подход с ShareDialog () вместо FBSDKShareDialog ()

let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
let fetchResult = PHAsset.fetchAssets(with: .video, options: fetchOptions)
if let lastAsset = fetchResult.firstObject {
  let localID = lastAsset.localIdentifier
  let assetID = localID.replacingOccurrences(of: "/.*", with: "", options: NSString.CompareOptions.regularExpression, range: nil)
  let ext = "mp4"
  let assetURLStr = "assets-library://asset/asset.\(ext)?id=\(assetID)&ext=\(ext)"
  let video = Video(url: URL(string: assetURLStr)!)
  let content = VideoShareContent(video: video)
  let dialog = ShareDialog(content: content)
  dialog.failsOnInvalidData = true
  dialog.mode = .automatic
  dialog.presentingViewController = self
  do {
    try dialog.show()
  } catch {
    print(error)
  }
}
...