如何通过UIActivityViewController与Swift共享.mp3文件?

问题描述:

在我的应用程序中,我下载了一个扩展名为.mp3的音乐文件,并将其保存到DocumentDirectory中。在我检索URL并创建一个NSData变量后,通过UIActivityViewController在Telegram上分享它。电报上出现的文件没有扩展名,不能播放。它的名字是“文件”。我希望音乐在电报上显示为“test.mp3”。这里是我的代码:如何通过UIActivityViewController与Swift共享.mp3文件?

var paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0].stringByAppendingString("/test.mp3")      

let soundData=NSData(contentsOfFile: paths) 

let r = NSURL(fileURLWithPath: paths) 

let activityViewController = UIActivityViewController(activityItems: [r] , applicationActivities: nil) 

我以前从未使用过的电报API,但你需要做的是创建一个自定义UIActivity,将存储的信息从本地检索歌曲,以及与此您可以对您的UIActivity的选择做出反应,并用歌曲数据调用Telegram API。

1)通过子类别UIActivity创建自定义活动。

class YourCustomActivity: UIActivity { 

    var title: String! 
    var image: UIImage? 
    var type:UIActivityType! 
    var path: String! 


    init(title: String, image: UIImage?, path: String) { 
     super.init() 
     self.path = path 
     self.image = image 
     self.title = title 
     type = UIActivityType(rawValue: title) 
    } 

    override var activityType: UIActivityType { 
     return self.type 
    } 

    override var activityTitle: String { 
     return self.title 
    } 

    override var activityImage: UIImage? { 
     return self.image 
    } 

    var activityCategory: UIActivityCategory { 
     return .share 
    } 

    override func canPerform(withActivityItems activityItems: [Any]) -> Bool { 
     return true 
    } 

    override func prepare(withActivityItems activityItems: [Any]) { 

    } 

    override func perform() { 

    } 

} 

2)创建一个类的方法,将实例化您的电报UIActivity

class func getTelegramActivitiesFor(path: String) -> [YourCustomActivity] { 
    // You have to supply your own "Telegram_Logo" 
    return [YourCustomActivity(title: "Telegram", image: UIImage.init(named: "Telegram_Logo", in: Bundle.main, compatibleWith: nil), path: path)] 
} 

3)实例化UIActivityController与电报活动。

let yourSongPath = "" // Get path to your song in documents 

let activities = YourCustomActivity.getTelegramActivitiesFor(path: yourSongPath) 

let activityVC = UIActivityViewController(activityItems: activityImages, applicationActivities: activities) 
activityVC.modalPresentationStyle = .popover 
activityVC.popoverPresentationController?.barButtonItem = actionButton 
present(activityVC, animated: true, completion: nil) 

4)YourCustomActivity选择它将执行其perform()方法。您可以在此处抓取歌曲路径的数据并拨打电话将其发送至Telegram

override func perform() { 
    do { 

     let songData = try Data(contentsOf: self.path) 

     // Make the API call to Telegram with your song's data... 

    } 
    catch { 
     print("UNABLE TO RETRIEVE SONG") 
    } 
}