koogawa blog

iOS、Android、foursquareに関する話題

Stack Overflowで最も多く支持されたiOS関連の質問ベスト10(2019年版)

f:id:koogawa:20191207224439j:plain

どうも、koogawa です。

今年は Stack Overflow の reputation がついに 6,000 を超えました🎉

f:id:koogawa:20191207224726p:plain

そんなわけで、とうとうiOS アドベントカレンダーも最終日ですね! 今年も昨年に引き続き「今年Stack Overflowに投稿されたiOSに関する質問」の中で、Vote数(投票数)が多かった質問、つまり デベロッパーから支持の多かった質問 をまとめてみました。

それでは10位から順に見ていきましょう!

※2019年12月16日(日本時間)時点での情報を元に集計しています

第10位:Xcode 10.2 で iOS 10 未満のシミュレーターを動かそうとするとクラッシュする問題(61票)

stackoverflow.com

さて、今年の第10位に輝いたのはこの質問です。Xcode 10.2 で iOS 10 未満のシミュレーターを動かそうとすると、次のエラーを吐いてアプリがクラッシュするという内容です。

dyld: Library not loaded: /usr/lib/libauto.dylib Referenced from: /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation Reason: no suitable image found. Did find: /usr/lib/libauto.dylib: mach-o, but not built for iOS simulator

これはコードベースが Swift の場合のみ発生する問題で、Objective-C では発生しないとのことです。

この問題の原因ですが、結論から言うと Xcode のバグだったようです。

https://developer.apple.com/documentation/xcode_release_notes/xcode_10_2_1_release_notes

ワークアラウンドとして、/usr/lib/swift ディレクトリをシミュレータのランタイムルートに作成することにより、この問題を回避できるよ!と簡潔に説明した回答がベストアンサーに選ばれていました。

私はこの問題には直面しなかったんですが、質問・回答ともに多くの票を集めていることから、世界中の開発者がこのバグの影響を受けたのではないでしょうか。

第9位:Xcode 11.2 で Module compiled with Swift 5.1 cannot be imported by the Swift 5.1.2 compiler が出る問題(63票)

stackoverflow.com

Xcode 11.0 でコンパイルされたフレームワーク (今回の例では RxSwift)があり、これは Xcode 11.1 でも問題なくインポートできました。しかし、Xcode 11.2 にアップデートしたところ

Module compiled with Swift 5.1 cannot be imported by the Swift 5.1.2 compiler

というエラーが出てしまいました。私はこのエラーの対処には慣れており、Xcode 11.2 を使用して RxSwift を再コンパイルすれば解決できることを知っています。しかし、Swift 5.1 の主な機能は「モジュールの安定性」ではなかったのでしょうか?モジュールの安定性が得られたため、フレームワークは新しい Xcode のリリースごとに再コンパイルし続ける必要はないという印象を受けましたが、明らかにそうではありません。このようなことが起こる理由を説明できる人がいればとても嬉しいです。という質問です。

最も多くの票を集めた回答は、

WWDC のビデオ https://developer.apple.com/videos/play/wwdc2019/416/ で説明があるよ!フレームワークのビルド設定で

BUILD_LIBRARY_FOR_DISTRIBUTION = YES;

を設定すると、Xcode 11.0(Swift 5.1)を使用してコンパイルしたフレームワークXcode 11.2(Swift 5.1.2)でコンパイルできるようになるよ!

という内容でした。しかし、これでもエラーが発生するというコメントも寄せられ、今現在もベストアンサーには至っていません。

第8位:Xcode 10.1 が iOS 12.2 をサポートしてない問題(66票)

stackoverflow.com

はい、出ました!Xcode x.y が iOS x.y をサポートしてない問題です。数年前からこの企画をやっていますが、この手の質問はホントに毎年出てきます。

今回も DeviceSupport をネットから入手して、

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

