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

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

古いバージョンのXcodeと最新バージョンのiOSの組合せで動作確認する方法

# 解決したい課題

古いバージョンのXcodeでは、最新バージョンのiOS環境でのデバッグは基本的にできません。

例えば、本記事の執筆時点では Xcode 12.4 / iOS 14.4 が最新ですが、アプリを Xcode 12.1 で開発しているとします。
この場合、以下の制約があり、基本的には Xcode 12.1 で iOS 14.4 での動作確認は不可です。

– Xcode 12.1 では基本的に iOS 14.1 までのシミュレータしか入れることができません。
– Xcode 12.1 では基本的に iOS 14.1 までの実機としか繋げることができません。

これを可能にする方法が本記事の内容です。
ただし、公式に認められている方法ではないので(たぶん)、使用する際は自己責任でお願いします。

# シミュレータの場合

## 事前準備

**1.Xcode最新バージョンを普通にApp Storeからインストール。**

**2.Xcode旧バージョンは以下のリンクからダウンロードしてインストール。**
https://developer.apple.com/downl

元記事を表示

【Swift】Cloud Firestoreでmap型を取得するTips

## 修正(02/14)
2つ目の方法は、`FirebaseFirestoreSwift`を使わないとできないというのは自分の勘違いでした。すみません。
現在は、修正しております。

## はじめに
最近、Firestoreを使ったデモアプリを作って遊んでおります。
Firestoreでサポートされているデータ型は色々あるのですが、今回はその中でも**map型**のデータを取得する方法について書きました。
Firestoreでサポートされるデータ型についてはこちらの公式リファレンスをご覧ください。
https://firebase.google.com/docs/firestore/manage-data/data-types

今回は、2つの方法をを載せておきます。

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

## 今回取得するFirestoreのデータ&Swift側のオブジェクト
Firestoreのmap型を取得するということで、Firestore側のデータ構造があったほうがわかりやすいと思いましたので、載せておきます。

■ Firestoreのmap型デー

元記事を表示

Moyaを使って通信部分をテスタブルに

## はじめに

現場で既存のプロジェクトのUnitテストを行うようにしようとなり、まずはAPI通信部分のテストコードを書きました。
大規模なプロジェクトではないですが、その導入までの流れを記述していきます。

## 前提情報

