SLComposeViewControllerを使っている時に、同じ文面でもTwitterには正常に投稿できるがFacebookには投稿に失敗してしまうというケースが発生することがあります。画面にはただ「Facebookに投稿できません」とアラートが表示されるだけですし、SLComposeViewControllerは投稿失敗時のerrorに対してコールバックblockもdelegateも存在しないので原因を調べることもできません。
実機のコンソールログを見てみると以下の様なエラーになっています。
Jan 8 11:01:25 akisute-no-iPhone sociald[6444]SLComposeViewControllerが裏で使用しているsocialdのSLDFacebookPostUploadクラスがエラーを吐いています。一見しただけだとOAuthExceptionとか書いてあって認証系のエラーかと勘違いしてしまいそうですが、実はこれSLComposeViewControllerのaddURL:メソッドに「空の」NSURLインスタンスを渡した時に発生するエラーです。以下のコードで簡単に実験することができます。: 2013-01-08 11:01:25.665|sociald|0x1fd65e70: Request status was 400 Jan 8 11:01:25 akisute-no-iPhone sociald[6444] : 2013-01-08 11:01:25.668|sociald|0x1fd65e70: SLDFacebookPostUpload: The response indicates an error Parameters: {type = immutable dict, count = 1, entries => 2 : {contents = "error"} = {type = immutable dict, count = 3, entries => 0 : {contents = "message"} = {contents = "(#100) The parameter link is required"} 1 : {contents = "type"} = {contents = "OAuthException"} 2 : {contents = "code"} = {value = +100, type = kCFNumberSInt64Type} } } . HTTP status 0
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
- (void)succeed1 | |
{ | |
SLComposeViewController *vc = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook]; | |
[vc addURL:[NSURL URLWithString:@"http://akisute.com"]]; | |
[self.navigationController presentViewController:vc animated:YES completion:nil]; // posts with a link, no error | |
} | |
- (void)succeed2 | |
{ | |
SLComposeViewController *vc = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook]; | |
[vc addURL:[NSURL URLWithString:nil]]; | |
[self.navigationController presentViewController:vc animated:YES completion:nil]; // posts without links, no error | |
} | |
- (void)fail | |
{ | |
SLComposeViewController *vc = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook]; | |
[vc addURL:[NSURL URLWithString:@""]]; // makes a "blank" NSURL instance | |
[self.navigationController presentViewController:vc animated:YES completion:nil]; // can't post, always error, confirmed on iOS 6.0.2 or less | |
} |
対策としてaddURL:しようとしているURLのschemeがnilまたは空文字列だったらaddURL:しないとすればOKです。しかしTwitterでは通るのにFacebookだけ通らないのはなんだか納得いかない・・・><