iOSエンジニアのつぶやき

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

iOSアプリ開発

RxSwift における subscribeOn と observeOn の違い

RxSwift などで処理をつなげて書いていると、ここはメインスレッドで、ここはバックグランドスレッドでなどと、処理によってスレッドを切り替えたい場合があるかと思います。そんな時は、Observable のプロパティとして提供されている subscribeOn または、o…

Grand Central Dispatch (GCD) の理解を深める

GCD とは? macOS、iOS、watchOS、tvOS のマルチコアハードウェアでの並列実行タスクをするために提供されている言語機能で、開発者は DispatchQueue を使用してスレッドでの処理を管理することができます。また、GCD の Queue は追加されたタスクの順番ごと…

Xib で View を生成する時に知っておくといいこと

先日、うっかり ViewClass で指定した Xib で作成したカスタムビューのプロパティにアクセスし下記のように Error を出してしまいました。初心者の頃はよく分からずググったものコピペ なりで回避していましたが、そもそも何故これが Error になるのかを今回…

RxSwift で非同期処理を合成しよう

今回は同じ型の非同期処理を RxSwift でまとめる際に使用する concat と merge の使い方と挙動を簡単にまとめとこうと思います。 concat concat() は複数の非同期処理を渡された順番で順次処理を行っていきます。サンプルは次のようになります。 let ob1 = O…

Error: Command PhaseScriptExecution failed with a nonzero exit code の対処方法

Carthage でライブラリをインストールしたり、アップデートしたりした後に、Branch をチャックアウトするとためにこのような Error が発生することがあります。このような場合は、Finder の情報を持つ拡張属性をし、Clean しビルドし直すと正常にビルドが成…

Swift で map, compactMap, flatMap を使いこなそう

今回は初学者向けに、Swift からプログラミング言語を学び始めた人が必ずいだく map・compactMap・flatMap の違いについて簡単に解説をしていきたいと思います。また、これらの関数は積極的に使っていくことで状況に応じた使い分けなどがうまくできるように…

はじめての ReactorKit【実践編】

前回の概要編に続き、今回は実際に ReactorKit を使ったサンプル実装をしていきたいと思います。 yamato8010.hatenablog.com 作るアプリ 今回は Google Books API を使用したアプリを想定して実装していきたいと思います。仕様は下記の通りです。 ※ 基本的に…

RxCocoa でクラスの特定のメソッドをフックする

以前書いた ReactorKit の概要編のサンプル実装をしている際に、「ViewWillAppear で処理を行いたんだけど、rx で呼び出せないかな〜」と思っていたら、RxCocoa にはクラスの特定の関数をフックするプロパティが用意されていたのを最近知ったのでちょこっと…

ちょこっと StackView のパフォーマンスを気にしてあげる

今回は StackView で限定された数のリストを繰り返し更新して表示する際に、ちょこっとパフォーマンスが良くなる方法を紹介したいと思います。 UITableViewCell に StackView を持っている時の実装を行っていきます。 @IBOutlet private weak var stackView:…

UICollectionView の automaticSize に気をつけよう

UICollectionView を使用して、Cell の幅などを動的にしたい時って結構ありますよね。そんな時は、下記のように estimatedItemSize に UICollectionViewFlowLayout.automaticSize を使用する場合が多いかと思います。 flowLayout.estimatedItemSize = UIColl…

CocoaPods Warning: ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES の対処法

