iOSエンジニアのつぶやき

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

2020-08-01から1ヶ月間の記事一覧

はじめての 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…

知識ゼロからの Kotlin Android アプリリリースへの軌跡 / Day3【Codelabs 1-2編】

前回のコードラボに続き、今回のコードラボでは、Android アプリの主要なコンポーネントの詳細を学び、ボタンを追加してアプリに簡単なインタラクティブ機能を追加していきます。 yamato8010.hatenablog.com 学ぶこと アプリのレイアウトファイルを編集する…

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…

知識ゼロからの Kotlin Android アプリリリースへの軌跡 / Day2【Codelabs 1-1編】

今後の学習の方針として、Google が提供している Android アプリ作成のチュートリアルである Codelabs を使用して勉強していきたいと思います。このサイトは基本的には英語でのチュートリアルとなっているので、日本語に直したもの + 自分なりのコメント、ま…

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…

あなたのアプリ 2020年12月からアップーデートできなくなります

なぜ? AppStoreConnect にバイナリをアップロードすると Apple からこんなメールが届きました。 Dear Developer, We identified one or more issues with a recent delivery for your app, "XXXXX" X.X.X (XXXX). Your delivery was successful, but you ma…

あなたのアプリ iOS13 で UILabel のスタイルが間違えて表示されている可能性があります

起きたこと UILabel の attributedText を nil (リセット) にしてもラベルのスタイルが変わらないという現象が発生していました。 TL;DR 原因 UILabel の attributedText の値が nil(リセット)になった場合、通常(iOS12以前)は Label の attributes もリセッ…

知識ゼロからの Kotlin Android アプリリリースへの軌跡 / Day1【とりあえずコード書いてみる編】

この記事でできるもの Kotlin を Mac でとりあえず動かすための環境構築ができる Kotlin を使ってコンソールに文字を出力できる Kotlin を使った基本的な構文がちょっとわかる 手順 JDK(Java Development Kit)のインストール Kotlin のプログラムを実行する…

FirebaseCloudFunctions + FirebaseCloudMessaging でプッシュ通知を送ってみる

この記事でできるようになるもの $ curl -X POST https://your-functions-url/push?device_token=your-device-token -d "message=I love fishing" のようなリクエストをターミナルで叩けば下記のようなプッシュ通知を送信できるようになります。 事前準備 Fi…