- 投稿日:2019-02-09T19:46:19+09:00
はじめてのiOSアプリ開発でつまずいたポイント
はじめてiOSアプリを開発したんですが、色々つまずきポイントがあったので、列挙していきたいと思います。
ちなみに僕はプログラミング自体は経験があるので、はじめてのプログラミングではないので、
初プログラミングで初iOSアプリ開発の人がつまずくポイントとはちょっとズレるかもしれません。Swift4.0以降で公式ドキュメントが全面刷新されてること
2019年2月現在、Appleの公式ドキュメント探すと、日本語ドキュメントだと下記が公式です。
日本語訳されてるドキュメントは5つだけで、しかも微妙なチョイス……
過去のドキュメントはアーカイブされていますが、情報が古いです。
最新のドキュメント見るには英語版しかないのですが、これが結構初心者だと辛い。
2018年以降に、iOSアプリ開発に入った人は軒並み困ってるんじゃないんですか?ネットに上がってるサンプルコードがSwiftのバージョンアップで死にがち
Swiftは2014年に発表されてから、仕様変更が多いため、
記法がバージョンによってかなり変わっていて、ネットで上がってるサンプルコードが陳腐化してることが多かったです。たとえば、
「’characters’ is deprecated: Please use String or Substring directly」が出てワーニング
とか。ワーニングメッセージに従えば修正できるレベルならかわいいのですが、
モノによっては相当しんどい変更があって、そのたびに公式ドキュメントと格闘することになりました。コードをどこに書いたらいいかわからない
初歩的すぎて書くのが怖いですが、Xcodeでプロジェクト立ち上げたときはどこに書いたらいいかわからなかったです。
override func viewDidLoad() { super.viewDidLoad() //ここに書く }ここに書くと、なんとなーく動きますが、全体が見えてないので、
「なんで?」みたいな気持ちになりました。
ただこれはアプリにライフサイクルがある、というのを知ったので、なんとなく納得しました。
ViewがLoadされた一番最初に呼ばれるのが、viewDidLoad()なので、
そこに何か書いてやると、アプリ起動したときに最初に動くわけですね。(参考)
iOS のイベント駆動をライフサイクルイベントとユーザアクションイベントにわけて理解する標準クラスの継承関係がわからない
viewDidLoad()の話と少し絡むんですが、
たとえばViewControllerひとつとっても、UIViewControllerを継承していて、
(UIViewController?)UIViewControllerはUIResponderを継承していて、
UIResponderはNSObjectを継承していて……みたいな継承関係がわからなかったです。
これが正確に理解できたら、かなりiOSアプリの見通しがよくなると思うんですが、何見るのがいいんでしょうね。
色々探してるんですが、こちらのサイトのレベル感がちょうどいいのですが、
この記事自体はちょっと古い情報なので、もうちょい新しめの情報が欲しいですね。。。
いいの知ってる人いたら教えてくれたら嬉しいです。@IBOutletがわからない
storyboardからGUI操作で、@IBOutletとか@IBActionとかをコードの中につなげられるんですが、最初これの扱いが意味不明でした。
別につなげること自体は、入門サイト見ながら、その指示に従ってやればいいんですが、
つながりを削除したいとき、片方だけ消すとコンパイル通らなくなって焦りました。やっぱプログラミングしてるのに、GUI操作じゃないと制御できない要素があると気持ち悪い感覚があるので、
もっと詳しくなって、コードで全部制御できるようにならないかなあと思っています。
(そもそも可能なのかな?)Selectorが難しい
ユーザーイベントが発生したときの、selectorの指定が難しかったです。
AnyButton.addTarget(self, action: #selector(onButtonClick), for: UIControlEvents.touchUpInside) @objc func onButtonClick(sender: UIButton) { //なんか処理 }こんな感じでユーザーがボタン押したら、何かの処理が走る、という風にできるのですが、Selectorの書き方で詰まりました。
未だにすっきりしてない部分でもあります。サーバ通信が難しい
どのフロント開発でもそんなもんだとは思いますが、サーバ通信が入ると途端に難しかったです。
はてな教科書を見ながら、ほぼサンプルコード通りにつくろうとしたんですが、
いろいろ自分のやりたいことにあわせて変更していくと、上手くいかなくなりました。
具体的に書くと、サーバからJSONじゃなくて、バイナリデータを直で受けようとしたんですが、
受けた後の処理で、どう型変換するかで詰みました。.gitignoreを書くのを知らなかった
これは完全に僕が雑魚なだけですが、つい最近.gitignoreというのを知りました。
iOSアプリをちょいちょい触り始めたときの悩みが、
Gitにキャッシュファイル(DerivedData)とかまでコミットしてしまうことでした。Swift.gitignore
Githubからこれを落として、プロジェクトのディレクトリ直下に置くと、commit時にいい感じに必要なソースだけ上げてくれます。
Githubにソース公開する際にも、見せちゃいけないデータがあるなら、
そのデータが入ったディレクトリを追記しとくと、安心して公開できます。まとめ
最後のgitignoreが正直一番恥ずかしいので、書くか迷ったんですが、
これ以上不幸な人を増やさないために、敢えて書きます。
独学でやってると、「知ってて当たり前」みたいなことを結構落としちゃうんですよね。一番困ったのは、やっぱ最初に挙げた、公式ドキュメントの日本語版が軒並み死んだことだった気がします。
色々ネガティブなポイントを書いてきましたが、
iOSアプリ作ってみた時間を振り返ると、圧倒的に楽しかったです!
散々苦しみましたが、最後に思った通りの挙動でアプリが動いてくれたときの達成感たるや……
もっとスキルあげて、思い通りのiOSアプリをつくっていきたいです。
- 投稿日:2019-02-09T19:45:27+09:00
高品質なSwiftチュートリアルのパート2の翻訳が終わりました
自己サイトの宣伝です。
良質なiOSチュートリアルを提供しているraywenderlich.comから、SpriteKitを使ったゲームチュートリアルの翻訳をしています。
パート2の翻訳が終わりましたのでその報告です。全部でパート3まであり、パート3を残すのみとなりました。
本当に高品質なチュートリアルなので、勉強会とかに使ってもらえたら嬉しいです。
自由にHTMLもっていってもらって構いません。
https://www.doumeishi.me/raywenderlich.com/
- 投稿日:2019-02-09T18:34:52+09:00
ipadでcapturePhoto時にcrashする問題の解決
背景
今回初めてアプリ申請した際にrejectの洗礼を受けてしまったので記事にしてみたいと思います。
reject内容
Your app crashed on iPad running iOS 12.1.3 on WiFi when we tapped to take a photo.
自分はipadPro(10.5inch)とiphoneXS Maxとiphone6sを所持していてそれらで実機テストしているのですがipadないので早速困りました笑
幸いcrashlogの方が送られてきていたので以下の記事を参考させてもらいに解析しました
https://qiita.com/ruwatana/items/cc470eb229d267d693b0crashlogLast Exception Backtrace: 0 CoreFoundation 0x1a2ae9ea4 __exceptionPreprocess + 228 1 libobjc.A.dylib 0x1a1cb9a50 objc_exception_throw + 55 2 AVFoundation 0x1a8c82b48 -[AVCapturePhotoOutput capturePhotoWithSettings:delegate:] + 751 3 camera 0x1041f4120 0x1041ec000 + 33056やはりAVCaputurePhotoOutputが怪しい事が分かったので調べると以下の記事を発見https://qiita.com/jumperson/items/1f47e91f2fec80654b09
どうやらiPadではFlashが使えずAVCapturePhotoSettingsのflashModeをautoにしていたらcrashしてしまうとのこと。解決方法
カメラ起動時にFlashをサポートしていない端末の場合はFlashをoffにすることで解決
viewDidLoad()//flashサポートしてるかの確認 let device = AVCaptureDevice.default( AVCaptureDevice.DeviceType.builtInWideAngleCamera, for: AVMediaType.video, // ビデオ入力 position: AVCaptureDevice.Position.back) if !device!.hasFlash{ let captureSetting = AVCapturePhotoSettings() captureSetting.flashMode = .off }審査通るといいですがまた別の問題でrejectくらいそうです笑
- 投稿日:2019-02-09T14:46:13+09:00
【iOS】アプリ名を変更する
TARGETS -> General -> DisplayName より変更可能。