【SwiftUI】プログラミング始めてから約1ヵ月でアプリをリリースした話

題名通り、今年の9月末からMacBookを買い、細々とSwiftUIを勉強しながらアプリ開発をしていたのですが、先日漸くアプリリリース至ることが出来ました。このリリースまでの1ヵ月間、どのようにリリースまでに至ったのか記憶が鮮明なうちに書き記しておきます。

 

結論

まず結論から申し上げますと、素人が個人でアプリ開発する際には本を買いましょう。スクールに通う選択肢も良いと聞きますが、とりあえず本を一冊買ってその中身を辿ってコーディングするだけでも何となくプログラミングというものを掴むことが出来ます。どのようなアプリを作るか、そしてどのアプリを開発するためには何が必要かが分からないうちは、自分のできることを増やすために本を読んで真似するのが一番だと思います。そのうえで色々試行錯誤しながら開発を進めていくことがリリースへの近道になるはずです。

 

初期

とりあえず何を作るかさえも決まっていなかったので、どのようなことをしてプログラミングができるのかを知るために参考書を買いました。

 

www.amazon.co.jp

 

この本を片手にコードを真似して、そして自分で少し変更しながらどのような仕組みなのかを知ろうとしました。が、少しでもコードを変えると動作しなかったりするので、何とかして動くように粘ることが多かったです。

 

また、このころライブラリという便利なものがあると聞いて軽く検索していたのですが、SwiftUIは非常に新しいフレームワークでそれに対応しているものが少なく、若干SwiftUIを使っていることを後悔した思い出があります笑。とはいえ、とても有用なライブラリもありますので、「ターミナル」アプリから「Cocoapods」という便利なソフト?をインストールすれば、簡単に色々なライブラリをインポートできるようになります。

 

中期

多少やれることが分かってくると、それを使って作れるものが思い浮かんでくるはずです。正直、真似するだけも飽きてきたのでコードはそこそこに、作りたいアプリをノートに殴り書きして、必要なものをリストアップしていきました。私の場合、ローカルでデータを保存する必要があったので、データベースをなんとかして学ぶ必要が出てきました。

 

realm.io

www.amazon.co.jp

 

これまた「Realm」を学ぶために参考書を購入しましたが、正直全く理解できませんでした(この参考書が悪いというわけではありません笑。むしろ最終的にはとても役立ちました)。そこでなんとかSwiftUIでRealmを使っている方の記事を参考にして、データベースの導入を試みましたが、人によって書いていることが違うのでかなり混乱させられました。

 

MVVMにやられた話

MVVM、またはModel-View-ViewModelという考え方に非常に苦しめられました。正直今でも把握できていないくらいなのですが、様々な方がこのシステムを用いてアプリを管理していたので、これについて理解しないとデータベースを使った挙動が実装できませんでした。もし、これからアプリ開発を始める方で「ViewModel」という単語が出てきたら、MVVMについていろいろ調べてみると良いと思います。

 

終盤

MVVMもなんとなくわかり、Realmも色々試して使えるようになってからはあとはUIの部分を実装するだけなので、これに関しては非常にSwiftUIは楽でした。ただ、スクロールの挙動などを自前で実装する必要があった際に、4時間以上苦労した記憶は新しいです。

 

www.amazon.co.jp

 

追加でこの本もとても参考になりましたので、ある程度慣れてきた方はぜひ見てみてください。

 

お絵かきした話

ゲーム性のあるアプリを開発したかったので、キャラクターの画像を自らドットツールを使って作成しました。個人でアプリ開発する際には、ここで労力をかけるのは大変なので、外注や依頼をしてみても良いと思います。

 

アプリ審査まで

紆余曲折ありましたが、とりあえず一通りアプリが開発できたのでリリースをしようと思い調べると、想像以上に面倒な作業が私を待っていました。具体的には、

・証明書類の発行

Apple developer programの加入(年間約12000円の会費)

App Store Connectにアプリ情報の登録

などなど手間がかかる物が多いです。

