Swift UIActivityViewController

Swift UIActivityViewController

谁能告诉我如何在 UIActivityViewController 中实现 "Open in Safari"?我知道这个问题是很久以前发布的另一个问题的重复,当时的方法是使用不能再使用的框架。

我分享的数据是URL。我已经有了一个完全可用的 ActivityVC,我只需要添加“在 Safari 中打开”按钮。

非常感谢。

代码:

@IBAction func shareButtonPressed(_ sender: UIButton) {
    let activityVC = UIActivityViewController(activityItems: [URL(string: urlStr)!], applicationActivities: nil)
    activityVC.popoverPresentationController?.sourceView = self.view
    self.present(activityVC, animated: true, completion: nil)
}

您需要实现自己的activity,请检查下面的代码。

import UIKit

final class SafariActivity: UIActivity {
    var url: URL?

    override var activityImage: UIImage? {
        return UIImage(named: "SafariActivity")!
    }

    override var activityTitle: String? {
        return NSLocalizedString("Open in Safari", comment:"")
    }

    override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
        for item in activityItems {
            if
                let url = item as? URL,
                UIApplication.shared.canOpenURL(url)
            {
                return true
            }
        }
        return false
    }

    override func prepare(withActivityItems activityItems: [Any]) {
        for item in activityItems {
            if
                let url = item as? URL,
                UIApplication.shared.canOpenURL(url)
            {
                self.url = url
            }
        }
    }

    override func perform() {
        var completed = false

        if let url = self.url {
            completed = UIApplication.shared.openURL(url)
        }

        activityDidFinish(completed)
    }
}

let url = URL(string: "http://www.apple.com")!

let activityViewController = UIActivityViewController(activityItems: [url], applicationActivities: [SafariActivity()])
present(activityViewController, animated: true, completion: nil)

试试这个 Link 如果它符合您的要求

Link - https://bjartes.wordpress.com/2015/02/19/creating-custom-share-actions-in-ios-with-swift/

需要代码

class FavoriteActivity: UIActivity {
    override func activityType() -> String? {
        return "TestActionss.Favorite"
    }

    override func activityTitle() -> String? {
        return "Add to Favorites"
    }

    override func canPerformWithActivityItems(activityItems: [AnyObject]) -> Bool {
        NSLog("%@", __FUNCTION__)
        return true
    }

    override func prepareWithActivityItems(activityItems: [AnyObject]) {
        NSLog("%@", __FUNCTION__)
    }

    override func activityViewController() -> UIViewController? {
        NSLog("%@", __FUNCTION__)
        return nil
    }

    override func performActivity() {
        // Todo: handle action:
         NSLog("%@", __FUNCTION__)

        self.activityDidFinish(true)
    }

    override func activityImage() -> UIImage? {
        return UIImage(named: "favorites_action")
    }
}

用法

@IBAction func showAvc(sender: UIButton) {
        let textToShare = "Look at this awesome website!"
        let myWebsite = NSURL(string: "http://www.google.com/")!

        let objectsToShare = [textToShare, myWebsite]
        let applicationActivities = [FavoriteActivity()]

        let avc = UIActivityViewController(activityItems: objectsToShare, applicationActivities: applicationActivities)

        self.presentViewController(avc, animated: true, completion: nil)
    }

已更新至 Swift 5.1 & iOS 13

奖金:

  • ActivityType.excludedActivityTypes 一起使用的扩展名。
  • UIImage(systemName:) 使用 SF Symbols 加上 .applyingSymbolConfiguration 以利用其灵活性。

待改进:

  • UIApplication.shared.open 上实施完成处理程序以处理错误(不太可能发生)。
import UIKit

extension UIActivity.ActivityType {
    static let openInSafari = UIActivity.ActivityType(rawValue: "openInSafari")
}

final class SafariActivity: UIActivity {

    var url: URL?

    var activityCategory: UIActivity.Category = .action

    override var activityType: UIActivity.ActivityType {
        .openInSafari
    }

    override var activityTitle: String? {
        "Open in Safari"
    }

    override var activityImage: UIImage? {
        UIImage(systemName: "safari")?.applyingSymbolConfiguration(.init(scale: .large))
    }

    override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
        activityItems.contains { [=10=] is URL ? UIApplication.shared.canOpenURL([=10=] as! URL) : false }
    }

    override func prepare(withActivityItems activityItems: [Any]) {
        url = activityItems.first { [=10=] is URL ? UIApplication.shared.canOpenURL([=10=] as! URL) : false } as? URL
    }

    override func perform() {
        if let url = url {
            UIApplication.shared.open(url)
        }
        self.activityDidFinish(true)
    }

}