iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

2021-04-01から1ヶ月間の記事一覧

【Firebase Authentication】KotlinでSignIn・SignUp

Android・Kotlinで、Firebase Authenticationを使った、メールアドレスによるSignIn・SignUpの実装をしたので、簡単に手順をまとめてみたいと思います‍♀️ やっていく まずはFirebase Authentication Androidライブラリを、アプリレベルのGradleファイルに記…

【Kotlin】data classでinterfaceに準拠する

Kotlinのdata classでinterfaceに準拠する際の書き方をメモ 結論 data classのイニシャライザに、Sportのインターフェースを含める場合には、下記のようにoverrideでプロパティを宣言する必要があるみたいです✍️ interface Sport { var name: String } data …

Kotlinのスマートキャスト

スマートキャストとは? スマートキャストは、型判定とキャストが同時に行われる、Kotlinコンパイラの仕組みのことをいいます。 使い方 Kotlinではis演算子を使うことで、下記のようにスマートキャストが行われます。 fun demo(x: Any) { if (x is String) {…

KotlinでもSwiftのif let else的なことをしたい

結論 普通にオプショナル値をアンラップしたい場合は、以前の記事でも紹介したように、let { }を使います。 val num: Int? = null num?.let { println(it) } アンラップできた場合とできなかった場合で処理を分岐をする場合は、下記のようにalsoとrunを使っ…

【iOS】Firestoreで強制アップデート機能をつける

Firestoreを使って、アプリ側の強制アップデート機能を実装したので、今回はその方法を簡単に紹介していきたいと思います‍♀️ それではやっていく まず重要なのは、現在のバージョンが必須バージョンを満たしているかどうかの条件分岐です。これは以前のブロ…

App Store からアプリの配信を停止する

本日はタイトルの通り、App Storeでのアプリ配信を停止する方法を紹介したいと思います やっていく とりあえず App Store Connect にログインして、指定のアプリを選択します。 価格および配信状況を選択します。 下の赤で囲んだ配信可否セクションで配信か…

【Swift】SafeAreaを取得する

今回もSwiftの超短い小ネタです‍♀️ 結論 iOS11以降からは、下記のようにUIViewのsafeAreaInsetsからSafeAreaの幅等を取得することができます。 UIApplication.shared.windows.filter { $0.isKeyWindow }.first?.safeAreaInsets.top ?? 0 てな感じで本日は以…

Swiftで単色のUIImageを生成する

本日はSwiftの小ネタです👷‍♀️ 結論 下記のようにして、単色のUIImageを取得することができます。UIGraphicsBeginImageContext()は、GraphicsContextを作成してスタックにプッシュします。次に、プッシュされたコンテキストをUIGraphicsGetCurrentContext()で…

KotlinにもResultがあった

Swift同様に、KotlinにもResult型があったので、簡単に使い方をまとめてみます👷‍♀️ とりあえず使う とりあえず、成功した場合と失敗した場合のハンドリングしたい場合はこんな感じで、Swiftよりもスマートに書ける印象。 val result: Result<Int> = Result.success</int>…

Kotlinの三項演算子

Kotlinでも普通に三項演算子が使えると思ってたら、使えないみたいなので簡単にメモを残しておきます‍♀️ val max = (a > b) ? a : b // 三項演算子の代わりに、普通にIf式を使うとそれっぽくかけるらしいです。 val max = if (a > b) a else b // // ... i…

RxBindingでTextViewの変更を監視する

AndroidのTextViewで、インクリメンタルサーチを行う実装をRxBindingというライブラリを使って行ったので、その方法を簡単にまとめていきたいと思います‍♀️ github.com やっていく そもそもRxBindingとは?というところから調べてみると、公式レポに下記のよ…

【Android】TextInputLayoutにローディングを表示したい

結論 下記のようにContextにExtensionを生やして、システムデフォルトのローディングインジケーターを取得することができます。drawableの生成だけだと、アニメーション化されないため、(drawable as? Animatable)?.start()でアニメーションを開始させていま…

【RxSwift】ストリームに影響を与えない処理を追加する

下記のようにsubscribe時に必要な処理を全て書いても問題ないですが、Logger.log(text)はイベント処理するための本質的なメソッドではないため、このような状態を許容しているとどんどんコードが見づらくなっていくことが予想できます。 incrementalSearchTe…

【RxSwift】特定のObservableの最新値をストリームに合成したい

結論 あるObservableの最新値をストリームに合成したい場合は.withLatestFrom()オペレーターを使用します。 ob1.withLatestFrom(ob2) .subscribe(onNext: { ob1, ob2 in // TODO: }) .disposed(by: disposeBag) 短いですが、本日も以上になります その他の記…

【Swift】reloadDataの完了後に処理を行う

本日は誰もが通るであろうUITableView/UICollectionViewの小ネタです‍♀️ 結論 UITableView/UICollectionViewのreloadData()のcompletionHandlerは公式でAPIが公開されていないので、UIView.animateを使うことでreloadData()の完了後に処理を書くことができま…

【RxSwift】一定期間内に発生したイベントの最初のイベントを取得する

結論 下記のようにすることで、observableから流れてくる最初のイベントから500msの間隔があくまで、次のイベントをストリームに流さないようにすることができます。例えば、UIScrollViewなんかで最初のスクロールイベントのみを取得したい場合なんかに有効…

【Firestore】Date型でクエリカーソルを使用する時の注意点

先日、Firestoreのクエリカーソルを日付で追加してデータを取得しようとすると、指定した位置のドキュメントがうまく取得できなかったのでメモを残しておきます‍♀️ let startDate = Date() db.collection("cities") .order(by: "serverDate") .start(at: [st…

【Swift】translatesAutoresizingMaskIntoConstraintsって結局なんなんだっけ?

SwiftのコードベースでAutoLayoutを設定する時によくやるこれ。 view.translatesAutoresizingMaskIntoConstraints = false view.widthAnchor.constraint(equalToConstant: 18).isActive = true view.heightAnchor.constraint(equalToConstant: 18).isActive …

【Swift】配列の順番を保証しながら重複を除く

先日Zennを眺めていたら、面白そうな記事を見かけたので、備忘録的に残しておきます zenn.dev 結論 Swiftの配列で要素の重複を取り除く方法として、Setがありました。 Set(arrayLiteral: "a", "a", "b", "c") // ["b", "c", "a"] しかし、Setは基本的に配列…

【Firebase】Storageルールの管理を途中からする

既存のFirebaseプロジェクトのStorageルールを途中から追加したので、そのメモを‍♀️ Storageルールの追加 とりあえず、storage.rulesファイルをルートに作成します。 次にfirebase.jsonで、作成したStorageルールのファイルを指定します。 // ... "storage":…

【Xcode】PlaygroundでSwiftPackageを使ってみる

PlaygroundでSwiftPackage使えるようにしてみたので、手順を備忘録として残しておきます‍♀️ ちなみにXcode12以上が必要で、本記事はXcode12.4で作業を行っています。 やっていく まずは、File > New > Workspace...でワークスペースを作成します。 次に、ワ…

【Mac】nodenvのセットアップ

備忘録的に残しておく✍️ github.com nodenvをzshでセットアップ まずは、ソースを.nodenvにクローン。 $ git clone https://github.com/nodenv/nodenv.git ~/.nodenv nodenv installなども行えるようにnode-buildを~/.nodenv/node-buildにクローン。 $ git c…

Retrying fetcher due to error xxx の対処法

とあるiOSプロジェクトで、依存関係のgemをインストールしようとbundle installを実行すると下記のようなエラーが発生しました。 Fetching source index from xxxx Retrying fetcher due to error (2/4): Bundler::HTTPError Could not fetch specs from xxx…

【Xcode】必要なバイナリのみ生成するようにする

結論 XcodeのBuild Active Architecture Onlyを有効にすることで、開発時などに使う端末のアーキテクチャのバイナリのみを生成できるようになり、ビルド時間を削減することができるようになります。基本的には、デフォルトで有効になっています。(なぜかstag…

【Swift】文字列からSelectorを生成する

結論 NSSelectorFromStringを使うことで、下記のように文字列からSelectorを生成することができるようですね let selector = NSSelectorFromString("delete:") ちなみに今回は、UICollectionViewのcollectionView(_:canPerformAction:forItemAt:withSender:)…

【Swift】タップスルーなViewを作成する

このViewのタップイベントをスルーして、背面にあるViewをタップできるようにしたいという場面は、たまに遭遇するかと思います。今回はそんな場面で使えるSwiftの小ネタについて書こうかと思います‍♀️ 結論 hitTest(_:with:)で受け取ったイベントが自分自身…

【Swift】Error protocol からエラーコードを取得する

本日もSwiftの小ネタです‍♀️ 結論 SwiftのErrorプロトコルは、codeプロパティを持たないので、下記のようにNSErrorに変換することでcodeを取得するようにします。 extension Error { var code: Int { return (self as NSError).code } } てな感じで本日も以…

【iOS】APNs証明書の更新

久しぶりにAPNs証明書の更新を行ったので、本日はそのメモでも残しておきます‍♀️ ちなみに、今回のプロジェクトではPush通知を送るためにApple Push Notification Service SSL(証明書)を使用していますが、基本的にはApple Push Notification Authentication…

【Xcode】バンドルリソースコピー時に.gitディレクトリを除外する

結論 REMOVE_GIT_FROM_RESOURCESをtrueに設定することで、バンドルリソースのコピー時に.gitディレクトリが除外されるようになります‍♀️ REMOVE_GIT_FROM_RESOURCES=true てな感じで本日も以上になります その他の記事 yamato8010.hatenablog.com yamato8010…

【Swift】TableViewで空のCellを表示しない

本日は初学者向けの内容で、UITableViewで空のCellを表示させないための簡易的な処理を紹介したいと思います‍♀️ よくあるこれです。 結論 tableFooterViewプロパティに空のUIView()をセットすれことで、空のCellが表示されないようになります。 tableView.ta…