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

标签 ios iphone swift uiactivityviewcontroller

在我的应用程序中,我下载了一个扩展名为 .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/

相关文章:

swift - 将从 API for 循环检索到的数据追加到数组

ios - 如何在IOS 6/7上设置导航栏颜色

ios - IBDesignablesAgentCocoaTouch 和 Interface Builder Cocoa Touch Tool 正在占用我的 CPU

ios - 如何在 viewController 中扩展调用功能

iphone - 一个 Action 或来自多个 Action 的多个方法调用

ios - 无法在我的 iOS9 应用程序中打印 FBSDKAccessToken.currentAccessToken().tokenString

ios - 关于 View 和手势识别器

iphone - 检查 iOS 中 Safari 的内存使用情况

ios - 在 Objective-C 中将字符串转换为字节

swift - 当歌曲 slider 按住时间过长时,positionSlider.value太大