特にApp Store Connectにアプリを登録する際には、「App Storeに載せる写真(旧スマホ用と新スマホ用、必要ならiPad用)」や「アプリアイコン」などプロゲラミングとは直接関係ないものを用意しなければなりません。やっとプログラミングが終わってリリースしたくても、そこにたどり着くまでに一苦労です…。個人でやる際にはここら辺をあらかじめ把握しておくと、予定に余裕が持てると思います。

 

i-app-tec.com

 

この方のサイトが参考になりましたので、ぜひご確認下さい。

 

リジェクトについて

やっとのこさリリースまでこぎつけたとしても、必ずしも審査が通るとは限りません。幸いにも私は一度もリジェクトされず審査に通りましたが、あらかじめリジェクトされる可能性があると身構えておく方が良いかもしれません。ちゃんとリジェクトされた理由は教えていただけるらしいので、なんとかやるしかないですね…。怖い

 

終わりに

アプリリリースまで色々素人なりに格闘してきましたが、何よりも大変だと思ったのがプログラミングに時間を拠出することです。モチベーションの維持ももちろん、プログラミングは時間と体力を使うので、他にやることがあるとなかなかストレスになりやすいです。ギブアップしないためには、短期目標を立てつつ、あまり今詰め過ぎないでアプリの進歩を友人や家族と共有しつつやるのが良いのかなと思います。あと、経験者に気軽に聞けると進捗的にも、精神的にもだいぶ楽かもしれないです。

 

最後に、作ったアプリを載せておきますので、1ヵ月で作ったアプリがどんなものか気になった方はインストールしてみてもらえると嬉しいです。

 

TaskQuest

TaskQuest

  • utsugi hyuga
  • 仕事効率化
  • 無料

apps.apple.com

<Task Quest> Privacy Policy

 

Privacy Policy

Hyuga built the TaskQuest app as a Free app. This SERVICE is provided by Hyuga at no cost and is intended for use as is.

This page is used to inform visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service.

If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the Service. I will not use or share your information with anyone except as described in this Privacy Policy.

The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at TaskQuest unless otherwise defined in this Privacy Policy.

Information Collection and Use

For a better experience, while using our Service, I may require you to provide us with certain personally identifiable information. The information that I request will be retained on your device and is not collected by me in any way.

The app does use third party services that may collect information used to identify you.

Link to privacy policy of third party service providers used by the app

Log Data

I want to inform you that whenever you use my Service, in a case of an error in the app I collect data and information (through third party products) on your phone called Log Data. This Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing my Service, the time and date of your use of the Service, and other statistics.

Cookies

Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device's internal memory.

This Service does not use these “cookies” explicitly. However, the app may use third party code and libraries that use “cookies” to collect information and improve their services. You have the option to either accept or refuse these cookies and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this Service.

Service Providers

I may employ third-party companies and individuals due to the following reasons:

  • To facilitate our Service;
  • To provide the Service on our behalf;
  • To perform Service-related services; or
  • To assist us in analyzing how our Service is used.

I want to inform users of this Service that these third parties have access to your Personal Information. The reason is to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information for any other purpose.

Security

I value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and I cannot guarantee its absolute security.

Links to Other Sites

This Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by me. Therefore, I strongly advise you to review the Privacy Policy of these websites. I have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services.

Children’s Privacy

These Services do not address anyone under the age of 13. I do not knowingly collect personally identifiable information from children under 13. In the case I discover that a child under 13 has provided me with personal information, I immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact me so that I will be able to do necessary actions.

Changes to This Privacy Policy

I may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. I will notify you of any changes by posting the new Privacy Policy on this page.

This policy is effective as of 2020-10-31

Contact Us

If you have any questions or suggestions about my Privacy Policy, do not hesitate to contact me at keio3777app@gmail.com.

This privacy policy page was created at privacypolicytemplate.net and modified/generated by App Privacy Policy Generator

【プログラミング】SwiftUIでアプリ作る【4日目】

時間を割くのって大変

おとといサークルの新歓活動があって一日中身動きが取れなかったので、プログラミングができませんでした。(言い訳)

 

