在我的应用程序中,我下载了一个扩展名为 .mp3 的音乐文件并将其保存到 DocumentDirectory。在我检索 url 并创建一个 NSData 变量后,通过 UIActivityViewController 在 Telegram 上共享它。 telegram 上出现的文件没有扩展名,也无法播放。它的名字是"file"。我希望音乐在 Telegram 上看起来像“test.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)
最佳答案
我以前从未使用过 Telegram API,但您需要做的是创建一个自定义的 UIActivity
来存储从本地检索歌曲的信息,这样您就可以对您选择的 UIActivity
使用react,并使用歌曲数据调用 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) 创建一个类方法来实例化您的 Telegram 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) 使用您的 Telegram 事件实例化您的 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")
}
}
关于ios - 如何通过 UIActivityViewController 与 Swift 共享 .mp3 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37390345/