web-dev-qa-db-fra.com

Le gestionnaire d'achèvement UIActivityViewController renvoie le succès lorsque le Tweet a échoué

J'utilise un UIActivityViewController pour afficher une feuille de partage afin que les utilisateurs puissent partager mon application. Je teste actuellement des tweets et j'obtiens des résultats inattendus. En tweetant pour la première fois, tout se passe bien. La deuxième fois, je reçois un message d'erreur Tweet en double, ce qui est attendu. Le problème est que la finitionWithItemsHandler renvoie le succès: Bool as true!

Je veux pouvoir afficher mon propre message personnalisé à l'utilisateur plutôt que le message massif qui est retourné actuellement.

Voici mon code:

@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

        })
    }
}

Voici mon journal:

2015-01-27 11: 10: 58.021 Buzz [3239: 813859] LaunchServices: invalidationHandler appelé
2015-01-27 11: 10: 58.052 Buzz [3239: 813860] LaunchServices: invalidationHandler appelé Activity: com.Apple.UIKit.activity.PostToTwitter Succès: true Items: nil Erreur: nil
2015-01-27 11: 11: 04.134 Buzz [3239: 813859] LaunchServices: invalidationHandler appelé
2015-01-27 11: 11: 09.182 Buzz [3239: 813859] plugin com.Apple.share.Twitter.post invalidé

29
Swinny89

Utilisez un gestionnaire de complétion comme celui-ci pour Swift 3 ET 4, iOS 10 ET 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)
26
Soumen

Swift 2.0 iOS 8.0>, vous devez utiliser un gestionnaire d'achèvement comme celui-ci:

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


}
13
Adam Studenic

Je ne pense pas que vous puissiez affecter le flux de rétroaction de l'UIActivityViewController car il s'agit d'un composant de haut niveau facile à utiliser qui n'est pas conçu pour une personnalisation fine.

Ce que vous pouvez faire, cependant, consiste à enregistrer l'état selon lequel l'utilisateur a tweeté ce message exact après le premier Tweet, puis à désactiver Twitter de UIActivityController à l'aide de excludedActivityTypes et UIActivityTypePostToTwitter. Ainsi, au lieu d'afficher une erreur pour un Tweet en double, vous empêchez même la séquence d'actions de se produire.

7
Teemu Kurppa