それでもって次の日も家でうだうだしていたらいつの間にか夜に…。時間的な意味でも精神的な意味でも時間を割くのは結構大変ですね~。(他人事)

 

夏休みが明けて大学が始まったら、それこそ精神的にプログラミングをやっている余裕がなくなりそうで怖いですね。一日どこかの時間をプログラミング、というかそれに関するものに触れる時間として決めてもいいかもしれません。

 

現状は作りたいもののためにひたむきに開発していないため、精神的に遠まわしにしてしましがちなので、せめて今月中に作れるものと作る物の目途を立てようと思います。

 

RealmSwiftを触ろうとした

前回の最後にも触れたとおり、Realmというデータベースを触ろうとしてみました。Realmは端末上でのローカルでデータを扱えるようになるので、サーバーなどの用意をしなくても簡単なToDoアプリなどを作れるので挑戦してみましたが、やはりというか知らない・理解できないことも多く苦労しました。

 

参考にさせていただいたコードを一行ずつ意味を調べていき、各Swiftファイルがどのような役割を果たしているかを考えてみました。

 

f:id:pomeraso:20200921231101j:plain

コード調べ

f:id:pomeraso:20200921231107j:plain

ファイルのつながり

見づらかったらすみません…。

 

合っているのかは不明ですが、自分の調べた限りではこのような感じです。まだまだ全容を掴むには足りないですが、他に触りたいものが出来たので一度Realmは置いておこうと思います。

 

参考(再掲)↓↓↓

software.small-desk.com

 

GoogleのFirebaseを使いたい!

さて、なぜ前項でRealmの勉強をやめてしまったかというと、FireBaseという非常に便利なものを発見したからです。(正確には名前は知っていたけど詳しくは知らなかった)

 

これはサーバーなどのバックエンドの面倒な部分を引き受けてくれるデータベースで、簡単なチャット機能やログイン機能なら簡単に作れるという噂です。(簡単というのはあくまで開発者目線だとは思いますが…)

 

ということで物は試しとFirebaseを使おうとしたら、どうやら基本的なインストールの手順はRealmを同じでCocoaPodsからインストール出来るようですね。

 

参考↓↓↓

qiita.com

 

最近SwiftUIのアプリ開発構成は主流じゃないことに気付かされたので、わざわざ「SwiftUI」を使ってFirebaseを用いている記事を探しました。

 

とここで問題が発生しました。

 

AppDelegate.swiftないんだけど?

 

他のUIKitとかSwift主流の開発記事、さらにはFirebase公式のインストール手段の記載でも出てきたこの「AppDelegate.swift」。こやつがここでも呪縛してきました。

 

StoryBoardを使った開発ではよく使うのでしょうが、こちらはアプリ開発歴4日の素人。しかも簡単と名高いSwiftUIの勉強で手いっぱいの凡人なので、さっぱり分からないですね。

 

「AppDelegate.swift」の代わりになる物を探すと「~~App.swift」という中身が似ているファイルがあったので、内容をなんとかいじって代替させようと試みています。

 

これからしばらく用事がある日が続くので、ゆっくり腰を据えて調べている暇はなくなってしまいますが、このFirebaseを扱えるとっかかりがつかめれば今後開発できるアプリの幅も広がると思いますので、なんとか頑張ってみようと思います。

【プログラミング】SwiftUIでアプリ作る【3日目】

やっぱりRealmSwift分からなかったよ…

普段触っているSwiftUIは結局のところUIを制作するものなので、RealmSwiftを扱うためにはまた新しい用語や定義を理解する必要がありそうです。

 

現状SwiftUIだけを使ってアプリの大枠自体は作れると思うので、データを扱う系統の話は一旦置いておこうと思います…。

 

参考にした記事やページを自分用に載せておきますね。

↓↓↓

realm.io

 

software.small-desk.com

 

また必要に迫られたらリベンジします。

 

URLを開く!

