iOSエンジニアのつぶやき

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

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

【Swift】配列の全ての要素が条件に果てはまるかのチェックメモ

先日久しぶりに Zenn を眺めていたら、今まで使ったことのない便利な Array のメソッドの紹介記事を見つけたので、忘れないようにメモしておきます zenn.dev 例えば、配列の全ての要素がStringであるかどうかを調べる必要があった場合、今までは下記のように…

【SwifPM】Swift package product '' is linked as a static library by '' and ''. This will result in duplication of library code. をどう対処する?

先日に引き続き、Carthage を剥がして Swift Package Manager への移行作業をしている際に下記のようなエラーに遭遇しました。 具体的には、マルチモジュール化しているプロジェクトのメインターゲット以外にも、SwiftPM で導入したライブラリを Frameworks …

Carthageでインストールしたライブラリを削除しよう

とあるプロジェクトにて、Carthage でインストールしていたライブラリ達をそろそろ Swift Package Manager に移行しようということで、今回はそんな移行作業に必要な Carthage ライブラリの削除方法を紹介しようと思います‍♀️ Carthage もう使わないだったら…

iOSプロジェクトをとりあえずビルドできるようにするためのMakefileを作ってみた

とあるプロジェクトで Carthage のビルド済みバイナリをソース管理から除外したことで、今後の iOS プロジェクトのセットアップの手順が増えてしまったので、これを機に Makefile にプロジェクトのセットアップをまとめてしまおうという記事です‍♀️ 結論 と…

【Swift】Date から UNCalendarNotificationTrigger を生成するメモ

Local Notification を設定する際に、指定した日時でトリガーされるようにした時の UNCalendarNotificationTrigger の生成方法をメモしておきます 結論 結論としては下記のようになります。日時でトリガーする際に必要な UNCalendarNotificationTrigger は D…

Building for iOS Simulator, but the linked and embedded framework 'xxx.framework' was built for iOS + iOS Simulator 対処法

先日開発を行っているプロジェクトの Xcode バージョンを 12.0.1 から 12.4 に更新すると下記のようなエラーが発生していました 「シュミレーターのビルドでこけてるん?」と思い実機ビルドを試してみましたが、同じようなエラーが発生してビルドできません…

【Swift】csv からデータを取得するメモ

今回は csv からデータを取得する方法をメモ程度に残しておきます。 それではやっていく 下記のような、お酒の情報が並んだ liquors.csv ファイルからデータを取得していきたいと思います。 ビール1缶,5,350 ビール1缶,5,500 チューハイ1缶,5,350 チューハイ…

【Swift】SwinjectStoryboard を便利に使う

今回は短い内容になりますが、SwinjectStoryboard と通常の Storyboard で UIViewController を生成する方法を紹介したいと思います‍♀️ SwinjectStoryboard については下記を参照してください。ちなみに現時点でリリースされている最新版のソースをビルドす…

fatal: Unable to create '/.git/index.lock': File exists. 対処法

git

先日 Carthage/Build をソース管理から外そうと、gitignore を修正後 git rm -r --cached . してから git add . を実行すると下記のようなエラーに遭遇しました。 fatal: Unable to create '/.git/index.lock': File exists. Another git process seems to b…

【Firestore】特定のフィールドのみ書き込めるようにする

先日に引き続き今日も Firestore のセキュリティルール について書いていきたいと思います 今回はタイトルの通り、Firestore のドキュメントに書き込めるフィールドのバリデーションを行っていきたいと思います。 それではやっていく ということで、「こんな…

【Firestore】セキュリティールールでデータの undefined 判定

先日 Firestore のセキュリティールールで undefined かどうかの判定をするために下記のようなコードを書いていました function isUndefined(data) { return data.hoge == undefined; } 実はこれ正しく動作しないので注意が必要です。サンプル実装などによく…

Apple から送信されたクラッシュログを解析するメモ

本日はタイトルの通りクラッシュログを解析する方法を自分用にメモしておきます(他にもっといいい方法あれば教えてください!!)。 それではやっていく みなさんご存知の通りアプリのクラッシュログは通常だと、16進数でレポートされるため一見しただけだと、…

【Swift】Date で「〇〇日前」的なやつを表示する

今回は Swift の Date で、現在から特定の Date までがどの程度離れているかを示す Text の表示方法を簡単に紹介したいと思います 結論 今回は下記のように Date に Extension メソッドを追加し、1週間以上前の Date に関しては日付を取得できるようにしてみ…

Swift5.4 つまみ食い【SR-10069編】

ということで今回も Swift5.4 をちょろっと見てみます SR-10069 requested the ability to overload functions in local contexts, which in practice means nested functions can now be overloaded so that Swift chooses which one to run based on the t…