– iOSアプリの開発で言語はSwiftを使用。
– プロジェクトのアーキテクチャは MVC + CleanArchitecture。
– 画面関係なくアプリ全体で使われるAPI通信部分をUsecaseにまとめています。
– そこから画面固有のロジッククラスであるViewModelで呼び出し、利用しています。
– 通信には[Moya](https://github.com/Moya/Moya)を使います。
– テストはXCTTestを使用します。

今回はこのUsecase部分のテストコードを書いていきます。

**※注意**
**現状結果を書いていますが、まだまだ未熟ですのでより良い実装方法や気になる点あればコメントいただけるとありがたいです?‍♂️**

## Moya

Moyaについてはいくつも記事が出ています。
自分は[こちら](https://qi

元記事を表示

Enumを用いたUITableView+RxDataSourcesの実装サンプル

# 環境
– Xcode 12.4
– Swift 5.3.2
– RxSwift 6.0.0
– RxCocoa 6.0.0
– RxDataSources 5.0.0

# 前置き
`RxSwift`と`RxCocoa`に触れたことがあり、
`RxDataSources`をこれから利用するかもしれない方に向けて書いています。

自分にとってRxSwift/RxCocoa同様、学習コストが高く苦労した覚えがあったので、
サンプルが一つでも多くあるといいなと思い、今回記事にしました。

RxSwiftとRxCocoaの記述についてはあまり触れないのでご了承ください:pray:

# 実装内容
`SectionModelType`の`typealias Item`にはEnum(Associated value)を利用しています。
表示するデータはViewModelから適当に流すようにしています。
リロードする度に新しいセクション情報を構成して表示する仕様になっています。

| iPhone8(iOS14.4) |
|—|
|Swiftのオプショナル型について

# オプショナル型とは
オプショナル型とはデータ型の一つで、変数の宣言時に使用します。
特徴としては変数に`nil`の代入を許可することで、逆に非オプショナル型は`nil`の代入を許可しないことになります。

`nil`とはデータが無い(変数が空の状態)を表します。

iOSでは`nil`に対して操作するとアプリケーションが落ちてしまうことがあり、そのような問題を解決するために`swift`では`nil`を基本的には許容しないとのことです。しかし、オプショナル型を使うことで`nil`を扱うことができるようになります。

# オプショナル型の使い方
“`Swift
// オプショナル型
var age: Int?
var name: String!

// 非オプショナル型
var age: Int
var name: String
“`
オプショナル型は最後に`?`か`!`をつけます。非オプショナル型は最後に何もつけません。
また、一般的にオプショナル型 ( Optional Value ) というと`?`、`!`は暗黙的アンラップ型 ( Implicitly Unwra

元記事を表示

CollectionViewで指定のカラム数のレイアウトを簡単に作成するためのクラス拡張

## 説明
UICollectionViewで毎回画面サイズや余白の計算をしてレイアウトを組むのが面倒なのでExtension化してみました。
カラム数、セル間と外側の余白、セルの縦横比を指定したレイアウトが一行で組めます。

## コード

“`swift

import UIKit

extension UICollectionView {

/// 指定のカラム数のレイアウトを作成する
/// – Parameters:
/// – column: カラム数
/// – interMargin: セル間の余白。初期値0。
/// – outerMargin: セル全体に付与する上下左右の余白。初期値0。
/// – aspectRatio: 横を1としたときの縦の比率。初期値1。
func makeColumnLayout(column: Int, interMargin: CGFloat = 0,
outerMargin: CGFloat = 0, as

元記事を表示

iOSにおけるマルチスレッドを実装して確認してみる

iOSにおけるマルチスレッドの概念について、
理解を深めるために実際に動きで確認できるよう実装してみました。

#### マルチスレッドについて

– マルチスレッドとは並行処理のことである
– スレッドには、メインスレッドとバックグラウンドスレッドの二種類がある
– メインスレッドはUI更新時に、バックグラウンドスレッドは通信などUI以外の処理に使用される

iOSでは、主に***GCD(Grand Central Dispatch)***を用いて、タスクをクロージャで渡す。

##### なぜマルチスレッドが必要か?
– 通信処理時には待ち時間が発生する
– この処理をメインスレッドで行うと、画面描画やユーザーからのアクションにも待ちが生じる
– iPhone自体の処理能力は非常に高いので、CPUを有効活用する必要がある

##### GCD を用いた並行処理
– メインスレッド

“`swift

DispatchQueue.main.async {
// UI更新処理
}
“`
– バックグランド

“`swift
DispatchQueue.global.async

元記事を表示

[Swift]剰余演算子を使って配列を操作してみた

## はじめに
今回やりたいことは、`剰余演算子を使って配列を操作したい!`です。

## 環境
・ Swift:5.3.2

## 基礎のおさらい
・配列は格納された要素を`配列[数字]`で取り出すことができます。

“`Array.swift
let array = [“a”, “b”, “c”]
array[0] // “a”
array[1] // “b”
array[2] // “c”
“`

・剰余演算子は除算演算子とは違い、余りを求める演算子です。

“`Modulo.swift
0 % 4 // 0
1 % 4 // 1
2 % 4 // 2
3 % 4 // 3
4 % 4 // 0
“`
ここでお気づきの方もいるかもしれませんが、
実際に配列操作を剰余演算子で表現してみましょう!

## 実践

“`Playground.swift
let array = [“a”,”b”,”c”,”d”]
let indexPathRow = 1
let indexArray = array[indexPathRow % array.count]
/*
ここでは[1

元記事を表示

ユニバーサルリンク チェックポイント

### サーバ側

– `apple-app-site-association`ファイル
– ファイルの書き方が正しいか
– ファイルに`.json`など拡張子は何もつけない。
– `apps: []`というキー・バリューについて、iOS13以降であれば消していい。iOS12以前もサポートするのであれば、残す必要がある。
– `appID`キーについて、iOS13以降は`appIDs`キーに変えることもできる。iOS12以前をサポートするならそのままにする。
– `paths`キーについて、iOS13以降は`components`キーに変えることもできる。iOS12以前をサポートするならそのままにする。

[Supporting Universal Links in Your App](https://developer.apple.com/documentation/xcode/allowing_apps_and_websites_to_link_to_your_content/supporting_universal_li

元記事を表示

クロージャを用いたAPI通信後の処理

[iOSアプリ開発デザインパターン入門](https://www.amazon.co.jp/iOS%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E6%8A%80%E8%A1%93%E6%9B%B8%E5%85%B8%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%88NextPublishing%EF%BC%89-%E5%8D%83%E8%91%89-%E5%A4%A7%E5%BF%97-ebook/dp/B07DKT9YZX)という書籍の中で、クロージャを用いたエラー処理についての記述がありました。

再利用性が高そうだったので、忘備録としてまとめてみます。

#### クロージャを用いたエラー処理
クロージャは、ある処理の完了後に何かをしたい時に使われます。

例として、API通信後に成功だった時、もしくは失敗だった時に何

元記事を表示

画面遷移に関係あるコードの記述を別ファイルに分けて実装する

#はじめに
今までの私は、`Main.storyboard`でViewController同士を画面遷移させてました。

ですが、今時は`1つのStoryboardに1つのViewController`が基本で
`Storyboard Reference`を使用して画面遷移します。

というか、そもそも`Storyboardを使用せずにコードで画面遷移`といった流れになってきています。

なので今回はStoryboardを使わず、コードのみで画面遷移を実装しようといった感じです。

じゃあ早速、実装していこう!といってViewControllerに画面遷移のコードを
直接書くとまた新たな問題が浮上してしまいます↓
[節子、それViewControllerやない…、FatViewControllerや…。](https://niwatako.hatenablog.jp/entry/2017/09/15/192705)

では、一体どうすればいいのかというとタイトルにも書いてあるように
`画面遷移に関係あるコードの記述を別ファイルに分けて実装`していきます。

#実装する前に
今回

元記事を表示

元動物飼育員(完全未経験者)がiOSアプリをリリースした話

# 概要
元動物飼育員(完全未経験者)がSwiftでiOSアプリをAppleストアに公開することができたので、
リリースまでの道のりをご紹介していきます。

# アプリ紹介
まずは、アプリをご紹介します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/770482/0addadc9-1b72-8b50-f5a7-73872185020a.png)

元動物飼育員の知見を活かして、好きな動物やイベントのカードをスワイプして、
その結果に基づいた動物園にマッチングするというアプリです。
https://apps.apple.com/jp/app/zoogo/id1552154924

是非、興味がある方は使ってみてください?‍♂️

# スキル
私は、Swiftでのアプリ開発はもちろん、コードなんて無縁の世界で生きてきました。
スキルがあるとすれば、**チンパンジーの健康管理**ができることくらいでしょうか…

# アプリ開発の目的
私は、iosエンジニアへの転職を目指しています。
転職成功

元記事を表示

iOS IDFA対応アプリ申請時に必要なApp Privacy

iOS 14.5以降からIDFA(Identifier for Advertising)取得許可ダイアログを表示してユーザーから許可をもらわない限り正しいIDFAが取得できなくなりました。

この機能の実装が完了し、アプリをレビュー用に提出するボタンを押した際に次の警告が出ました。

![Screen Shot 2021-02-12 at 16.30.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8920/59a7bdbb-e6b6-9b46-f80f-1c69950b1f83.png)

> Your app contains NSUserTrackingUsageDescription, indicating that you will request permission to track users. To update this information on your app’s product page, you must indicate which data types are

元記事を表示

iOSでGoogle Mobile Ads SDKを8にするとMediation Test Suiteのビルドが通らなくなるのでダメだ

タイトルの通りで、Google Mobile Ads SDKのバージョンを8.0.0にするとMediation Test Suiteのビルドができなくなる。バージョンを下げるしか回避策はない。ダメだ。

元記事を表示

更新の自動確認機能付きiOSショートカットをgithub-pagesを使って作る

# はじめに
_Qiitaへの投稿は初めてであるため、拙い記事ではありますがご了承ください。
また、投稿者は素人の学生であるため知識が浅く、この記事のコードには改善できる点や不正確な点があるかもしれません。_

iOSのショートカット機能は痒いところに手が届きません。
公にソフトを提供する場合、そのソフトに欠陥が見られたときにアップデートを提供するのは当然のことです。
しかし、iOSのショートカットは更新を加えて共有するたびにURLが変わってしまいます。ましてや、ショートカットの自動アップデートなんて機能は一切ありません。
ショートカット自体そこまで普及してもいないので情報も乏しく、自動アップデートの方法も一切インターネット上に載っていません。

ショートカットを公に提供するという方はあまり居ないとは思いますが、iOSアプリを公開するよりも遥かに楽に、コストもかからず、誰でも公開できるというのはiOSにおいてショートカットの持つ大きな利点です。

今回は、そんな一般向けに配布するショートカットを、より実用的にするプログラムを紹介します

元記事を表示

[Flutter] flutter hooks で簡単にPageViewのアニメーションを作成する [Instagram UI トレース]

#はじめに
初投稿となります。お手柔らかにお願いします。

今回は、タイトルの通り、インスタでストーリーを移動するときの、四角い箱を回すようなUIをFlutterで作成していきたいと思います。
この記事が皆さんのお役に立てると嬉しいです。

#パッケージ
今回の自分が使用したパッケージは以下の通りです。

“`yaml:pubspec.yaml

dependencies:
flutter_hooks: ^0.15.0
hooks_riverpod: ^0.12.1
flutter:
sdk: flutter
“`

状態管理用に[riverpod](https://pub.dev/packages/riverpod)を入れています。(今回は使いません)
また、コードを簡単に書くために[flutter_hooks](https://pub.dev/packages/flutter_hooks)も入れています。

ただ、hooksを使ったことがない人でも、ドキュメントを読めばStatefulWidgetに置き換えることができると思います。

# 完成図

今回の

元記事を表示

【バグ】iOS 14.2以降のiPadでUITextFieldをフォーカスするとLayoutConstraintsの警告が出る

# 概要

iOS14.2以降のiPadでUITextFieldをフォーカスすると、以下の警告がログ出力されます。iOS 14.1以前のiPadでは発生しないのでおそらくOSのバグでしょう。

“`
2021-02-11 16:22:34.675060+0900 UITextField Test[4986:357247] [LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don’t want.
Try this:
(1) look at each constraint and try to figure out which you don’t expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(Note: If

元記事を表示

XCFrameworksに対応したCarthageを使ってみた

[Carthage 0.37.0](https://github.com/Carthage/Carthage/releases/tag/0.37.0)がリリースされ、XCFrameworksに対応しました?
これによりXcode12になってからCarthageで発生していた問題が解消されることになります。ワークアラウンドスクリプトが不要になり、さらにはM1 MacでCarthageが使えるようになります。
なぜCarthageがXCFrameworksを必要としていたかの背景や、XCFrameworksを生成する手順について解説したいと思います。

CarthageでXCFrameworksを生成する手順だけ知りたい方は、 [CarthageでXCFrameworksをビルドする](#carthageでxcframeworksをビルドする) へどうぞ。

## XCFrameworksって何?

まずXCFrameworksについて説明します。
XCFrameworks自体はXcode11から使用可能になっている技術です。
実際にCarthage0.37.0でビルドしたXCFramew

元記事を表示

[Swift] 重ね合わせの色を生成する(アルファブレンドする)

Swiftで、**アルファ付きの色同士を重ねたときの色を取得する(アルファブレンドする)**処理の実装方法。

## 実装

“`swift:UIColor+overlayColor.swift
extension UIColor {
/// 色を重ね合わせたときの色を生成する
/// 参考 https://ja.wikipedia.org/wiki/アルファブレンド
func overlayColor(_ otherColor: UIColor) -> UIColor {
/// 背景
var (dstR, dstG, dstB, dstA) = (CGFloat(0), CGFloat(0), CGFloat(0), CGFloat(0))
///

元記事を表示

【Flutter】iOS/Android/WebでFirebase Firestoreを使えるようにする。

# はじめに
昨年後半よりFlutter入門して社内用アプリを作っています。
今回はFirebaseのFirestoreを使えるようにします。

# 更新履歴
2021.2.11 初回投稿

# 環境
– macOS Big Sur(11.2)
– Flutter (Channel beta, 1.26.0-17.2.pre, on macOS 11.2 20D64 darwin-x64,
locale ja-JP)
– Android toolchain – develop for Android devices (Android SDK version 30.0.3)
– Xcode – develop for iOS and macOS
– Chrome – develop for the web
– Android Studio (version 4.1)
– VS Code (version 1.53.1)

# 参考にしたサイト

– [Cloud Firestore を使ってみる | Firebase](https://firebase.googl

元記事を表示

OTHERカテゴリの最新記事