UIActivityViewController完成处理程序在推文失败时返回成功。

36

我正在使用UIActivityViewController来显示分享选项,以便用户可以共享我的应用程序。我目前正在测试推文并且得到了一些意外的结果。在第一次推特时,一切顺利。第二次时,我会收到一个重复推文错误消息,这是预期的。问题在于,completionWithItemsHandler返回的success: Booltrue,这不是我想要的。

我想能够向用户显示自己的个性化消息,而不是目前返回的巨大消息。

以下是我的代码:

@IBAction func ShareButtonTapped(sender: AnyObject) {
    let textToShare = "I'm using Buzz!  The new way to send emoji's, with sound, it's annoying, funny and amazing"
    var url = NSURL(string: "-Image url masked out-")
    var data = NSData(contentsOfURL: url!)
    let image = UIImage(data: data!)
    if let myWebsite = NSURL(string: "-redirect masked out-")
    {
        let objectsToShare = [textToShare, myWebsite]
        let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
        activityVC.completionWithItemsHandler = {
            (activity, success, items, error) in
            println("Activity: \(activity) Success: \(success) Items: \(items) Error: \(error)")
        }
        self.presentViewController(activityVC, animated: true, completion: { () -> Void in

        })
    }
}

这是我的日志:

2015-01-27 11:10:58.021 Buzz[3239:813859] LaunchServices:invalidationHandler被调用
2015-01-27 11:10:58.052 Buzz[3239:813860] LaunchServices:invalidationHandler被调用 Activity:com.apple.UIKit.activity.PostToTwitter Success:true Items:nil Error:nil
2015-01-27 11:11:04.134 Buzz[3239:813859] LaunchServices:invalidationHandler被调用
2015-01-27 11:11:09.182 Buzz[3239:813859] 插件com.apple.share.Twitter.post无效

4个回答

41

如何在SWIFT 3和4,iOS 10和11中使用完成处理程序:

activityVC.completionWithItemsHandler = {(activityType: UIActivityType?, completed: Bool, returnedItems: [Any]?, error: Error?) in
    if !completed {
        // User canceled 
        return
    }
    // User completed activity
}

self.present(activityVC, animated: true, completion: nil)

4
无论按下取消按钮还是完成按钮,completed总是返回true。 - mahbaleshwar hegde
2
这对我起作用,即使用户在另一个应用程序中取消操作(例如 Gmail),“completed”也会返回false。 - Berat Cevik
1
假设我点击了 WhatsApp,但在打开 WhatsApp 后,我没有分享并按下了“取消”按钮。那么,我如何知道分享不成功呢? - Mitesh Dobareeya

13

如果你正在使用SWIFT 2.0 iOS 8.0及以上版本,你应该像这样使用完成处理程序:

self.presentViewController(activityVC, animated: true, completion: nil)

activityVC.completionWithItemsHandler = {(activityType, completed:Bool, returnedItems:[AnyObject]?, error: NSError?) in

     // Return if cancelled
     if (!completed) {
         return
     }

     //activity complete
     //some code here


}

2
假设我点击了 WhatsApp,但在打开 WhatsApp 后,我没有分享它并按下“取消”。那么我怎么知道分享不成功呢? - Mitesh Dobareeya
@MiteshDobareeya 我也遇到了相同的问题。你是如何解决的? - Ahmed Sahib

8
我认为你不能影响UIActivityViewController的反馈流程,因为它是一个高级、易于使用的组件,不适合细粒度定制。
不过,你可以保存用户在第一次发推后已经推送了这条完全相同的消息的状态,然后使用“excludedActivityTypes”和“UIActivityTypePostToTwitter”从UIActivityController中禁用Twitter。这样,与其显示重复推文的错误,你可以防止动作序列甚至发生。

-5

我建议替换

self.presentViewController(activityVC, animated: true, completion: { () -> Void in })

使用

self.presentViewController(activityVC, animated: true, completion: nil)

这对我有效,希望对你有所帮助!


3
不加完成处理程序,这项工作能够达到什么目的?毫无疑问,这将使我更难以检查/更改错误消息。 - Swinny89
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - tdh
我一开始使用了带有完成处理程序的函数。无论是否使用完成处理程序,所有功能仍然有效。 - Swinny89
3
这与问题所问的无关。 - Berat Cevik

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