iOS関連のことを調べてみた2021年02月19日

iOS関連のことを調べてみた2021年02月19日

RxSwiftでインクリメンタルサーチ&ページネーションのサンプル

# はじめに
この記事は、いわゆる、よくありがちな「Wikipediaのインクリメンタルサーチを作ってみた」の記事ですが、RxSwiftでページネーションまで実装しているのは、あまりなく、実装してみかったので、自分のメモがてら、書いてみました。

作成したサンプルソースは、以下のリポジトリから取得できます。

**Githubのリポジトリ**
[yoko-yan/RxSwiftIncrementalSearch](https://github.com/yoko-yan/RxSwiftIncrementalSearch)

作成したサンプルは、機能として、以下の実装をしています。

– WikipediaのAPIを使って記事をインクリメンタルサーチ
– paginationで追加読み込み
– Pull-to-Refreshでリストを引っ張って更新

# サンプルソースコードに関して
**キャプチャ**

|  リスト画面 | 詳細画面 |
|:——————:|:——————:|
|![Simulator Screen

元記事を表示

MVCとMVVMの違いを理解する

アプリ開発をする上では、MVCやMVVMなどの設計モデルを理解しておく必要があります。
本記事は、Swiftの初学者がMVCとMVVMの理解を深めるためにアウトプットしていきます。

# そもそも、MVCとMVVMとは?
 MVCとMVVMもサービスを利用するユーザーに見えることありません。よく使われる言葉として、**設計モデル**とも呼ばれています。家で例えるなら、分解すると土台があって、外枠・柱があって屋根があります。これらは、それぞれ役割があって、使っている素材が違います。
 このように、それぞれの機能や役割を考えて分類しておくと,後で修繕する時に楽だし、リフォームするときも簡単だよねってことです。

では、それぞれの設計モデルを深掘りしていきましょう。

# MVCとは?

MVCとは、「Model」「View」「Controller」の頭文字をとったものです。

### 「Model」
システムの中で、ビジネスロジックを担当
人間で言えば、脳みたいなイメージで、ある処理にたいして計算を行ったり、処理を記憶させていつでも引き出せるような状態にすることができる。

### 「V

元記事を表示

[Swift] オプショナル値のソートに注意

## やりたいこと
`[2, nil, 3, 1]` をソートして `[1, 2, 3, nil]` にしたい。

## うまくいかない実装

以下のコードは一見するとうまくいきそうですが期待通りの結果になりません。

“`swift
let a: [Int?] = [2, nil, 3, 1]
let s = a.sorted { (l, r) -> Bool in
if let l = l, let r = r {
return l < r } return false } // -> [2, nil, 1, 3]
“`

これは、比較する2つの値のうちどちらかがnilの場合 (例えば `2` と `nil` )、順序を入れ替える前も後も `false` として判定される、つまり等価であると判定されてしまうため、正しくソートが行われません。

## 解決策

### 1. 左右どちらにnilが来たかで返り値を変える

“`swift
let a: [Int?] = [2, nil, 3, 1]
let s = a.sorted { (l

元記事を表示

Carthageで不要なフレームワークのビルドを除外してビルド時間を短縮する

### はじめに
[Carthage](https://github.com/Carthage/Carthage) はビルド時にXcodeプロジェクトに含まれる全ての共有スキームをビルドするようになっています。そのため、アプリから依存することのないフレームワークのスキームもビルドすることになり、無駄な時間がかかってしまいます。

例えば [RxSwift](https://github.com/ReactiveX/RxSwift) ですと、次の5つのフレームワークのビルドが走ることになりますが、アプリから使用しているのが RxSwift 単体の場合は、無駄に4つのフレームワークをビルドすることになってしまうのです。

– RxSwift
– RxBlocking
– RxRelay
– RxCocoa
– RxTest

この記事では、不要なフレームワークをビルドを除外する方法を紹介します。

### ビルドの前に任意の処理を実行する
Carthageで `bootstrap` もしくは `update` コマンドを実行すると、以下のような 1~3 の手順でビルド処理が進みますが、手順

元記事を表示

ipaファイルのProvisioning Profileの更新をしてみた(Xcodeなし)

#はじめに
テスト業界が長い人なら一度は体験したことがあると思う。

###テスト端末にipaのインストールが出来ねぇ…:cold_sweat:

そうです。
Provisioning Profileに新しく購入した端末の「UDID」が登録されておらず、
アプリのインストールが蹴られてしまう恐怖の「アレ」です(´・ω・`)
 ※Provisioning ProfileへのUDID登録漏れというのもありますね…

開発に再ビルド依頼してもスグに対応してくれないし、
どうにかならないものか…と考えている人のために!

自力で新しいProvisioning Profileをipaへ再署名してインストールできるようにする!
というのを「Xcode無し・再ビルド無し」で実行する手順を書いてみたいと思います。

#準備するもの
* Mac ※1
* ipa ※2
* 新しい端末(UDID)が含まれているProvisioning Profile ※3
* Provisioning Profileに紐づく証明書(p12) ※4

※1 mac

元記事を表示

【Swift】Mapアプリを作成する

今回は、↓こちらの講座で作ったMapアプリの復習です
[【iOS14対応】未経験者がiPhoneアプリ開発者になるための全て iOS Boot Camp](https://www.udemy.com/share/103I3AAEcTdVhUTHQH/)

# Mapアプリ
主な仕様は2つあります。
①マップ上で特定の位置をロングタップすると、その位置の住所が表示される
![b6328210d50df2973c0a3be55506ac2a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956215/fab27033-a72e-1704-af1c-b4bb716fd414.gif)
②緯度経度を入力すると、その位置のマップと住所が表示される
![d51a947e6cfb7fa95c944f26344583fa.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956215/75b6b944-80f8-ebfb-8cd4-c778

元記事を表示

Big SurかつXVim2導入済みXcodeでApple IDログインできない件

## Intro
Xcodeを使うvimmers必需品の[XVim2](https://github.com/XVimProject/XVim2)ですが、titleの課題が発生しています。

## How
解決方法はないかと、XVim2リポジトリのissuesを眺めていると、関連しそうなissueが見つかりました。

> On macOS Big Sur, after codesign Xcode and try to login to my account, got “Couldn’t communicate with a helper application” #340

https://github.com/XVimProject/XVim2/issues/340

上記issueを読んでいただければ分かる通り、絶賛議論中で、いまのところの解決策は、

> Posting here to try to confirm if others are experiencing the same problem on macOS Big Sur. If so, I guess there

元記事を表示

App ExtensionのBundle Versionを自動でアプリのBundle Versionに合わせる

## はじめに
iOSアプリのアップデートをリリースするときにバージョン番号を更新しますが、
App Extensionがある場合はそちらのバージョンも更新する必要があるかと思います。

App Extensionのバージョン更新は、忘れがちなので自動で更新するようにしてみます。

## やること
メインのターゲットのアプリバージョンを更新して、ビルドすると
App Extensionのバージョンと設定アプリに表示するバージョンが更新されるようスクリプトを追加します。

※ 設定アプリに情報を表示するのに、[Settings Bundle](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/UserDefaults/Preferences/Preferences.html)を使用しますが、
 本記事ではSettings Bundleの詳細は割愛します(>人<) ## Run Scriptを作成 今回のサンプルプロジェクトの構成は、以下のとおりです。 ![dir.png](https:

元記事を表示

Moyaから自己署名証明書を使っているHTTPSサーバーと通信する方法

以下の記事を参考にMoyaをどのようにカスタムするか

### MoyaのSessionDelegateを継承したクラスを作る
“`swift
class SelfSignedSSLSessionDelegate: SessionDelegate {
func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
let protectionSpace = challenge.protectionSpace
// 認証チャレンジタイプがサーバ認証かどうか確認
// 通信対象のホストは想定しているものかどうか確認
guard protectionSpace.authenticationMethod == NSURL

元記事を表示

【Swift】Cloud Firestoreのmap型で指定したプロパティのみを更新する

## はじめに
前回の投稿でもFirestoreの**map型**について書いたんですが、
今回はアプリからFirestoreの**map型**データの指定項目のみを更新する方法について、備考録として書きました。

■ 前回の投稿
[【Swift】Cloud Firestoreでmap型を取得するTips](https://qiita.com/lemonade_dot_log/items/f17472a0b40452800a6c)

## 動作環境
Xcode12.4 / iOS14.4

## Firestoreのデータ構造
Firestore内で定義したデータ構造は以下になります。
![FirestoreData.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580445/6e1ea81c-90b6-78dc-8d27-e1e13fd3cdb6.png)

## 今回の目的
map型の1つの単位は、`id`〜`price`までになりますが、今回は一番上のデータ(1)の`isOrderComplete

元記事を表示

【SwiftUI】Todoアプリを作ってSwiftUIを理解していく

## はじめに
今回初めてSwiftUIのアプリを作ってみました。
アウトプットとして記事をまとめていきます。

また、作成前に勉強として、[SwiftUI Tutorials](https://developer.apple.com/tutorials/swiftui/)をやってから作成しました。

こうしたほうがいいとか、あと単純に感想とかでもコメントもらえると嬉しいです。

## アプリ概要
諸々書く前にまずは作ったアプリを見てもらいましょう。
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469133/0b0696cb-4dfc-c186-e76e-2e6843c8dc3a.gif)

単純ですが、以下のような画面、機能の構成になります。

– ログイン画面
– Taskの一覧画面
– ステータスでソートする機能
– Task詳細画面
– Taskの更新機能
– Taskの新規登録機能

また、今回は誰かに使ってもらうというより

元記事を表示

Xcodeと英語を同時マスターする方法を見つけてしまった!

最近、iOS開発の勉強を始めてXcodeを触るようになったんですが表示の全てが英語!英語!英語!で、ナチュラルジャパニーズの私には何がなんだか・・・( ^ω^)

という状態だったため、これは効率が悪い!となり、どうすればいいか考えたところ

「単語帳にしちゃえばよくね?」

っておもったのでつくってやりました。これでXcode開発効率は爆上がり・・のはず。
↓こちらがその単語帳になります。

[XCodeメニューに関わる英語](https://ankilot.com/view/?id=CpBMmBcOAl)

共有設定を「公開」にしてますので私と同じような境遇の方はぜひ使ってみて下さい!

## 使い方

URLにアクセスすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/871774/5ff13128-38f1-eef5-07de-c05b8bdae189.png)

このようなメニューが出てきますので、好きな方法を選んでください。
出力することもできます。CSVやTxtファイル、

元記事を表示

[iOS14]IDFA取得許可ダイアログを表示する

##はじめに

iOS 14.5以降では、これまでの方法ではIDFA(広告ID)を取得できなくなります。
IDFAを取得できないと、AdMobなどで下記のようなことが起こります。

他社アプリと共通で参照できる端末固有のIDを使用できなくなる
 ↓
端末内の他社アプリの広告閲覧・クリック状況との紐付けができない
 ↓
表示する広告をユーザの興味に合わせてカスタマイズすることの精度が下がる
 ↓
ユーザの広告クリック率が下がって、アプリ提供者の収益が下がる

簡単に言うと
「IDFA取得できないと、AdMob広告とかのeCPMが下がって収益が下がるよ(たぶん)」
ということです。

iOS 14.5以降では、個別のアプリごとにIDFA許可を求めるダイアログを表示する必要があります。
このページではその方法を説明します。

##動作確認環境

Xcode: 12.4
iOS: 14.4

##準備

Info.plistに NSUserTrackingUsageDescription キーを追加します。
これをしておかないと、後述のダイアログ表示の時にアプリがクラッシュします。

`

元記事を表示

戻るボタンのタップ時のactionの制御

# 記事概要
「戻るボタンをタップした時に○○する」という戻る以外の処理を挟むという仕様を実現する際のアプローチの整理。

– やりがちNGパターン
– 一部対応パターン
– 一括対応パターン(UINavigationController単位)
– まとめ

# やりがちNGパターン
backBarButtonItemのactionは無視されるため動作しません。

“`.swift
navigationItem.backBarButtonItem = UIBarButtonItem(title: “戻る”, style: .plain, target: nil, action: #selector(doSomething))

@objc
func doSomething() {
// 戻るボタンの動作処理
}
“`

# 一部対応パターン
## navigationItemのleftBarButtonItemを利用する
この方法はかなりネット上に広がってる方法です。

“`一部対応.swift
navigationItem.leftBarButtonItem = UIB

元記事を表示

ディスク容量が足りなくなった時

Dockerを使って開発したりアプリ開発したりしているとギガがすぐに無くなるので自分用のメモ

## 調査&削除方法

### GUIから調査&削除

メニューバーの一番左のAppleのログを押して、
「このMacについて」>「ストレージ」>「管理…」と遷移して、
容量の大きいデータを調査し、適宜削除を実行する

### Terminalから調査&削除

ディレクトリの各階層に移動して1GB以上容量を食っているディレクトリを列挙

“`bash
du -sh ./* | grep -E ‘[0-9]+\.?[0-9]+G’
“`

だいたいいつも `~/Library` 以下に容量を食っているディレクトリがある(気がする)

### よくやるやつ

不要なDockerのデータを削除

“`bash
docker system prune
“`

実行すると、以下のように削除される対象が表示されるので、問題がなければ「y」を押して削除実行

“`
WARNING! This will remove:
– all stopped containers
– all ne

元記事を表示

Amazon SNSでiOSプッシュ証明書の更新

## SNSでは一年ごとに証明書の更新が必要
iOSでは認証keyが導入されたため、本来であれば毎年証明書を更新するという作業は発生しないのですが、AWSのSNSは認証keyに対応していないため、従来どおり証明書を更新してアップロードするという作業が必要となってきます(ここの認識間違っていたら教えてほしいです…)。
一年に一回なので忘れがちになるので以下手順をメモしておきます。

## キーチェーンから証明書ファイルの作成
keycahin Access.appを起動する。
上部メニューの
キーチェーンアクセス→証明書アシスタント→認証局に証明書を要求
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/6d006af0-7d4f-bcd8-818c-ab46361c9c93.png)
メールアドレスの入力
通称はそのまま
要求の処理を「ディスクに保存」「鍵ペア情報を指定」
あとは続けて、`.certSigningRequest`ファイルをダウンロード

## Apple Dev

元記事を表示

flutter_flavor + flutter_flavorizr を使って Flutter の Flavor を設定する

Flutter で環境ごとにビルド設定を切り替えるためには、Flavor を設定する必要があります。

[Creating flavors for Flutter – Flutter](https://flutter.dev/docs/deployment/flavors)

ですが調べてみると、Flavor を設定するためには各 OS ごとに手動でそれぞれ設定しなければならないため面倒です。

– [【Flutter】Flavor の設定~build まで(Android 編) – Qiita](https://qiita.com/hiromasa-fun/items/c79c99535f6f1db2a6a9)
– [Flutter で環境ごとにビルド設定を切り替える — iOS 編. モバイルアプリ開発において、環境ごとに設定を変えてビルド・配信することはほぼ必須… | by mono  | Flutter ?? | Medium](https://medium.com/flutter-jp/flavor-b952f2d05b5d)

もっと楽して Flavor を設定できないか

元記事を表示

iOSアプリ開発:コードだけでUI画面構成を行う方法〜入門〜

#この記事は
iOSアプリの開発で画面構成(UI部分)にはStoryBoardやswiftUIなどがあるようですが、これらはgitとの相性が悪いためコンフリクションを起こしやすく、チーム開発には向いていないらしいです。というわけでStoryBoardでもなくswiftUIでもない、「コードでUIをデザインする」という方法を学習してみます。具体的には「SnapKitなどのライブラリを用いて画面を作っていく」ことになります。

#手順
・CocoaPodsとSnapKitをインストールして、SnapKitをプロジェクトに導入する
・StoryBoardを消す
・Scene Delegateを消す
・AppDelegate.swiftの編集

#CocoaPodsとSnapKitをインストールして、SnapKitをプロジェクトに導入する
私が過去に書いたこちらの記事を参考に進めて下さい。
参考:[Xcode:CocoaPodsをインストールして、CocoaPodsからSnapKitをインストールする!](https://qiita.com/mi_iroha/items/e27fa875743

元記事を表示

Xcode:CocoaPodsをインストールして、CocoaPodsからSnapKitを導入する!

#この記事では
自分が調べていて意外とこの記事ないなぁと思い、いろんな参考サイトを渡り歩いてインストールできたので、これを機に一つの記事にまとめて誰かの何かの時に役に立てればと思います。

#環境
PC:Mac
ターミナル:zsh

#手順
・CocoaPodsをインストール
・SnapKitをインストール

#CocoaPodsをインストール
「そもそもCocoaPodsって何なのか?」
Xcodeで使えるライブラリの管理をよりカンタンにしてくれるツールです!なんか、Xcodeにライブラリを追加するのは結構複雑らしいですが、CocoaPodsならその部分をカンタンにしてくれるらしいです。実際、機械音痴かつめんどくさがりの私でもそんなに難しくはなかったです。

では、インストールしていきましょう。

まず、
[CocoaPodsの公式サイト](https://cocoapods.org)
へ行きます。

ほんでからターミナルを出して以下のコマンドをサイトからコピペします。
※ $のところは抜いてコピペしましょう。エラーの原因になります。
※ ターミナルは、Finderをクリックし、右上

元記事を表示

expo eject したコードをiOS用にビルド

少しハマったので共有しておきます。
ejectする前に、expo loginしておくのが重要でした。

“`
expo init testApp
expo login
expo eject –no-install
yarn install
npx pod-install
yarn ios
“`

https://github.com/expo/expo-cli/issues/2880

あと、XCodeでbuildしようとしてnodeが見つからないとエラーが出た場合は

“`
sudo ln -s $(which node) /usr/local/bin/node
“`

https://stackoverflow.com/questions/44492197/react-native-ios-build-cant-find-node/50419734#50419734

元記事を表示

OTHERカテゴリの最新記事