iOSアプリ開発時、画像などを外部アプリへ共有する際、iPhoneでは正常に動作するのに、iPadでクラッシュするという事案に出くわしました。共有機能自体を UIActivityViewController に任せていて、エラーメッセージはこんな感じ。
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では、こういうメニューが下からニョキっと現れます。
ところが、iPadでこれを実行すると、コンパイル時にエラーはないものの、共有するタイミングでエラーが発生し、アプリが停止します。
コンパイル時にエラーが出ないというのが結構クセモノですね。これは下手したらこのまま申請に出してしまいそうです。
対処法:「popoverPresentationController?.sourceView」をちゃんと指定しとく
UIActivityViewControllerのソースコード部分はこんな感じで書いていました。
source code by gist.
上記のコード中の
activityViewController.popoverPresentationController?.sourceView = activInd//UIView
これを書いてあげなければいけませんでした。iPhoneだとニュルっと下から出てくるため、このプロパティは使わないんだと思いますが、iPadだと、popoverなるものをどこを拠点として出すのかを指定してあげねばならないということですね。
UIViewを継承しているビューを指定してあげることで、無事に共有窓を出せるようになりました。
東京造形大学卒業後、マクロメディア(現アドビ)に入社。QAやテクニカルサポートマネージャーとしてFlash、DreamweaverなどのWeb製品を担当。独立後、2007年に虫カゴデザインスタジオ株式会社を設立。2021年東京三鷹を拠点に。最近は、CakePHP、Laravel、Unity、ZBrush、Modo、Adobe Substance 3D、Adobe Firefly、Xcode、Firebaseにフォーカスしています。モバイルアプリ開発情報を主としたブログ「MUSHIKAGO APPS MEMO」の中の人。