アプリ経由でTwitterのプロフィールを開けないかなと調べていたら、指定したURLを開く方法を見つけました。TwitterのプロフィールのURLは"https://twitter.com/"+"ユーザー名"なので、これを定義して開けるようにすればいいわけですね。Twitterのユーザー名がTwi.userNameで表されるとき、

 

→var body: some View {

     let userUrl = "https://twitter.com/"+"Twi.userName"

     Button(Twi.userName, action:{

          if let url = URL (string:userUrl){

               UIApplication.shared.open(url, options:[.universalLinksOnly:false])

               }

          }

     )

}

 

これでTwitterのアカウント名をタッチすると外部のアプリ(TwitterSafariとか)でユーザーのプロフィールを開けるボタンが設置できました!

 

参考にしたサイト様

↓↓↓

t.co

 

今後やりたいこと

正直やりたいことをやろうとする度、その1つ1つを実装する壁が高いので、まず自分の作りたいアプリのUIを仕上げていこうと思います。その段階で導入しなければいけないものを書き出して、最終的に取り掛かるのが賢いかな?

 

加えて、このブログも自分の手探りを見返せるように、引き続き少しずつ更新していきたいと思います。

 

今日と明日でボタンとかスイッチとかつけてみたいですね!

【プログラミング】SwiftUIでアプリ作る【2日目】

構造体データを配列に入れる。

昨日これが良く分からなかったまま床に就いたのですが、気になって眠れず深夜3時くらいまでXcodeをこねくり回してみたところ、若干ではありますが整理できました。

 

まずは昨日書いた、「構造体を定義する」ことから

→struct Data: Identifiable{

      var id: Int

      var titleName: String

     }

 

この構造体の形でデータを作って配列にしたいので、関数「makeData()」を定義します。

→func makeData() ->[Data] {

     var dataArray:[Data] = []

     dataArray.append(Data(id: 1, titleName: "SwiftUIでアプリを作る1日目"))

     dataArray.append(Data(id: 1, titleName: "SwiftUIでアプリを作る2日目"))

 ・・・

     return dataArray

}

 

"func makeData() ->[Data]" は処理の結果を「Data構造体」で返すmakeData()関数を定義しています。他の部分はmakeData()関数の処理の部分で、dataArrayと仮定義した配列に「Data構造体」型のデータを追加しています。

 

これだけだとmakeData関数を作っただけなので、実際にこれを使った変数を定義して配列「blogArray」にmakeData()関数によってデータを入れたいと思います。

→var blogArray:[Data] = makeData()

 

「Data構造体」型のblogArrayはmakeData()関数によってデータが入れられ、配列になるはずです。

 

配列を使ってリストを作る

List()←この括弧内には配列の範囲(レンジ)を指定するのですが、今回は括弧内に直接配列である「blogArray」を入れれば良いみたいです。(構造体で指定したデータを入れた配列だから?)

→struct ContentView: View {

     var body: some view {

          List(blogArray) { item in

               Text(Data.titleName: item)

          }

     }

}

とかでできるのかな?「item in」を使って配列から一つずつデータを取り出しているらしいです。

 

ライブラリを使いたい!

昨日も言ってましたが、自分が作りたいアプリには様々な機能が必要なので、色々なライブラリを使うのが良いです。しかしSwiftUIくんはまだ新しいので対応しているライブラリが少ないらしく(正確には"対応している"などの表現は正しくはありませんが…)、一方でSwiftUIだけでアプリを作るには力不足なようです。

 

とはいったものの、初心者の僕を拾ってくれたSwiftUIを使いたいので、使えるライブラリを探したところ色々あるみたいです。

 

参考:SwiftUIおすすめライブラリ!!

qiita.com

 

他にもアプリ内でデータベースを扱える「RealmSwift」やアプリ開発のバックエンド環境を提供してくれる「firebase」などはぜひとも使いたいものです。

 

それらのライブラリのインストールには「CocoaPods」なるものが必要なので、すでに機能の時点で導入をしていました。が、その後の手順を真似してもなぜかライブラリが使えませんでした…。(使える場合は"import RealmSwift"のようにすると使える)

 

その時参考にした動画:Realm Database With SwiftUI - CRUD Operations On Realm Database With SwiftUI - Realm With SwiftUI

