SFSafariViewController:如何提供自定义活动?

4
WWDC关于Safari View Controller的会话提到,应用程序可以通过委托方法func safariViewController(controller: SFSafariViewController, activityItemsForURL URL: NSURL, title: String?) -> [UIActivity]提供自定义活动。我尝试实现此方法,但在呈现SFSafariViewCntroller后它没有被调用。我还实现了该委托的另一个可选方法func safariViewControllerDidFinish(_: SFSafariViewController),它确实被调用。我尝试将"@objc"关键字添加到我的方法中(某些其他协议所需),但似乎没有改变任何内容。
我想知道可能出了什么问题。
谢谢!
1个回答

0

以下是您参考的示例代码。在您的主视图中:

func safariViewController(controler: SFSafariViewController, activityItemsForURL: NSURL, title: String?) -> [UIActivity] {
    //global variable for the url to be shared
    webPageUrl = activityItemsForURL.absoluteString
    //global variable for the title to be shared
    webPageTitle = title!
    let wcActivity = WeChatActivity()
    let wcMoment = WeChatMoment()
    return [wcActivity, wcMoment]
}

自定义活动 1

import UIKit

class WeChatActivity : UIActivity{

    override init() {
        self.text = ""

    }

    var text:String?

    override func activityType()-> String {
        return "WeChat"
    }

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

    override func activityTitle() -> String
    {
        return "微信好友"
    }


    override class func activityCategory() -> UIActivityCategory{
        return UIActivityCategory.Action
        //you can change to .Share and it'll appear in the share line
    }

    func getURLFromMessage(message:String)-> NSURL
    {
        var url = "whatsapp://"

        if (message != "")
        {
            url = "\(url)send?text=\(message)"
        }

        return NSURL(string: url)!
    }


    override func canPerformWithActivityItems(activityItems: [AnyObject]) -> Bool {
        return true;
    }

    override func performActivity() {
        shareToWeChat("ftcweixin://?url=\(webPageUrl)&title=\(webPageTitle)&description=\(webPageDescription)&img=\(webPageImageIcon)&to=chat")
    }

}

自定义活动 2:

import UIKit

class WeChatMoment : UIActivity{

    override init() {
        self.text = ""
    }

    var text:String?


    override func activityType()-> String {
        return "WeChatMoment"
    }

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

    override func activityTitle() -> String
    {
        return "微信朋友圈"
    }


    override class func activityCategory() -> UIActivityCategory{
        return UIActivityCategory.Action
    }

    func getURLFromMessage(message:String)-> NSURL
    {
        var url = "whatsapp://"

        if (message != "")
        {
            url = "\(url)send?text=\(message)"
        }

        return NSURL(string: url)!
    }


    override func canPerformWithActivityItems(activityItems: [AnyObject]) -> Bool {
        return true;
    }

    override func performActivity() {
        shareToWeChat("ftcweixin://?url=\(webPageUrl)&title=\(webPageTitle)&description=\(webPageDescription)&img=\(webPageImageIcon)&to=moment")
    }
}

您将能够在操作表的操作行中看到两个新图标。您还可以按照代码中所述将其更改为出现在共享行中。

最后需要注意的是,在Safari View上分享到微信存在一些问题,因为微信不符合Safari的共享标准。您可以点击微信分享图标,然后微信就能够分享了。但是,在Safari View页面中,您只能获取页面标题和URL,而在WKWebView中,您可以使用evaluateJavaScript获取所有内容。因此,您需要从其他地方获取分享图片和描述(用于向朋友分享)。


在我尝试之前,只有一个小问题...你是怎么知道我想添加微信分享支持的(否则内置的分享扩展就足够了)? - Minsheng Liu
几乎所有主要的社交网络都通过遵循开放标准并被视为内置功能来简化开发人员的工作。微信是我能想到的唯一例外。但它们异常受欢迎。因此,如果开发人员正在费尽心思地自定义操作表,那么很可能是微信分享。顺便说一下,如果您需要完整的项目,我可以在GitHub上发送链接给您。 - Oliver Zhang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接