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

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

# [Swift] 複数の ビルドTARGET へ Swift Package Manager でライブラリを入れる

# [Swift] Swift Package Managerでライブラリを入れる

複数のビルドTARGETにライブラリを入れる際のメモ

## 1、swift packagesからライブラリを入れる。

[iOSアプリ開発にSwift Package Managerを使おう](https://qiita.com/hironytic/items/09a4c16857b409c17d2c)

今回は[QGrid](https://github.com/Q-Mobile/QGrid)をプロジェクトへ導入する。

(1) File → Swift packages → add package dependency
(2) プロジェクトへ導入したいライブラリのgit url (https://github.com/Q-Mobile/QGrid) を入れる

![スクリーンショット 2021-10-08 22.26.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322570/3c70e8fb-a51a-

元記事を表示

DST Root CA X3 has expired 対策

#※注意書き※ 暫定記事です。
#DST Root CA X3 の期限切れ
Let’sencrypt ユーザの皆さんなら、よくご存知でしょうが、 CA証明書、2021/09/30 に期限が切れてしまったことで様々な影響があると伝えられてきました。明確に「対応がないもの」というのが古いOSであったりするのですが、証明書のコンパチビリティ で示されているような古いOSに限らず 例えば、Windows10あたりでも、自動で入れ替えられたりはしないまま古い証明書が「無効なまま」参照され、VPNなどでは弾かれて(13801エラー)しまいます。

筆者はStrongSwanのKEv2/VPNサービスで「認証エラー」となるため、数時間潰されてしまいました。(証明書が無効ですとエラーが出ればいいのに)

Webブラウザ中でなら昔から手慣れたインターフェイスで管理できるのですが、OSはそうでもないことが多いのです。

#何をすれば良いのか
接続先サーバの、FQDNに

元記事を表示

[SwiftUI] 変数の値をNavigationLinkのdestinationに指定して遷移できるようにしたい。

# [SwiftUI] 変数の値をNavigationLinkのdestinationに指定して遷移できるようにしたい。

## 概要
使いまわせるviewは、できるだけ細かく作って、車輪の再開発だけは避けたい!!!
と思い、List用のcellのviewを作成。
しかし、cellにあるNavigationLinkのdestinationプロパティの値で怒られ、ハマる。。。

## Cannot find type ‘Destination’ in scopeで怒られ、引数に遷移したいviewを渡せない。。。
![スクリーンショット 2021-10-08 21.55.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322570/4a7f8885-c557-2176-73ac-3335e08b3016.png)

“`swift
struct NavigationLinkView: View {

var body: some View {
VStack(spac

元記事を表示

【Swift】URLはStringからデコードできる

偶然気づいたのですが、JSONをデコードする際にURLは直接Stringからデコードできるみたいです。

例えばこういうJSONがあったとします。

“`
let jsonString = “””
{
“url”: “https://example.com/”,
}
“””
“`

この時に作成するモデルは

“`swift
struct Example: Decodable {
let url: URL
}
“`

と書く事ができます。`let url: String`としなくても良いという事です。

試しにデコードしてみます。

“`swift
let example = try JSONDecoder().decode(Example.self, from: jsonString.data(using: .utf8)!)

// Example(url: https://example.com/)
print(example)
// URL
print(type(of: example.url))
“`

どうやらちゃんとURL型にデコードされているみ

元記事を表示

Dependency Injection

“`swift:Original.swift
class User {
}

class ApiManager {
static let shared = ApiManager()

private init() {}

func getUsers(completion: @escaping (Result<[User], Error>) -> Void) {
let user = User()
/* Do task which takes time such as get users over internet. */
completion(.success([user]))
}
}

class Client {
func execute() {
let api = ApiManager.shared
api.getUsers { result in
/* do something */
}
}
}

class

元記事を表示

APIを利用するModelクラスをテストする

##前提
ここでは私自身の備忘録として本記事の執筆に至っています。
仔細な間違い等ございましたらご指摘いただけますと幸いです。

##実装すること
今回はXCTestを用いて実際のAPIを叩きそれに対するテストコードを実装してみたいと思います。
実装する内容としてはユーザー名を用いGithubのレポジトリからスター数を5以上のものを返すModelクラスをテストしてみたいと思います。

##各クラスのロール

|     クラス | ロール             |
|:———–|————:|
| GitHubRepository | GitHubレポジトリを表現するEntityクラス |
| GitHubAPIClient | GitHubのAPIを叩いてデータを取得するAPIクライアント |
| GitHubRepositoryManager | 指定したユーザー名のレポジトリ一覧を取得するModelクラス |

##実際のコード

“`swift:GitHubRepository
// GitHubリポジトリを表現するEntityクラス

st

元記事を表示

Swift – #colorLiteral使ってカスタマイズのUIColorを定義

#はじめに
UI部品に色を指定したい場合、↓のようにstoryboardでいじる以外、
![截圖 2021-10-07 22.10.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1326861/7a3cd733-d929-7a28-1faa-5739c1bfd2db.png)
コードで指定することもできます。例えば、

“`サンプル.swift
self.view.backgroundColor = UIColor.black
“`
`.black`黒色は内蔵の色なので、`UIColor.`を入力して、自動的にリストが出てくると思います。↓の感じ
![截圖 2021-10-07 21.32.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1326861/15d97c1c-2127-d126-6608-9f84127bfa6a.png)

でも、もし欲しい色は内蔵にない場合はどうすればいいですか?storyb

元記事を表示

Carthageで入っている各ライブラリのSwiftバージョンを洗い出すシェル芸

ABI Stability & Module Stability 対応しているライブラリはSwiftのバージョンを上げて `carthage bootstrap –cache-builds` してもキャッシュが効いてビルドが走らないが、その関係で複数のSwiftバージョンでビルドされたライブラリが混在する結果になる。

そこで、各ライブラリがどのバージョンでビルドされているのかが知りたくてシェルを書いた。

“`sh
$ find Carthage/Build -name “*.version” -exec /usr/local/bin/jq ‘.iOS[] | [.name, .swiftToolchainVersion] | join(“: “)’ {} \; | cat | uniq | sed -r ‘s/\”//g’
“`

“`sh:result(例、一部抜粋)
KeychainAccess: 5.4.2 (swiftlang-1205.0.28.2 clang-1205.0.19.57)
SVProgressHUD:
OHHTTPStubs: 5.5 (swif

元記事を表示

[Unity] iOS NativePluginの実装の仕方

# はじめに
Androidに引き続き、iOS側でもNativePluginの作成方法をまとめました。
ここでは、UnityでiOSのNativeアラートを表示させるまでの忘却録です。

Unity向けのiOS Pluginは作り方は人によって違うと思いますが、
今回は『UnityのiOSビルド結果であるXcodeプロジェクト上からコードを編集しました。』
もっと効率の良いやり方があればご教授下さい><; Android版↓ https://qiita.com/atsutama/items/28744b1a29e79184c3fc ## 準備 macOS Catalina: 10.15.7 Unity 2018.4.19f Xcode12.4 Swift4.0 ## UnityとiOS Pluginの構成 Unityから書き出されるiOS関連のファイルはObjective-CベースなのでSwiftを呼び出す設定が必要です。 SwiftからObjective-Cのクラスに呼ぶには、宣言されてるヘッダーファイルを特定のヘッダーファイルでimportして使用します。 今回は`Obje

元記事を表示

【Swift】HTTP通信時のコネクションの再利用

## 概要

URLSessionオブジェクトを再利用することによる通信処理の効率化について記載します。

[Androidについてはこちら](https://qiita.com/cwan/items/391557a9edc4524cd685)

## 障害事象

弊社が開発しているiOSアプリのデータ転送量が多すぎるのではないかという報告を受けました。データ転送量を測定してみると、HTTPリクエスト・レスポンスのヘッダーおよびボディサイズの合計の2.5倍程度の量が発生していました。

※このアプリの外部への通信はすべて[Swift標準のHTTPRequest](https://developer.apple.com/documentation/foundation/urlrequest)を使用して実装されています。

## 調査方法

XCodeのDebug Navigatorで通信状況を調べてみることにしました。

1. シミュレーターでアプリを起動
1. ツールバー > [View] > [Navigators] > [Debug] を選択
1. [Network] をクリック

元記事を表示

iOS長期インターンに参加してから4ヶ月経って、学んだこと

# 自己紹介 & はじめに
都内の情報系の大学に通う大学生です。iOS開発は今年はじめくらいから勉強していて、6月から長期インターンに参加しています。
インターン初めて3ヶ月ちょいですがこの間でもたくさんのことを学び、技術面に関わらず人間的な面でも色々気付かされたので、**「長期インターンは楽しいぞ!」**ということが少しでも伝えられればいいなと思います。

![Screenshot-from-2021-09-28-19-15-48-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861241/916169d6-8d29-f54e-aa8d-5bb155d0d5cd.png)

# 学んだこと、気づいたこと

### モチベーションは爆上がりする
インターンシップは、学んだことが社会に出て価値になる環境の1つであるので、やはり嬉しいです。

### 独学では学ばない部分にも手が届いて楽しい!
アプリ開発は
– 提案
– 設計(デザイン?)
– 実装
の3つに集約されると思うのですが、やはり**提案*

元記事を表示

【Swift5】キーボードを閉じる方法

# はじめに
この記事は、アプリを作っている際に幾度も「なんだっけ?」を解決するために作成した記事です。記事というか公開ノートのようなものです。

# 前提
classに`UITextFieldDelegate`を追加します。

“`swift
import UIKit

class ViewController: UIViewController, UITextFieldDele{

@IBOutlet weak var TextField: UITextField!

override func viewDidLoad() {
super.viewDidLoad()

TextField.delegate = self
}

“`

`TextField`は任意のtextFieldです。

# タッチでキーボードを閉じる
キーボード以外の場所をタップするとキーボードが閉じます。

“`swift
override func touchesBegan(_ touches: Set,

元記事を表示

[Swift] PKToolPicker in iOS14

#iOS14でPKToolPickerのshared(for:)がDeprecatedされている件

これまでのやり方

~~~swift
if let window = UIApplication.shared.windows.first {
if let toolPicker = PKToolPicker.shared(for: window) {
toolPicker.addObserver(canvasView)
toolPicker.setVisible(true, forFirstResponder: canvasView)
canvasView.becomeFirstResponder()
}
}
~~~

iOS14 でのやり方

PKToolPickerのインスタンスをmakeUIView外で宣言。

~~~swift

@Binding var canvasView: PKCanvasView
let toolPicker = PKToolPicker.init()

func makeUIVie

元記事を表示

iOS開発環境におけるデバッグ効率を上げるTips

# はじめに

この記事は自分がデバッグを行う中で便利だと思ったことを記載しています。
定期的に追記/更新していきます。

# 設定

## 言語環境など、特定の設定状態で起動する

シュミレータや実機でデバッグを行うとき、Localizedの確認のために特定の言語や地域で起動したい場合があります。

### After

![IMG_2202.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300780/1340e8b1-5441-bfb1-bda6-2a9ddc5034e4.png)

言語設定の場合、実機やシュミレータでも設定アプリから設定することができます。
しかし、切り替える度に画面が暗転し、短い再起動のような状態に陥ります。

### Before

Edit Scheme -> Run -> Optionsと遷移すると以下のような画面が表示されます。

![Screen Shot 2021-10-06 at 1.21.52.png](https://qiita-image-store.s3.

元記事を表示

2021年版 iOSアプリ配布用証明書の作り方

# はじめに

iOSアプリの配布用証明書(Distribution Certificate)の作り方はいつも忘れてググってしまうのですが、最近ググると古いやり方が大量にヒットするうえ、さらに自分の記憶も2016年頃で止まってたため、大混乱しました。

最近iOS開発を始めた人は何も混乱しないような気がしますが、新しいやり方を備忘録として書き残します。

昔は証明書署名要求(CSR)ファイルをローカルで生成し、Apple Developer へアップロードして iOS Distribution Certificatie を生成してました。検索するとたくさんヒットするのはこちらのやり方です。

Xcode 8以降では証明書の自動管理機能が導入され簡単になっています。現在は、Xcode の Manage Certificates 機能で「Apple Distribution Certificate」を作成するのがシンプルな手順と思われます。

# Xcode からの Apple Distribution Certificate の作り方
手順は Xcode 12.5 のものです。

元記事を表示

iOS AutoLayoutに甘んじた結果の失敗談

昔と違い、近年ではiPhoneの画面サイズも多様かされていて、Android開発同様にAutoLayoutでデザインするのが常識のとなっています
そんな中、AutoLayoutに任せっきりのマインドからきた「おやっ?」と思った失敗談です

※時系列として、iPhone 13が出る前の話です

## 前提
– XCode 12.0
– 画面のレイアウト(制約含む)はStoryboardを使って定義している
一部、データ条件に応じた、表示/非表示、画像の切り替えはコード側で制御
– iPhoneだけをターゲットにした開発

## 発生した問題
iPhone 12 Pro Maxの時だけ、TabBarの表示領域が意図した通りに確保されていなかった
これにより、操作はできるものの見栄えが極めて悪い状態となってしまった

よく見たら、Storyboard上でアイコンが■で表示されているではないか。。
(この時点で、開発者の意図した状態ではなかった)

制約の設定内容

– Tab BarはView上で下付き
Tab Bar自体には高さの制約は設定しない
– UIViewはTab Barに

元記事を表示

SwiftUIで株価をチャートで表示する 「API取得編」

## **APIを叩いて非同期処理で株価を取得する**
本記事の目的は、SwiftUI初心者が[**Alpha Vantage Inc.**](https://www.alphavantage.co/)のAPIを使用して、米株市場の銘柄を取得できるようになることです。株価のチャートを表示するのは別の記事で投稿しようと思います。
![5株価イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128814/5dcdf0ef-4259-c6df-ca29-0a54a46b12ac.png)

## **APIKeyの取得 ~ APIの詳細について**
**APIKeyの取得手順**
1.[**Alpha Vantage Inc.**](https://www.alphavantage.co/)のサイトから「GET YOUR FREE API KEY TODAY」をクリックする。
![1(APIKey取得).png](https://qiita-image-store.s3.ap-northeast-1.

元記事を表示

Unityビルドにハマった時に見る備忘録

#最初に
これらは備忘録でざっと書いているので日本語がおかしかったりこの方法で直らない可能性があることをご了承ください

#Unityビルドに失敗する場合
##エラーが100個以上大量に出ている場合
エラーの量で雑に分類します。
エラーメッセージを見る。
### Duplicate class com.google.android.gms.ads.identifie … と言われてる場合

例えばこのエラーメッセージの場合

java.lang.RuntimeException: Duplicate class com.google.android.gms.ads.identifier.AdvertisingIdClient found in modules classes.jar (:com.google.android.gms.play-services-ads-identifier-17.0.0:) and classes.jar (:play-services-ads-identifier-17.0.0:)

元記事を表示

【iOS】RxSwiftを使ってMVVMなカウントダウンタイマーの作り方

# リアクティブなカウントダウンタイマーの作り方

手書きでQiita書いたので誤字脱字あったらお許しください…

### ViewController

“`swift:ViewController.swift

class ViewController: UIViewController {

@IBOutlet private weak var countLabel: UILabel!
@IBOutlet private weak var startButton: UIButton!
@IBOutlet private weak var stopButton: UIButton!

private var viewModel: ViewModel!
private let disposeBag = DisposeBag()

override func viewDidLoad() {
super.viewDidLoad()
setupViewModel()
}

private func setupViewModel()

元記事を表示

[Swift] iOS UIKitプロジェクトでPreviewを簡単に使う方法

XCode preview はUIの変更点を容易に見ることができる機能で、SwiftUIでは簡単に使えます。

私は今度、[UICollectionViewCompositionalLayout](https://developer.apple.com/documentation/uikit/uicollectionviewcompositionallayout)を勉強しながら、

UIKitでXcode Previewを書いてみたいと思いました。

今回の掲示板ではiOS UIKitプロジェクトでPreviewを簡単に使う方法について紹介します。

## UIViewController
“`swift

import UIKit

#if canImport(SwiftUI)
import SwiftUI

@available(iOS 13.0, tvOS 13.0, *)
public struct UIViewControllerPreview: UIViewControllerRepresentable where Content : UIViewCon

元記事を表示

OTHERカテゴリの最新記事