UIActivityViewControllerで共有する際、実行時にiPadでクラッシュする

広告:超オススメUnity Asset
  広告:超オススメUnity Asset

iOSアプリ開発時、画像などを外部アプリへ共有する際、iPhoneでは正常に動作するのに、iPadでクラッシュするという事案に出くわしました。共有機能自体を UIActivityViewController に任せていて、エラーメッセージはこんな感じ。

02

reason: ‘UIPopoverPresentationController (<_UIAlertControllerActionSheetRegularPresentationController: 0x7bf8c6e0>) should have a non-nil sourceView or barButtonItem set before the presentation occurs.

iPhoneメインで作っていて、iPadの方は気づきにい状態でした。

ということで、UIActivityViewControllerにちょっと触れてから、対処法をMEMOしておきます。

※ このMEMOは、虫カゴアプリ「OneTwoPunch」で見つけた内容を記載しています。ぜひインストールしてお試しください。また、このようにOneTwoPunch制作時に見つけた技術的な内容などについては、「OneTwoPunchタグ」をつけておきますので、他のMEMOもご参考に。

UIActivityViewControllerについて

UIActivityViewControllerは、画像などをパラメータで渡してあげることで、その後のコメント文やどのアプリへ共有するのかなどの操作をお任せすることができ便利です。

iPhoneでは、こういうメニューが下からニョキっと現れます。

01

ところが、iPadでこれを実行すると、コンパイル時にエラーはないものの、共有するタイミングでエラーが発生し、アプリが停止します。

02

コンパイル時にエラーが出ないというのが結構クセモノですね。これは下手したらこのまま申請に出してしまいそうです。

対処法:「popoverPresentationController?.sourceView」をちゃんと指定しとく

UIActivityViewControllerのソースコード部分はこんな感じで書いていました。

source code by gist.

上記のコード中の

activityViewController.popoverPresentationController?.sourceView = activInd//UIView

これを書いてあげなければいけませんでした。iPhoneだとニュルっと下から出てくるため、このプロパティは使わないんだと思いますが、iPadだと、popoverなるものをどこを拠点として出すのかを指定してあげねばならないということですね。

UIViewを継承しているビューを指定してあげることで、無事に共有窓を出せるようになりました。

03