にリネームしてコピーすれば解決するよ!という回答がベストアンサーに選ばれていました。(この方法は非公式の解決法なので自己責任で!)

第7位:Xcode 11 の debugger がものすごく遅い問題(68票)

stackoverflow.com

Xcode 11 にアップデートしてから debugger がものすごく遅くなってしまったよ、という内容です。とくにブレークポイントを貼ったときが顕著で、プログラムがブレークポイントに到達すると30秒ぐらい停止してしまうとのことです。

実はこれ、私も感じてました・・!ブレークポイントを貼って、さらに変数の中身を表示しようとするとインジケーターが30秒以上回った状態になるんですよね。

configurations -> Manage schemes -> Edit scheme -> Run -> Diagnostics tab の順に開いて、各チェックボタンを外せば速くなる、という回答がもっとも票を集めていましたが、「解決しない」「そもそも"遅い"ってどういうこと?」というコメントが多数寄せられています。この質問には2019年12月時点でもベストアンサーが選ばれていません。

第6位:iOS13 で UISegmentedControl の色を変える方法が変わってる問題(71票)

stackoverflow.com

iOS 12 までは tintColor で UISegmentedControl の色を変えることができていたけど、iOS 13 から効果がなくなった!という内容です。

たしかに、iOS 12 まではtintColor で色を変えることができました。

f:id:koogawa:20191219220508p:plain

しかし、iOS 13 からは UISegmentedControl の見た目が変化し、色を変えるプロパティとして selectedSegmentTintColor が追加されています。

f:id:koogawa:20191219220525p:plain

このプロパティの使い方や、色を設定する上での注意点について詳しく解説した回答がベストアンサーに選ばれていました。

参考

第5位:iOS 13.2 の WKWebView が謎のエラーを吐き続ける問題(83票)

stackoverflow.com

iOS 13.2 beta をインストールして以来、ずっと次のようなエラーが出続ける問題です。

2019-10-10 12:10:47.867830+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:47.908698+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:47.908814+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:47.934169+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:47.947668+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:47.964375+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:48.193556+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:48.193723+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:48.193941+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:48.194012+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:48.195679+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:48.200432+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:48.207225+0200 (...) [Process] kill() returned unexpected error 1  
2019-10-10 12:10:48.207298+0200 (...) [Process] kill() returned unexpected error 1 

Storyboard 上の WKWebView を含む ViewController をロードするたびに発生しますが、クラッシュはしないようですね。

実はこの原因は WebKit (またはOS自身)のバグにあるようです。

ちなみに2019年12月現在、このバグはまだ直っていないようです😢

第4位:ダークモードを回避することはできるの?問題(152票)

stackoverflow.com

はい、出ました!ダークモードに関する話題です!

iOS 13 からダークモードが追加されるけど、私は対応する予定はないよ!なんとか回避できない?という質問ですね。このQ&Aを見た方も多いのではないでしょうか!?

Info.plist の UIUserInterfaceStyle に Light を設定すると回避できるよ!という回答がベストアンサーに選ばれていました。しかし、この回答に対するコメントを見ても分かる通り、この回避策だと審査が通らないという声もあります。一番確実なのはダークモードに対応すること、なんでしょうね😅

第3位:Provisioning profile doesn't include 〜 エラーが出ちゃう問題(183票)

stackoverflow.com

第3位はプロビジョニングプロファイルに関する質問でした!

いつものようにアプリを実機ビルドしようとすると、次のエラー出てしまって困っている、という内容ですね。シミュレーターでは起こらないようです。

  1. Automatic signing is unable to resolve an issue with the "LearningSpriteKit" target's entitlements. Automatic signing can't add the application-identifier and keychain-access-groups entitlements to your provisioning profile. Switch to manual signing and resolve the issue by downloading a matching provisioning profile from the developer website. Alternatively, to continue using automatic signing, remove these entitlements from your entitlements file and their associated functionality from your code.
  2. Provisioning profile "iOS Team Provisioning Profile: #####.LearningSpriteKit" doesn't include the application-identifier and keychain-access-groups entitlements.