www.youtube.com

 

困りながら同じ現象に陥った人を調べてみると、幸いにも対処法込で書かれているサイト様を発見できました。

 

参考:swiftで外部モジュールのimportエラー

programming-practice.hateblo.jp

 

このサイト様にあるように「コマンド+B」を押せばpod fileが読み込まれてしっかりと使えるようになりました。めでたしめでたし。

 

おわりに

今日は色々調べるのに時間がかかってしまったので、今日の夜、「RealmSwift」などのライブラリがどう使えるのかを手探りで触って(よくわからない可能性が高いので他のことをやるかもしれませんが)、明日ここにお伝えしたいと思います。

【プログラミング】SwiftUIでアプリ作る【1日目】

MacBook Proを購入した。

最近、iPhoneでアプリを作るためにMacBook Proを14万円ほどで購入しました。

 

なぜWindowsのPCでは駄目かというと、iPhoneのアプリは「Swift」というプログラミング言語でしか制作できず、この「Swift」を扱えるのが「MacBook」などのiOSだけだからです。

 

ぶっちゃけ「MacBook Air」を買えば安く済むのですが、プログラミングの処理の実行には性能の高い「MacBook Pro」の方が良い。とネットでも量販店の店員さんにも言われたので、処理関係でモチベが落ちる方が嫌だと思い、この際だと思って高い「Pro」を購入しました。

 

さて、何はともあれ14万円という買い物は一大学生にとって非常に大きなものですので、自分の尻を叩きながら当面のモチベを保っていきたいと思っております。

 

XcodeをAppStoreからダウンロードした。

Macを触るのが初めてだったので少々手間取りましたが、iPhoneと同じくAppStoreがホームにあるので、そこからアプリ開発のために「Xcode」をダウンロードします。なんとこのXcodeだけでアプリが作れるらしいですね。心が躍ります。

 

6時間ほどXcodeをいじった感想。

買ってきた参考書を手に色々といじってみた正直な感想は、「制約が厳しい」ということです。確かにサンプルコードの通り打ち込めば動作はするようですが、少し自分が変更するとすぐ不具合が生じてしまいます。サンプルコードを理解したつもりで所々変更をするとうまく機能せず、挙句にどこがダメなのか分からないといった具合です。

 

プログラミングは完全に定義された、つまり作られた動きしか想定していないので、それを完全に理解してしっかりと要件を満たしたプログラミングをする必要がありますね。

 

途中、「SwiftUI」「UIKit」「CocoaPods」「RealmSwift」など便利なフレームワークプラグイン?などを調べて(当然ですが)使いこなせなかった結果、頭が混乱してしまった経緯もありますので、段階ごとに目標を立ててしっかり理解を深め、やれること増やしていこうと思います。

 

分かったこと・疑問点など

・配列(Array)

Swift内では「配列」といったデータのようなものを定義できます。

(例)"Pokemon"という配列に"ヒトカゲ","ゼニガメ","フシギダネ"を定義する場合

→ let Pokemon = ["ヒトカゲ", "ゼニガメ", "フシギダネ"]

 

この「配列」をリストに表示させると…

→ List(0..<Pokemon.count) { item in

                 Text(Pokemon[item]) }

ヒトカゲ

 ゼニガメ

 フシギダネ

と綺麗にリストになって並ぶ。

 

分からないのが、

構造体「Data」を定義

→struct Data: Identifiable{

      var id: Int

      var titleName: String

     }

した後に、この構造体でデータを作って配列にするには

→func makeData()->[Data] {

     var dataArray:[Data] = []

     dataArray.append(Data(id: 1, titleName: Pikachu))

    ・・・

     return dataArray}

で良いのかどうか…?理解が足りず突拍子もないことかもしれませんが。

 

・リストから詳細ページに移動(NavigationLink)

別に作ったページに移動できるリンクです。

そのページを「Subview」とすると、

→NavigationLink(destination: Subview){

     Text("リンク先に移動") }

 

眠くなったので、また明日更新します。