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

iOS関連のことを調べてみた2023年10月03日
目次

iOSシュミレーターがUnable to boot the Simulator. で起動しない時の、もう一つの解決法

# はじめに
![Screenshot 2023-10-03 at 10.16.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/461885b5-9d66-1d63-5dd9-c0c6b942d2da.png)
Flutter開発をしていてある日突然、「Unable to boot the Simulator.」というエラーが表示され、iOSシュミレーターが起動しなくなった!!!
VSCodeでもAndroid Studioでも起動しない!!:scream_cat:

これは由々しき事態である。

# よくみる解決法では無理だった

https://weblog.noanoachan.net/xcode-simulator/#toc6

https://zenn.dev/shinkano/articles/75c7582a04a630

検索してよく見かけるのは?のSimulatorのキャッシュを削除する方法です。
が、なぜか私の場合`About this Mac > Storage

元記事を表示

【SwiftUI】Menuに赤いボタンを追加する

# はじめに
SwiftUIのMenu内に「削除」ボタンを実装しようとした時に、
削除ボタンの色は赤くしたかったのでtintやforgroundStyleなどで色変更しようとしてもできなかったので方法を記録しておきます。

# 実装
Buttonのルールを`.destructive`にするとボタンが赤くなります
“`swift
Menu {
Button(role: .destructive) {
// 処理
} label: {
Label(“削除”, systemImage: “trash”)
}
} label: {
Image(systemName: “ellipsis”)
}
.foregroundStyle(.secondary)
“`

# ダメな例
“`swift
Menu {
Button {
// 処理
} label: {
Label(“削除”, systemImage: “trash”)
}
.foregroundStyle(.r

元記事を表示

iOS, Androidエミュレータにファイルを転送するにはドラッグアンドドロップすればOK

ふと試したらあっさりできて感心した
一応仕事でスマホアプリ開発していたこともあったのに初めて知りました

# Android
Downloadsにコピーされる
![スクリーンショット 2023-10-01 22.33.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352532/e9fea86c-3d58-7977-6974-dea33d24f038.png)
![スクリーンショット 2023-10-01 22.34.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352532/431cd565-5c89-d5b1-0cd5-79d68e63c3a4.png)
![スクリーンショット 2023-10-01 22.34.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352532/5af3eda7-1498-6925-9f6

元記事を表示

【iOS】アプリアイコンをさくっと作成する方法

アプリのアイコンが付いていないとコードを書く気が出ないという時ってありますよね。そんなときに、とりあえずそれっぽいアイコンをさくっく作成する方法のご紹介です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77444/bf1c0c89-31cf-fbd1-2a8a-db804c0c889a.png)
↑ やる気がでないやつ

# アプリアイコンの作成の流れ
1. アイコン画像を表示するViewの作成
1. Viewのスナップショットをファイルに保存(1024×1024ピクセル、透過PNG)
1. 画像ファイルをXcodeのAppIconアセットに設定

## アイコン画像を表示するViewの作成
[SF Symboles](https://developer.apple.com/jp/sf-symbols/)を使って適当なアイコンをViewに表示して、背景色にグラデーションをかけるだけです。背景色にグラデーションを付けるのはiOS16から使えます。
![image.png](https:

元記事を表示

SwiftUIで下から出てくる選択肢アラートの実装方法

今回は下から出てくる選択肢アラートの実装をしてみようと思います。

普段はAndroidの開発をしています。
AndroidにはそういったUIはないので最初名前が何て言うのか調べました。

ActionSheetと、言うみたいです。

ですが、SwiftUiでは別の名前になってました。

confirmationDialogという名前だったので、こちら使用しています。

“`SampleAlert.swift
struct SampleAlert: View {
@State private var showConfirmationDialog = false

var body: some View {
VStack {
Button(“SampleConfirmationDialog”) { showConfirmationDialog = true }
}
.padding()
.confirmationDialog(“”, isPresented: $showCo

元記事を表示

DateFormatterの和暦バグの解決法を考える

# はじめに
DateFormatterとは、SwiftでDate型の日付を文字列に変換するときに使用するオブジェクトです。
実はこのDateFormatter、使い方を誤ると**思わぬバグを生み出してしまいます**。
※ 現在時刻は`2023/9/30 12:34`だとして説明します。
“`swift
let date = Date() // 現在時刻
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = “yyyy/M/d HH:mm”
let r = dateFormatter.string(from: date)
print(r) // 2023/9/30 12:34
“`
上記のコード、一見問題なさそうに見えますよね……?
しかし、実行する端末の設定によっては、`0005/9/30 12:34`と表示されてしまうバグを含んでいるのです。 「設定」アプリを開いて「一般>言語と地域>暦法」を「和暦」に設定した端末でこのコードを実行すると、そのバグを観測できます。
暦法の設定

元記事を表示

【XcodeCloud】XcodeCloudで実行した時はBuildPhasesのRunScriptを実行したくない

# はじめに
SwiftLintをRunScriptでビルドしてたのですが、XcodeCloudでの実行時間がめっちゃ長くなっちゃうので、
XcodeCloudで実行された時は処理をスキップしたいことがありました。
その時にRunScript上でXcodeCloudで実行されていることを検知する環境変数を知ったので記事にしておきます。

# 実装
“`sh
if [ “$CI_XCODE_CLOUD” == “TRUE” ]; then
echo “✅ XcodeCloudで実行されました”
else
echo “❌ XcodeCloud以外で実行されました”
fi
“`

これを使ってXcodeCloudの時は処理をスキップしたい時はこうなります。

“`sh
if [ “$CI_XCODE_CLOUD” == “TRUE” ]; then
exit 0
fi

# 行いたい処理
“`

# おわり
XcodeCloudの実行時間が15分 → 3分に短縮されました!

# ドキュメント
https://developer.apple.com/documenta

元記事を表示

iOS17 + XCode15 + Swift + OpenCV

iphone15も出たし、iOSでOpenCVを使いたいと思い調査したところ、Objective-C関連は何もしなくても良くなってるみたい。Podもあるから楽勝!と思いきや、エラーがでて使えなかったので、コツコツとMakeしたら動くようになったのでメモしておきます。

# 試した環境
Macbook Air M1
Xcode15
MacOS Ventura 13.5.2

# 事前準備
Cmakeをインストール

brew install cmake

Python3をインストール

brew install python3

# OpenCVのMake
Gitから落としてくる

git clone https://github.com/opencv/opencv.git -b 4.6.0
git clone https://github.com/opencv/opencv_contrib.git -b 4.6.0

Make実行。Targetは13以降で使いたいので13に設定してるが適宜変更

python3 

元記事を表示

【Swift】配列から特定要素を削除

# はじめに
配列から特定の要素を削除したい時に見る用記事

# 実装
基本はこっちを使う
```swift
array.removeAll { $0.id == "001" }
return array
```
:::note alert
エラー
```
Cannot use mutating member on immutable value: 'xxx' is an immutable capture
```
:::

このようなエラーが出る場合はこっちを使う

```swift
let newArray = array.filter { $0.id != "001" }
return newArray
```

# 参考記事
https://softmoco.com/swift-basics/swift-array-remove.php

元記事を表示

UIKitとSwiftUIのViewの描画周りで気をつけること

## 気をつけることと両者の違い
結論から言うと、気をつけるべきことは、`クラスの性質`と`構造体の性質`に注意するということ。
また、両者の違いは、主に`UIkitはクラスでViewが作成され、SwiftUIは構造体でViewが作成される`ことである。

## このトピックにおけるUIKitの性質
- クラスの生成
- 通常、クラスで作成したインスタンスは、アプリのライフサイクル内で一度生成されると、(自分でインスタンスを破棄するコードを書くなど以外で)`そのインスタンスはほとんど破棄されることはなく保持される。`そのため、`データや設定が安定して維持される。`

- いつクラスのインスタンスが破棄されるのか?
- 通常は、`ViewController自体が破棄されるときに一緒に破棄される。`
- 破棄されるタイミングの具体例
- ユーザーが画面上の戻るボタンを押して前の画面に戻ると、現在のビューコントローラーが破棄される。
- メモリ不足の状況下で、システムがビューコントローラーとそのビュ

元記事を表示

Coordinatorクラスについて簡単にアウトプット

## Coordinatorとは?
- UIKitでのイベントをSwiftUIで管理する(取得するなど)ために作成するクラスのこと。
- 先述した通り、主な役割としては、`UIKitのイベントやデータの受け渡しをSwiftUIに伝える。`
- (ラップされた)UIKitのViewの`delegate`や`target action`をハンドリングしたい場合、structではハンドリングできないため、Coordinatorクラスという仕組みが採用されている。

- Coordinatorクラスはデフォルトで存在しないため、独自で実装する必要がある。一般的にはCoordinatorという命名である。

## 主なメソッド
`makeCoordinatorメソッド`
- makeCoordinatorメソッドは`makeUIViewメソッドよりも先に呼ばれる`ので、そこ(makeCoordinatorメソッド内)でCoordinatorを作成する。

- その後、makeUIViewメソッドやupdateUIViewメソッドなどで渡されるcontextにco

元記事を表示

UIViewRepresentableプロトコルについて簡単にアウトプット

## UIViewRepresentableプロトコルとは?
UIKitのViewや機能をSwiftUIでも使えるようにする`ラッパー的役割`を持つ。

ちなみに、ラップして違うフレームワークを使用可能にする組み合わせは下記である。
- UIKitをSwiftUIで使用 → UIViewRepresentableプロトコル
- SwiftUIをUIKitで使用 → UIHostingControllerクラス

## 主なメソッド
- `makeUIViewメソッド`
- 表示するViewの初期状態のインスタンスを作るメソッド。SwiftUIの中で使用したいUIKitのViewを戻り値として返す。
- 最初の一回しか呼び出されない。そのため、Viewを更新する場合はupdateUIViewメソッドに処理を定義する。

- updateUIViewメソッド
- 表示するViewの状態が更新されるたびに呼び出され、更新を反映させる。
- 例えば、UIViewRepresentableプロトコルに準拠させた構造体のプロパティなどが変更されたときに呼び出さ

元記事を表示

モバイル端末の発熱情報をUnreal Engine上で取得する

iOSとAndroid端末の発熱状況をUE上から参照する方法を調査してみました。

まず、iOS/Androidそれぞれのネイティブプラットフォームの発熱情報について軽く説明します。

# iOSの熱ステータス

参考元:
https://developer.apple.com/documentation/foundation/processinfo/thermalstate

* nominal : 通常範囲
* fair : やや上昇している
* システムの対策:ファン開始、すぐに必要されないバックグラウンドタスクの停止、等
* 推薦されたアプリの対策:バックグラウンドタスクの削減(例:バックグラウンドダウンロードの停止、DBインデックス更新の停止、等)
* serious : 高い
* システムの対策:ファンがフルスピードで稼働、パフォーマンスに影響するリソース削減(例:I/O,CPU,GPUの使用の削減、60FPS→30FPSにカット)
* 推薦されたアプリの対策:I/O,CPU,GPUのようなシステムリソースの使用の削減(例:グラフィック品質設定を低に

元記事を表示

【SwiftUI】バッジの見た目を変更する

# はじめに
iOS17から`badgeProminence`というバッジの見た目を変更するメソッドが追加されていたので使ってみました

# 実装
### standard
```diff_swift
List(0..<10) { index in Text(index.description) .badge(index) } .badgeProminence(.standard) ```

### decreased
```diff_swift
List(0..<10) { index in Text(index.description) .badge(index) } .badgeProminence(.decreased) ``` iOS17以降から使えるObservationについて

## はじめに
iOS17以降から`Observation`という新たな状態監視のFrameworkが使用できるようになりました。
しかし、状態監視のFrameworkとしてはすでに`Combine`が存在しています。
今回は新たに登場した`Observation`と`Combine`を比較しながら、`Observation`について見ていきます。

## `Observation`について
まずは、`Observation`と`Combine`の書き方を比較していきます。
今回はボタンをタップすると表示されている数字がインクリメントしていくViewをそれぞれ作成して比較していきます。

### `Combine`による状態監視
`CounterViewState`は`ObservableObject`を実装し、`@Published`を付与したプロパティの値を監視しています。
`CounterView`は`StateObject`を使って`CounterViewState`を監視可能なオブジェクトとしてインスタンス化することで、`CounterViewState`の状態が変化した際に

元記事を表示

モバイルアプリのアクセシビリティ対応(スクリーンリーダー、VoiceOver)

# はじめに
以前に[プロジェクトで行ったVoiceOver対応(読み方の変更)](https://qiita.com/repepe2en/items/42c8dc1e679a31c96c24)を投稿しましたが、今回はアプリ全体で行った対応について、目標にしているところとその対応方法をまとめて備忘録としてまとめます。

自分の参加しているプロジェクトでは[Apache Cordova](https://cordova.apache.org/)というモバイルアプリ開発向けのフレームワークをベースに開発を行っています。
技術的には3割ほどネイティブの実装で他はwebの技術を利用しています。
なので、iOS,Androidとタグにありますが、この記事ではHTML,TypeScriptでの対応方法です。

# 方針

[Web Content Accessibility Guidelines (WCAG) 2.0](https://waic.jp/translations/WCAG20/Overview.html)に準拠したアプリの実現。
[WAI-ARIA](https://develope

元記事を表示

Web Share API で、canvasに描画した画像と、指定したハッシュタグをTwitterの投稿にコピーペーストする

## 使用想定シーン
画像合成して特定のハッシュタグでつぶやくキャンペーンの時に、サーバーや端末に合成画像を保存する事なく、コピーペースト操作でハッシュタグと画像をツイートしてもらう。
ユーザーに対して操作手順の説明は必要。

### html
```


```

### script
```
const previewCanvas = document.getElementById('js-previewCanvas');

元記事を表示

【SwiftUI】ScreenTimeAPIで特定のアプリを一定時間全く使用できないよう制限する

本記事ではScreenTimeAPIを用いて、他のアプリの使用を制限する方法を紹介します。

## はじめに

作業をしている途中に、つい息をするようにXを開いてしまい、集中が途切れてしまうことは誰にでもあると思います。
AppleにはScreenTimeAPIという機能が用意されており、他のアプリを制限できるようカスタマイズすることが可能です。

## ScreenTimeAPIとは

WWDC2021にはScreenTimeAPIが発表され、`FamilyControls`、`ManagedSettings`、`DeviceActivity`という3つの新しいフレームワークが導入されました。

- **Family Controls**
ScreenTimeAPIへのアクセスを認証。アプリやウェブサイトを識別するために使われる透過トークンを提供して、ユーザープライバシーを保護する。

- **ManagedSettings**
ScreenTimeで設定可能な制限を適用し、アプリの使用制限や、Webサイトのフィルタリング等の、アクティビティを制限すること可能。

今回は上記2つのフ

元記事を表示

【Swift】特定の要素の次の要素、前の要素を取得する

# はじめに
やりたいことはタイトルの通りです。
1番前にいる時に前の要素を取得しようとすると、1番後ろの要素を取得したいです
1番後ろにいる時に前の要素を取得しようとすると、1番前の要素を取得したいです

# 実装
```swift
struct XXX {
let id: String
}

let array: [XXX] = [XXX(id: "000"), XXX(id: "001"), XXX(id: "002"), XXX(id: "003"), XXX(id: "004")]

let selectedItem = XXX(id: "003")

func currentItemIndex(selected: XXX, in array: [XXX]) -> Int? {
if let index = array.firstIndex(where: { $0.id == selected.id }) {
return index
} else {
return nil
}
}

func previousI

元記事を表示

非日本語圏日本語フォント問題、SwiftUIにおける対処事例(2023年中旬)

デバイスの言語設定で日本語を選択していないような場面において、日本語文章のフォントが想定外のものになる現象は多くのデバイスで発生する。

![例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3564662/c5929b30-7929-3770-da82-ba9ad7fb94f6.png)

今回は2023年中旬にAppleプラットフォーム向けアプリに実施したSwiftUIにおける対処事例を紹介する。

# 参考
2015年に公開された下記のブログポストを参考にした。このポストでは「本現象の解説」と「UIKit環境におけるNSAttributedStringを用いた解決策」を示している。また、本現象のことを「中華フォント現象」と呼んでいる。

https://qiita.com/usagimaru/items/46c27c42e862fb8aba7e

# 対象アプリ

https://apps.apple.com/app/id1620268476

![アプリ.png](https://qiit

元記事を表示

OTHERカテゴリの最新記事