この原因ですが、結論から言うと一時的なサーバー証明書の問題だったようです。

上記のissueが関連していて、Apple からも 558,000 の証明書が無効になったとアナウンスが出ています。

この問題により、GoDaddy, Google, そして Facebook も影響を受けたようです。

この経緯を簡潔に説明した回答がベストアンサーに選ばれていました。ちなみに、今日現在、この問題は解消されています。

第2位:iOS 13 でモーダルがフルスクリーンにならない問題(286票)

stackoverflow.com

はい、出ました!iOS 13 でのモーダル問題です。

今まで

self.present(vc, animated: true, completion: nil)

のように書けばフルスクリーンでモーダルが表示されたのに、iOS 13 ではセミモーダル(半モーダルと呼ぶ人もいる)になっちゃうよ!どうして?という内容ですね。

「問題」と書いてしまいましたが、これは立派な仕様であり、WWDC 2019 の Platforms State of the Union でもこの新しい Card Presentation について触れられていましたね。

f:id:koogawa:20191223205750p:plain

この経緯とフルスクリーンにする方法について解説した回答がベストアンサーに選ばれていました。

let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen // これでフルスクリーンになる
self.present(vc, animated: true, completion: nil)

第1位:Xcode 11.2 にアップデートしたら UITextView でクラッシュする問題(339票)

stackoverflow.com

今年1位に輝いたのはあの UITextView でクラッシュする問題でした!!

Xcode 11.2 にアップデートしてアプリをビルドすると

*** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named UITextLayoutView because no class named UITextLayoutView was found; the class needs to be defined in source code or linked in from a library (ensure the class is part of the correct target)'

というエラーログをとともにアプリごとクラッシュするけどなんで!?という内容です。

この質問には多くの回答、コメントが寄せられ、現在は Highly active question(非常に多くの回答がついたため、これ以上回答が追加されるのが制限されている状態)になっています。

Workarounds について詳しく解説した回答がベストアンサーに選ばれましたが、今現在の最良の解決方法は「Xcode 11.2.1 にアップデートしろ」ということになっています。

総括

ダークモードに関する質問は少なめ

今年発表された iOS 13 の目玉機能の一つとして「ダークモード」がありましたが、それに関する質問は思ったより多くありませんでした。技術的な質問ではなく、ダークモードを回避するにはどうしたらいいの?という質問が第4位にランクインしていたのも興味深いですね。

私が公開しているアプリもダークモードには対応しましたが、特に大きな問題もなくスムーズに進めることができました。このあたりの対応の進めやすさも質問が少なかった要因の一つかもしれませんね。

やはりモーダルの仕様が変わった影響は大きかった?

iOS 13 からモーダルのスタイルがデフォルトでセミモーダルになりましたが、やはりこれに戸惑った開発者も多かったようです。従来のフルスクリーン表示戻す方法についての質問(第2位)は300票近く集めていましたね(昨年の1位より票が多い!)。このQ&Aを参考にした開発者の方も多いのではないでしょうか?

投票数は全体的に増加傾向

投票数は年々減少傾向にあったのですが、今年は久しぶりに増加しました!昨年の1位(Xcode 9.3 から見知らぬ plist ファイルが追加された問題)が123票だったのに対し、今年の1位(UITextView でクラッシュする問題)はなんと300票以上を集めていました。

要因としては、単純に困った人が多かったのと、ダークモードの登場など、インパクトのある変更が今年は多かったからでは?と感じています。

以上、10日間に渡って2019年のランキングをお送りしました!

というわけで、12月1日から始まった iOS アドベントカレンダーも本日で終了です。エントリーされた皆様、お疲れ様でした!

来年もまた需要があればやるかも!?*1

*1:毎年読んでくれている方がいたらぜひコメントください!需要が知りたいです!