【Kotlin】Kotlin でちょろっと正規表現を行う

今回はタイトルの通り、Kotlin でちょろっと正規表現を行ったのでそのメモです。 結論 Kotlin ではこんな感じで行える見たいですね。正規表現を """ で囲むことで、エスケープが必要にならないのでシンプルに記述することができます。 val pattern = """"^[A…

【Algolia】特定の属性のみを検索対象とした検索

今回は Algolia で、特定の属性のみをクエリの対象とした検索機能の実装を行ったので、その方法を簡単に紹介したいと思います‍♂️ それではやっていく ということで、Query の .restrictSearchableAttributes として属性を設定することで、特定の属性を対象と…

Swift5.4 つまみ食い【SE-0284編】

Xcode12.5 beta がリリースされ、これから Swift5.4 を使う機会もあると思うので少しづつ進化した部分を見ていきたいと思います 今回はこちらから。 This proposal seeks to remove the first restriction while leaving the second in place, allowing a fu…

【Swift】TableView のセクションごとに Separator を出しわけよう

今回は UITableView で、セクションごとに Separator を出し分ける方法を紹介したいと思います‍♀️ 結論 Separator を表示したくない Cell の場合、下記のように UITableViewCell の separatorInset プロパティの値をうまく調整することで非表示にすることが…

【Swift】iOS プッシュ通知の許可周り

久しぶりに通知の許可周りの実装をしたので、今回は初学者向けに通知の許可設定の実装方法を紹介していきたいと思います‍♀️ ユーザがアプリの許可をしているかどうか UNUserNotificationCenter.current().getNotificationSettings { settings in switch sett…

【Node.js】Functions でユーザが通知を有効にしている場合にプッシュ通知を送信するやつをやってみた

今回は Firebase Firestore であるドキュメントが作成された時、ユーザの通知設定に応じて通知も送信をハンドリングする実装を行ったので、簡単に記事にまとめてみようと思います‍♀️ それではやっていく 今回は、一般的にありえそうな下記のようなユースケー…

【RxSwift】TextField で .editingChanged の時だけ文字列を取得したい

RxSwift で TextField.text の変更をリッスンしたい時、下記のように書こうとした経験がある人は結構多いかと思います textField.rx.text .subscribe(onNext: { text in print(text) }) .disposed(by: disposeBag) あまり RxSwift に馴染みのない場合、これ…

【FCM】Functions 経由でトピック通知を登録する

今回は Firebase Cloud Messaging のトピック通知を Functions 経由で登録する方法を紹介していきたいと思います‍ それではやっていく Node.js で実装していくので、とりあえず Firebase の Admin SDK を導入し、初期化します。 $ npm install firebase-admi…

【Android】ReactiveX の恩恵を受けたスレッド管理を学ぶ

RxKotlin で実行する Observable のスレッドをどのように切り替えるのか調査したので、調べた内容を簡単にまとめておこうかと思います それではやっていく まずは、Android プラットフォーム上のメインスレッドで処理を実行できるようにしてみます。Android …

【Android】Fragment のライフサイクルを理解する

RxKotlin を使用するにあたり、それぞれのクラスでライフサイクルを理解していないと、そろそろ Android 初心者という言い訳が通用しなくなりそうなので、Fragment や Activity (今回は Fragment のみ) のライフサイクルを再度しっかりと認識して良い Rx ラ…

【Android】Static interface methods are only supported starting with Android N (--min-api 24): の対処法

前回に引き続き、RxKotlin 導入中に下記のエラーが Static interface methods are only supported starting with Android N (--min-api 24): io.reactivex.rxjava3.disposables.Disposable io.reactivex.rxjava3.disposables.Disposable.disposed() Stack tr…

【Android】Cannot fit requested classes in a single dex file (# methods: 〇〇 > 65536) 対処法

絶賛個人開発中のアプリで RxKotlin をインストールし、ビルドすると下記のようなエラーが発生しました Cannot fit requested classes in a single dex file (# methods: 74679 > 65536) 調べてみると割とgeneralな問題らしく、「64K 参照制限」なんて呼ばれ…

【Swift】UITextField の text プロパティはなぜオプショナルなのか?

さっそくですがみなさん、下記のコードの出力はどうなると思いますか? let textField = UITextField() textField.text = nil print(textField.text) 結果は Optional("") になります。何故 nil にならないのか不思議ですよね 理由としては、Objective-C で…

【Swift】PresentingViewController と PresentedViewController の違い

時々使う UIViewController のプロパティ presentingViewController と presentedViewController において、どっちがどの ViewController を指しているのか分からなくなってしまうことがあるのでメモしておきます 結論 それぞれの対応関係は下記のようになり…