2011-11-18

iPhoneアプリでTwitterやFacebookの共有機能を利用

iPhoneアプリの中で、TwitterやFacebookの共有機能を利用したい場合、ShareKitというライブラリを使うと簡単に実装できる。
しかしこのShareKit、iOS5でまともに動作しなくなってしまった。Twitterなどの共有をするためにモーダルダイアログを表示した後、キャンセルボタンを押してもダイアログが消えず、元の画面に戻れなくなってしまったのだ。現時点での最新版、バージョン0.2.1ではこの問題が修正されていない。

調査したところ、iOS5.0からUIViewController.parentViewControllerが、nilを返すようになったのが原因で正常に動作しなくなったのだと分かった。iOS4.3までは、parentViewControllerは、親のUIViewControllerを返していた。

幸いなことにShareKitはソースが公開されており、コードを数行の修正すれば問題を解決できる。修正するべき箇所は、SHK.mファイルの、-(void)hideCurrentViewControllerAnimated:(BOOL)animated の内部だ。これを次のように修正すればよい。
- (void)hideCurrentViewControllerAnimated:(BOOL)animated
{
 if (isDismissingView) {
  return;
 }
 if (currentView != nil) {
  // Dismiss the modal view
  if ([currentView parentViewController] != nil) {
   self.isDismissingView = YES;
   [[currentView parentViewController] dismissModalViewControllerAnimated:animated];
  }
  else if ([currentView presentingViewController] != nil) {
   self.isDismissingView = YES;
   [[currentView presentingViewController] dismissModalViewControllerAnimated:animated];
  }
  else {
   self.currentView = nil;
  }
 }
}