如何通过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")
}
}