ios - مشاركة الفيديو فاسيت عبر أوياكتيفيتيكونترولر




swift video (2)

أحاول مشاركة الفيديو فاسيت عبر وياكتيفيتيكونترولر باستخدام ريكستافاسيت . يعمل هذا مع المراسلة، ولكن ليس مع إيردروب، مشيرا إلى "فشل".

PHCachingImageManager.default().requestAVAsset(forVideo: asset, options: nil, resultHandler:
    { (givenAsset, audioMix, info) in

        let videoAsset = givenAsset as! AVURLAsset
        let videoURL = videoAsset.url

        DispatchQueue.main.async {
            let activityViewController = UIActivityViewController(
                activityItems: [videoURL],
                applicationActivities: nil)
            activityViewController.excludedActivityTypes = [UIActivityType.saveToCameraRoll]

            if let popoverPresentationController = activityViewController.popoverPresentationController {
                popoverPresentationController.barButtonItem = (sender)
            }

            self.present(activityViewController, animated: true, completion: nil)
        }
})

ويبدو أن هذا وضع بشكل صحيح إياكتيفيتيكونترولر والعمل فقط مع بعض الأنشطة:

  • المراسلة - ✔️ يعمل، بشكل صحيح تصدير الفيديو.
  • إيردروب - ✖️Shows "فشل"
  • دروبوكس - ✖️Puts حتى دروببوإكس المناسب مشاهدة، ويقول بعد "حدث خطأ غير معروف"


لقد واجهت نفس السلوك الغريب عند العمل مع فاسيتس. تخميني هو هذا (عمدا) غير موثقة الأمن / ساندبوكسينغ تقييد.

تمكنت من حل هذه المشكلة عن طريق نسخ الملف الأساسي إلى دليل المستخدم ثم تنفيذ العملية على الملف المنسوخ.

فعلت ذلك في حلقة. أحيانا، فشل النسخة مع خطأ أذونات ملف غامض. عندما يفعل ذلك، أعد المحاولة بعد بضع ثوان (باستخدام DispatchQueue.main.asyncAfter ). في نهاية المطاف، فإنه يعمل!


هذا هو جوابي، والفكرة هي نفس الإجابة المقبولة ولكن أنا تقديم التعليمات البرمجية. أنا دائما الكتابة إلى نفس ورل لذلك أتوقع أن يكون دائما شريط فيديو في وثائق ورل مسار تمديد temp.mov، ولكن في كل مرة أرسل فيديو جديد يحصل على الكتابة هذه البيانات.

PHImageManager.default().requestPlayerItem(forVideo: phAsset, options: nil, resultHandler: { playerItem, info in
                if let playerAsset = playerItem?.asset as? AVURLAsset{

                    let url = playerAsset.url
                    var videoData = Data()
                    var tempURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
                    tempURL.appendPathComponent("temp.mov")
                    do{
                        videoData = try Data(contentsOf: url)
                    }catch{
                        print("error with the video data \(error)")
                    }

                    do{
                        try videoData.write(to: tempURL)
                    }catch{
                        print("could not write to tempURL\(error)")
                    }

                    let activityController = UIActivityViewController(activityItems: [tempURL], applicationActivities: nil)
                    DispatchQueue.main.async {
                        self.present(activityController, animated: true)
                    }
                }
            })




phasset