web-dev-qa-db-ja.com

ツイートが失敗するとUIActivityViewController完了ハンドラーが成功を返します

UIActivityViewControllerを使用して共有シートを表示し、ユーザーがアプリを共有できるようにします。現在、ツイートをテストしていますが、予期しない結果が得られています。初めてのツイートでは、すべてうまくいきます。 2回目には、重複するTweetエラーメッセージが表示されますが、これは予想どおりです。問題は、completionWithItemsHandlerが成功を返すことです:Bool as true!

現在返されている大量のメッセージではなく、ユーザーに自分専用のメッセージを表示できるようにしたいと考えています。

ここに私のコードがあります:

@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 called
2015-01-27 11:10:58.052 Buzz [3239:813860] LaunchServices:アクティビティと呼ばれるinvalidationHandler:com.Apple.UIKit.activity.PostToTwitter成功:true項目:nilエラー:nil
2015-01-27 11:11:04.134バズ[3239:813859] LaunchServices:invalidationHandlerが呼び出されました
2015-01-27 11:11:09.182 Buzz [3239:813859] plugin com.Apple.share.Twitter.postが無効化されました

29
Swinny89

次のような完了ハンドラーを使用しますSwift 3 AND 4、iOS 10 AND 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>、次のような完了ハンドラーを使用する必要があります。

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

UIActivityViewControllerのフィードバックフローに影響を与えることはできないと思います。UIActivityViewControllerは、きめ細かいカスタマイズに合わせて調整されていない高レベルで使いやすいコンポーネントだからです。

ただし、できることは、ユーザーが最初のツイート後にこのメッセージをツイートした状態を保存し、excludedActivityTypesUIActivityTypePostToTwitterを使用してUIActivityControllerからTwitterを無効にすることです。そのため、ツイートの重複に対してエラーを表示する代わりに、アクションシーケンスが発生することを防ぎます。

7
Teemu Kurppa