pod install でいつものごとくライブラリをインストールすると下記のような警告がでました。 [!] The `Hoge [Debug]` target overrides the `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` build setting defined in `Pods/Target Support Files/Pods-Hoge/Pods-H…

はじめての ReactorKit【概要編】

iOS で Flux アーキテクチャの恩恵を受け、リアクティブかつ一方向のデータフローをサポートするための Framework で、これによって シンプルで処理を追いやすくかつ、Testableなアプリ設計を構築することができるようになります。 ReactorKit の恩恵 Testab…

Swift で日本語を含む URL を扱う

日本語を含む文字列を URL に変換する時に値が nil になることがあると思います。これは、URI において使用できない文字列を URL として変換しようとしている時に発生します。Google などの検索バーでは、このような使用できない文字列を自動でパーセントエ…

DifferenceKit で reload した時に Cell がうまく反映されない

DifferenceKit という UITableView 及び UICollectionView の差分更新ライブラリを使用していた時に、CollectionView の追加 Section も含めた changeSet を reload した時に主に iOS11系で(iPhone8で確認)うまく Cell が表示されないという問題に遭遇してい…

はじめての App Clip【実装編-Part1】

前回の概要編に続き今回は既存のプロジェクトに App Clip を作っていきます。また、サーバの対応や App Store Connect での設定などはまた別の記事で書こうかと思います。 yamato8010.hatenablog.com 作業開始 ‍ AppClip の開発には Xcode12 以上が必要なの…

はじめての App Clip 【概要編】

App Clip とは? App Clip は iOS14 から利用できる機能で、特定のアプリケーションの一部の機能をミニアプリとしてダウンロード・利用できる仕組みです。これによりユーザはアプリの一部の体験を数秒で使えるようになり、必要ならアプリ全体をダウンロード…

Cloud Firestore のセキュリティルールでよくやる書き方

今回は、Cloud Firestore のセキュリティルールでよく書く記法などをまとめていきたいと思います。(他にもでてきたら随時更新していく) 認証系 認証しているユーザのみ読み取りが可能になります。 service cloud.firestore { match /databases/{database}/do…

Firebase Error: Could not start Firestore Emulator, port taken. の対処法

firebase emulators:start --only firestore コマンドで Firestore エミュレータを起動しようとしたら下記のような Error が $ firebase emulators:start --only firestore i emulators: Starting emulators: firestore i emulators: Shutting down emulator…

Extension でのインスタンスの取り扱いに注意する

今回は以前書いた下記の記事で、アプリのパフォーマンスをさらにあげるための方法を簡単に紹介したいと思います。 yamato8010.hatenablog.com 改善方法 整数に3文字区切りのカンマをつけた文字列を返すプロパティを以前は下記のような形で書きました。 exten…

FirebaseCloudMessaging(FCM) で全ユーザに対してプッシュ通知を送信してみる

今回は FirebaseCloudMessaging の Topic メッセージという機能を使用して CloudFunctions 経由で全てのユーザに対して Push 通知を送信する実装をしていきたいと思います。導入に関しては過去の記事でも書いてるので見てみてください yamato8010.hatenablog…

日本人のための SwiftFormat【導入編】

以前の概要編・ルール編 に続き今回は導入編をやっていきたいと思います。ただ、導入方法は、以前の記事で CocoaPods で導入しますと書いていましたが、Swift Package Manager(以降: SwiftPM) で導入していこうかと思います‍ 以前の記事 yamato8010.hatenabl…

Cloud Firestore でセキュリティールールを作ってテストするまで

セキュリティルールとは? Cloud Firestore のドキュメント DB に関してかけられる制約のことです。これによってサーバ側の認証・承認などのコードを作成する必要がなくなります。また、認証という役割だけではなく DB に対するデータの制約なんかもこのセキ…

Swift Package Manager とは

概要 Swift Package Manager(以降: SwiftPM) は、Swift コードの配布を管理するためのツールです。また、Swift のビルドシステムと統合されていることにより、依存関係のダウンロード・コンパイルなどが最適化されバイナリ、リソースがプロジェクトで使いや…

UIFeedbackGenerator を使おう

概要 UIFeedbackGenerator は UI にフィードバックを追加するための、フィードバックジェネレーターの抽象クラスで、フィードバックの種類別に下記の3つの具象クラスが存在し、それぞれ iOS10 以降で使用することが可能です。 UIImpactFeedbackGenerator UI…

Swift で CollectionView の最後に謎の余白がつく

Swift で横スクロールの CollectionView の作成している時に最後のアイテム後ろに謎の余白があく現象に悩まされていました。 どうやらこの現象は CollectionView のスタイルが .horizontal + FlowLayout の minimumLineSpacing プロパティがデフォルト値(10p…

Swift で数値を3文字区切りの文字列に変換する【コピペ 用】

Swift で数値をカンマで区切って表現したい時などには下記の Extension Property が使用できます。 extension Int { var withCommaString: String { let formatter = NumberFormatter() formatter.numberStyle = .decimal formatter.groupingSeparator = ","…

Cloud Functions を Node.js 10 移行する

久しぶりに Cloud Functions のコンソール画面を開いたら下記のような警告が来ていました。どうやら Node.js 8 が非推奨になり2021年の3月中旬には全面的にサポートされなくなるとのことなので、Node.js 10 へ移行します。 Cloud Functions を新しい Node.js…

Fastlane での Rebuild from Bitcode オプションの付け方

Bitcode とは? iOS9から導入された技術で LLVM の中間言語のことを指します。以前まではコンパイルが完了しているものを Apple に提出していましたが、Bitcode を用いることで Apple 側で最適化してコンパイルを行えるようになります。 Bitcode を用いたく…

Carthage Error: Falling back to building from the source の対処法

Cartahge Update Error UIWebView の除去作業をする過程で久しぶりに RxSwift のバイナリをアップデートする必要があったので、 いつもの通り carthage update --use-ssh RxSwift --platform ios のような形でアップデートすると こんな Error が出ました。 …

Cloud Firestore 概要

Cloud Firestore とは? 高速でサーバレスなクラウド NoSQL ドキュメントデータベースです。Firebase Realtime Database と同様にスキーマレスかつリアルタイムにデータを監視することができます。 公式ドキュメント https://cloud.google.com/firestore/doc…