- 投稿日:2021-01-18T23:14:55+09:00
[Swift]定数と変数
- 投稿日:2021-01-18T22:56:47+09:00
Swift Firebaseを使ってみよう FirebaseAuth編
FirebaseAuth導入
※この記事ではFirebaseコンソールでの設定は終わっているものとしています。
まずはターミナルを開いてプロジェクトに移動しましょう。cd /Users/[ユーザー名]/Desktop/[プロジェクト名]/
移動ができているか心配の方は
pwd
コマンドを実行してください。
移動したらポッドファイルの作成をします。pod initコマンドを実行すると
podfile
が作成されています。
確認方法はls
コマンドを実行しましょう。
ちゃんと作成されていたらopen podfileでファイルを開きます。
開いたらこんな感じに編集してください。# Uncomment the next line to define a global platform for your project # platform :ios, '9.0' target 'FirebaseTest' do # Comment the next line if you don't want to use dynamic frameworks use_frameworks! # Pods for FirebaseTest // 追加 pod 'Firebase/Auth' endもう一度ターミナルに戻ります。
戻ったら次のコマンドを打ちます。pod intallこれで
FirebaseAuth
が使えるようになります。使ってみよう 新規ユーザー登録編
ターミナルで
open [プロジェクト名].xcworkspaceと打ってください。
Finderから開いても大丈夫です。
拡張子が.xcodeproj
じゃなくて.xcworkspace
ですので間違えないようにしてください。
開いたらViewController
の編集をしましょう。ViewController.swiftclass ViewController: UIViewController { private var emailFiled = UITextField() private var passwordField = UITextField() private let authButton: UIButton = { let button = UIButton() button.setTitle("登録", for: .normal) return button }() override func viewDidLoad() { super.viewDidLoad() emailFiled = initField(placeholder: "email") passwordField = initField(placeholder: "password") authButton.addTarget(self, action: #selector(didTapAuthButton), for: .touchUpInside) view.addSubview(emailFiled) view.addSubview(passwordField) view.addSubview(authButton) emailFiled.frame = .init(x: 50, y: 100, width: view.frame.size.width-100, height: 40) passwordField.frame = .init(x: 50, y: 160, width: view.frame.size.width-100, height: 40) authButton.frame = .init(x: 50, y: 220, width: view.frame.size.width-100, height: 40) } @objc func didTapAuthButton() { } private func initField(placeholder: String) -> UITextField { let field = UITextField() field.placeholder = placeholder field.autocorrectionType = .no field.autocapitalizationType = .none field.layer.borderWidth = 1 field.layer.borderColor = UIColor.black.cgColor if placeholder == "password" { // 入力した文字を隠す field.isSecureTextEntry = true } return field } }こんな感じにViewを設定しましょう。
さあ、お待たせしました。
FirebaseAuth
を使っていきます。
didTapAuthButton
の中に処理を書いていきます。
変更点だけ書きます。import FirebaseAuth class ViewController: UIViewController { @objc func didTapAuthButton() { guard let email = emailFiled.text, let password = passwordField.text else {return} Auth.auth().createUser(withEmail: email, password: password) { (result, err) in guard let user = result?.user, err == nil else { print("error: ", err!) return } let userEmail = user.email print("email: ", userEmail ?? "") } } }新しくユーザーを作成するのはたったのこれだけ
なんならcreateUser
の後に実行したい処理がなければAuth.auth().createUser(withEmail: email, password: password)
だけで済みます。
まあクロージャの中身空にしたまま使うことなんてほぼないと思いますけど。使ってみよう ログイン・ログアウト編
ログインも早速コードをみてみましょう。
@objc func didTapAuthButton() { guard let email = emailFiled.text, let password = passwordField.text else {return} Auth.auth().signIn(withEmail: email, password: password) }これだけでログイン機能ができます。めっちゃ簡単ですね。
ログアウト機能もこんな感じでできます。
@objc func didTapAuthButton() { do { try Auth.auth().signOut() } catch(let err) { print(err) } }ログアウトは例外処理が発生しますので例外処理って何?って思う方はこちらを参照してください。
Swift 4.0 エラー処理入門他にも電話番号でログインしたりする機能も簡単に実装できるので調べてみてください。
今回はここまで。
- 投稿日:2021-01-18T21:58:52+09:00
はじめてのSwiftLint
「SwiftLintをそろそろ導入してみましょう」
とアドバイスを頂いたので、挑戦してみました!こんな方向けの記事
・Swiftを始めて何もかもよくわからない
・でもなんとなく少しはわかるようになったSwiftLintってなに?
SwiftLintは、「swiftの静的解析ツール」だそうです。
静的解析ってなに??今さら聞けない「動的テスト」「静的テスト」とは?
なるほど。
機会的にチェックしてくれる、ツールってことですね。
どうやら、機会的にチェックするが故に指摘項目も多くなる、とのことです。さてやってみましょう。
実際にやってみました
SwiftLintの導入には、
Mint,Homebrew,CocoaPodsのどれかが使える環境が必要なように感じました。
「ああ、なんだよ、それ。それから調べないとじゃん」と思っていましたが、
サロンの大先輩が、こっちでやるのが一番簡単だよ、とのことで、
教えてくれた通りに実施してみました。まず、SwiftLintの在処へアクセス。
当たり前ですが、全部英語です。
そのうち慣れると思っていますが、よちよちは「ひえぇぇえええ」ってなりますよね。
私はなりました。スクロールして、少し下の方に行くと、
「Using a pre-built package:」の箇所があります。
上図の英語たちをグーグル翻訳に頼ってみますとビルド済みパッケージの使用:
最新のGitHubリリースSwiftLint.pkgからダウンロードして 実行することにより、SwiftLintをインストールすることもできます。
と、翻訳されました。
ふむふむ。
リンクをクリックして、「SwiftLint.pkg」とやらをダウンロードすればいいのかな。
早速、やってみます。
リンクをクリックすると
英語のページに飛びました。
ここから、下にスクロールしていくと、見つけました!!
「SwiftLint.pkg」をクリックします。
ダウンロードに5分くらいかかるので、ここでちょっと休憩。
ダウンロードが終わり、ダウンロードのフォルダからダブルクリックで解凍しようとすると、
「これは確認取れてないやつなんで、開けません」的な注意喚起が出てきます。ふふふ。私は、もうそこでは躓かないぞ。(過去に体験済)
Finderから、ダウンロードフォルダに行って、
該当の「SwiftLint.pkg」を「control」を押しながらクリック。
そうすると、開くのところが出てくるので通常通りそのままクリック。
そうすると、さっきとは違う注意喚起が出てきます。
「ええ。もちろん、開きますとも。」
これはイケナイことですが、「みんなが使っているから大丈夫!」という
情弱丸出しの現状で、なんの疑いもなく「開く」をクリックします。
仕方ありません、初学者です。
いつかはちゃんと根拠を持った判断ができるようになると信じています。さて、次に検証してみたい(実験に使えそうな)プロジェクトを立ち上げてみます。
プロジェクトの一番上のフォルダを選択して、このような画面を開きます。
そうすると、このプロジェクトの概要的なところが映し出されますので、
上のメニューバー
こちらの「Build Phases」を開きます。
ビルドフェーズと読むそうです。
上の図の左下にある「+」ののところをクリックして、
「New Run Script Phase」をクリックします。そしたら、Run Scriptのところに、
コードが書けそうな場所が現れます。
そこに、下記のコードをコピペします。if which swiftlint >/dev/null; then swiftlint else echo "SwiftLint does not exist, download from https://github.com/realm/SwiftLint" fiそして、そのまま「⌘+B」!!
すると、どうでしょう!!
SwiftLintのないときは、数個のエラーだったこのプロジェクトが!!44個のissuesを発掘しました!!
薄々は気づいてましたよ。
レイアウトに問題があることを…。
iPhone11でビルドしたときはいいけど、iPodでビルドしたら
レイアウト、くっそ崩れてましたもんね・・・と、いうことで、根気強くこれらのイシューさんを開拓していこうか、と思いました。
イシュー多すぎて睡魔に襲われたので、明日にします…。わからなかったこと!!
・これ毎回コピペするの??最初から、Xcodeに取り込んで置くことはできないの?
・このWarningのエラー文を簡単に翻訳する方法はないの??まぁ、英語に慣れろってことですよね。
エラーの表示も設定でカスタムできるみたいですね。
もう少し、使って調べてみて、より良い使い方を身につけたいと思いました。今日はここまで。
- 投稿日:2021-01-18T09:30:19+09:00
SwiftUIで作るしりとり地図アプリ
iosアプリ開発を学ぶために、位置情報を組み合わせたしりとりアプリを作成しました。
https://apps.apple.com/app/id1537582064#?platform=iphoneなんで作ろうと思ったか
モバイルアプリ開発のスキルを身につけるために、すぐに作れるチュートリアル的なものを作ろうと思って作りました。しりとりをするだけのアプリなら1ヶ月くらいで終わるだろうと思って始めたのですが、半年もかかる壮大なプロジェクトになってしまいました。
利用技術
- フロント: SwiftUI
- バックエンド: Firebase
発表されたばかりで目新しかったというだけの理由で、SwiftUIを利用しました。
Swiftそのものを触ったことがない、かつ成熟していない技術のため調べるのが難しいので大変でした。バックエンドはFirebaseのFirestoreとFunctionを活用しました。完成図
回答画面
しりとりを回答して送信する画面。
しりとりになっていなかったり、英数字が入力されたりするとバリデーションがかかる。
地図画面
しりとりの入力場所を地図上に表示する画面。本アプリの目玉。回答地点のピン間をアニメーションで繋いだのがポイント。
履歴画面
これまでのしりとり経歴を表示する。自分の回答のみフィルタすることも可能。
工夫したこと
非同期通信
DBにFirestoreを利用することで、しりとりデータの回答送受信を非同期通信で実現することができました。回答を送信した後、更新ボタンなど押すことなく地図画面、履歴画面の内容が更新されます更新されます。
(一方トランザクションは考慮されていないので、複数人が同時に送信した時の挙動が不安定...)しりとり選択時の地図表示
地図表示にはSwiftUIではなく、SwiftのMapkitを利用しています。ピッカーで選択されたしりとりを地図上に表示させるために、MapkitとSwiftUIの状態変数をバインディングさせてるのが大変でした。
位置情報データ利用におけるプライバシー配慮
位置情報データを利用するにあたってユーザーからきちんと利用同意をとる必要があり、きちんとできていないとAppStoreのレビューで信じられないくらい怒られます。
実はここが一番苦労したところで、下記の機能を実装することでクリアしました。
1. 利用規約同意
2. 投稿時に位置情報を非公開にする機能
3. 既に投稿したしりとりの位置情報を非公開に変更する機能
アプリにとってはいわば非機能部分の実装ですが、何気にかなり時間がかかりました。感想
開発に行き詰まるたびに、「このアプリは何のためにあるのだろう」という気持ちが頭をよぎり、モチベーションを維持するのが大変でしたが、なんとかアプリリリースまで漕ぎ着けてよかったです。
技術を身につけるために個人開発をするのはとてもためになりますが、役に立つもの、モチベーションが上がるものを作ることが何よりも大事だなあとしみじみ思います。
一緒に開発していただいた@antyuntyuntyun さんにこの場を借りて感謝申し上げます。