iOS関連のことを調べてみた

iOS関連のことを調べてみた
目次

【Flutter】Patrolでテストを書く(導入まで)

## はじめに
Flutterの[Finder](https://api.flutter.dev/flutter/flutter_test/Finder-class.html)や[WidgetTester](https://api.flutter.dev/flutter/flutter_test/WidgetTester-class.html)ではネイティブビュー(OSの権限許可ダイアログ等)を見つけたり操作することができません。
そこで、[patrol](https://patrol.leancode.co/)を使用して操作できるようにしたいと思います。

本記事では`patrol`を導入し、iOSとAndroidのセットアップまで進めます。

## 環境
・flutter: 3.19.6
・dart: 3.3.4
・patrol: 3.6.1
・patrol_cli: 2.7.0

## `patrol`、`patrol_cli`のインストール

### `patrol`を追加

“`
flutter pub add patrol –dev
“`

※Android SDK

元記事を表示

覚えるのは必須じゃないけど役に立つもの 〜 2の冪(べき) 〜

## はじめに

読了時間:5分

覚えてなくても問題はないけど、覚えていて損はないことを小出しに紹介して行こうかと思います

## **2の冪(べき)と近似値**

今回は **2の冪(べき)と近似値**です。

以下のようなケースで役に立つかと思います。
– スケーラビリティやメモリの制限があるような問題に向き合う時
– Intなど数値型ではどの数値まで扱えたか?

2の冪(べき)の表
2の冪 厳密な値 近似値 MB, GBなど
7 128
8 256
9 512

Flutter の 2 つのウィジェットについて

## 概要

Flutter の 2 つのウィジェット、StatelessWidget、StatefulWidget についてまとめてみました。
特に StatefulWidget のライフサイクルについて深掘りしてみました。

## StatelessWidget とは

– 状態を持たないウィジェット
– 一度描画されるとその後、状態が変化しない
– 例)固定のテキスト表示、アイコン・画像など

## StatefulWidget とは

– 状態を持つウィジェット
– ユーザーの操作や時間の経過などによって、状態が変化し、見た目や振る舞いが変わる
– 例)チェックボックス、テキストフィールド、カウンターアプリなど

## StatefulWidget のライフサイクルについて

ここでは StatefulWidget のライフサイクルについて深掘りしていきたいと思います。

緑の図形で記載したのが状態、青の図形で記載したのが各状態で呼び出されるメソッドになります。

![スクリーンショット 2024-05-05 10.47.02.png](https://qiita-image-

大学非公式アプリのあれこれ

# はじめに

大学生が在学する大学の非公式(一部公式)アプリを開発した例をまとめたいと思います。これは私が大学非公式アプリ開発を始めるための市場調査兼ねていました笑。
現時点(2024年4月)でiOS版ネイティブアプリのリリースが行われているものを対象とします。筆者の独自集計のため漏れがあるかもしれない点はご了承ください。

# 調査

### 1 芝浦工業大学「ScombApp」

これはかなり学生開発アプリの中では有名な事例だと思います。開発者の方が大学に相談したことがきっかけで、大学の公式アプリとして採用され学生エンジニアとして開発・保守を行なっているというなんとも素晴らしいエピソード付きのアプリです。
現在は専用のAPIまで用意されているとか…

https://apps.apple.com/jp/app/scombapp/id1669657083

https://web.sic.shibaura-it.ac.jp/scombapp

### 2 早稲田大学「わせコマ」

こちらは早大生が早大生のために開発された非公式アプリです。時間割の登録が大学公式ポータルMyWas

【SwiftUI】ScrollView や List を snap する

なんか違和感がある。

### 🤔 snap を使う

ScrollView を使ったリストの実装に、

“`swift
.scrollTargetLayout()

.scrollTargetBehavior(.viewAligned)
“`

の2行を追加するだけできっちり止まるようになります。

### 🤔 適用後

違和感がなくなりました。

これは便利すぎる !

onFieldSubmitted時にテキストをクリアする方法

# 概要
Flutter初心者によるFlutter初心者のための記事になります。
TextFormField使ってonFieldSubmittedを発火させた後に入力した文字消えないの気持ち悪いなと思って調べてみました。

# 実装
TextFormFieldのテキストをクリアするには、TextEditingControllerを使います。

実装方法は下記になります。

“`dart
final _editController = TextEditingController();

TextFormField(
controller: _editController,
onFieldSubmitted: (text) {
// 〜〜〜〜〜〜〜
_editController.clear(); // TextFormFieldのテキストをクリア
},
),
“`

実際の動きはこんな感じになります。
![qiita.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/

iOS向けのWebアプリの作成時に気づいたこと

# 概要
Webアプリはブラウザ上で閲覧できるため、PC/スマホ両方で利用することができます。
しかし、PCと異なりスマホは端末の画面が小さくなります。指でタッチすることを考慮する必要があるため、一部のスマホはUIに関する独自のガイドラインが定められています。
たとえば、[iOS向けのユーザーインターフェイスのデザインのヒント](https://developer.apple.com/jp/design/tips/)のように、文字の大きさやタッチコントロールなど細かいところまでガイドラインが定められています。
今回は、上記のデザインのヒントを知らずに開発していたら、バグった話を紹介します。
[Andoridの端末でもiOSのようなガイドライン](https://developer.android.com/design/ui/mobile/guides/foundations/accessibility?hl=ja&_gl=1*fjdscy*_up*MQ..*_ga*MjA2Mjg4MTgwMy4xNzEzOTM0NjE4*_ga_6HH9YJMN9M*MTcxMzkzNDYxNy4xL

iPhoneでメモリキャッシュとディスクキャッシュの画像読み込み速度を比べてみた

## はじめに
iOSのアプリを開発していて画像をどこで保持しておくか悩むことがありました。そこでメモリとディスクで画像の読み込み速度を計測・比較してみようと思い立ちました。

## そもそもキャッシュとは
ファイルやアプリケーションのデータを一時的に保持し、データの再取得や再計算にかかる時間を短縮する仕組みです。

## メモリキャッシュとディスクキャッシュ
**メモリキャッシュ**
データをデバイスのRAM(ランダムアクセスメモリ)内に一時的に保存する方法です。高速にアクセスできますが、アプリケーションが終了するか、デバイスが再起動されると消去されます。使用し過ぎると動作が重くなったりもします。

**ディスクキャッシュ**
データをデバイスの永続的なストレージ(SSDやHDDなど)に保存する方法です。ディスクキャッシュはメモリキャッシュよりも遅いですがアプリケーションが終了してもデータは保持されます。ストレージの一部を使用します。iPhoneの128GBとか256GBとかいってるあれです。

## キャッシュに画像を保存する
### メモリキャッシュへ保存
メモリキャッシュ

【知見メモ】wordJoinerでSwiftUIのText()の文字を変な位置で改行させないようにする方法

# はじめに

本記事では、wordJoinerを使って、SwiftUIのText()の文字を変な位置で改行させないようにする方法をご紹介します。

## 環境

– Xcode 15.2
– iOS 17.2

# 発生した課題

SwiftUIのTextを表示した時に、左詰めで文字が表示されず、変な位置で改行されていました。

![スクリーンショット 2024-05-01 18.12.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3368292/eaea822f-d85d-b518-4cf7-33891eca495c.png)

“`
現状: ボヘミア\nン・ラプソデ
“`

しかし、理想とする改行の位置はこちら

“`
理想: ボヘミアン\n・ラプソデ
“`

(正式名称は、ボヘミアン・ラプソディですが、文字数の都合上、「ィ」は省略)

## 実装(before)

また、実装は下記の通りです。
ZStackでRoundedRectangleの上にTextを載せています。

fra

iOSアプリ開発関連メモ:XcodeとmacOSとSwiftなどのバージョン対応表(Apple公式へのリンク)

# XcodeとmacOSとSwiftなどのバージョン対応表

https://developer.apple.com/support/xcode/

Pythonista3で英語学習アプリ風を作ってみた

# Pythonista3で英語学習アプリ風に作ってみた

皆さんはPythonista3をご存じでしょうか。iOSデバイス上でPythonによるプログラミングが出来る、iPhone/iPadユーザーにはとても便利なアプリです。

今回はPythonista3を使って、TOEIC Part5を意識した空欄選択問題の練習をするアプリ風なプログラムを作ってみました。

荒削りですが、試行錯誤した点を含めて備忘録的に投稿させていただきます。

## 1. プログラムを作った背景
会社からTOEICを受講するよう言われたため勉強を始めたのですが、Part5の正答率を上げるためには苦手な問題を繰り返し学習して潰し込むのが良きと考え、App Storeを探索していました。

が、下記の要件を満たす、なるべく安いアプリが見つからず、であれば作ってしまおうとなりました。

[要件]
– CSVファイルから独自の問題をインポート出来る
– 品詞問題に対応するよう用意したフレーズを使用できる(≠他問題の選択肢ランダム)
– 解答後には解説が確認できる
– 苦手問題をマーキングしたり、学習結果を記録として出

iOSのPrivacy ManifestsのNSPrivacyTrackingDomainsに記載するドメインの調べ方

Google AdMobやApplovin Maxといったサードパーティのライブラリが接続しているトラッキングドメインを調べてPrivacy MainifestsのNSPrivacyTrackingDomainsに記載する手順です。

## 環境
Xcode 15.3

## 参考
[WWDC 2023: Get started with privacy mainifests](https://developer.apple.com/videos/play/wwdc2023/10060/?time=399)

## 手順
#### 1. Xcodeでプログラムをデバッグ実行します。
#### 2. Xcodeのナビゲータバーでデバッグナビゲーターを選択し、Networkを選択します。
![スクリーンショット 2024-04-29 10.03.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362719/0e88c383-9c88-c38f-7867-5f51d86a87d1.png)

####

Module ‘Nuke’ has no member named ‘loadImage’ とNo such module ‘NukeExtensions’ になる

# はじめに

https://pixiv.github.io/ios-tutorial/tutorials/tutorial/practice4

pixivのTutorialをやっていてNukeでつまずいたのでメモ

# Nuke.loadImageが使えない
NukeのバージョンによってNuke.loadImageが使えなくなっているようでしたので解決方法を探して
“`
import NukeExtensions
“`
をインポートしてようとしましたが、No such module ‘NukeExtensions’ とエラーになってしまう。

# 解決方法
### 私の場合はAdd to TargetがNoneになっていたのが原因でしたのでNukeをSPMで入れなおしました。
以下画面に行きます。
![スクリーンショット 2024-04-28 22.30.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883687/2e95bd28-f990-6648-3fe6-89247489567b

Flutter で Android と iOS のスワイプして戻る画面遷移機能を無効化する

# なにこれ
この戻る機能を無くしたいので、それを実装した時のメモを書く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/82a1a37c-2c3f-7b0d-1883-297374b3cf65.png)

# 解決方法
`PopScope` を利用して `canPop: false` を実装するだけで大丈夫でした。

### Before
“`dart
class _HomeViewState extends State {
int selectedIndex;

_HomeViewState({Key? key, required this.selectedIndex});

@override
Widget build(BuildContext context) {
return Scaffold(
// コードが続く
“`

### After
“`dart
class _HomeViewState ex

iOSシュミレータがUnable to boot the Simulatorになってキレている人へ

# うんち

朝早起きしてコーヒーキメて
「よっしゃ今日も開発するか」
ってなったらこんなエラーが出た。

![CleanShot 2024-04-28 at 12.48.27@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1657253/23094ab7-32b0-4c4e-b674-ac3bb26e702d.png)

“`
Unable to boot the Simulator.
Domain: NSPOSIXErrorDomain
Code: 60
Failure Reason: launchd failed to respond.
User Info: {
DVTErrorCreationDateKey = “2024-04-28 03:47:19 +0000”;
IDERunOperationFailingWorker = “_IDEInstalliPhoneSimulatorWorker”;
Session = “com.apple.CoreSimulat

Flutter の BottomNavigationBar で4つのアイテムを設定するとテキストが表示されない問題の解決方法

# なにこれ
Flutter で BottomNavigationBar を使ってメニューを作成しようと思ったらテキストが表示されなくて困ったので、その時の解消方法をメモ

# 事象
3つまでだとこのように良い感じに表示されるが
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/6a92eb77-dde2-29ad-04f8-fae74b6e81b6.png)

4つ以上になるとテキストが見えなくなった!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/4d66dc22-557e-87a3-bbd9-922a527f0d45.png)

# 解決方法
`type: BottomNavigationBarType.fixed` で固定にしないといけないらしい。
“`
bottomNavigationBar: BottomNavigationBar(
typ

iOS Simulator で Unable to boot the Simulator とエラーが出た時の対処方法

# これなに
iOS シミュレーターを起動しようと思ったらこのメッセージが出てきてなにも起動できなかったので、その時の試行内容と解決方法をメモ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/88e84412-8114-9e59-f1f2-56036ab4099d.png)

# 解決方法
キャッシュ以下すべてを削除して復活しました。
“`zsh
rm -rf ~/Library/Developer/CoreSimulator/Caches/*
“`

# エラーログ
`cat ~/Library/Logs/CoreSimulator/CoreSimulator.log` して調べてみると以下のようなエラーが吐かれていた。

`Failed to start launchd_sim: could not bind to session, launchd_sim may have crashed or quit responding` から察するに、なんかクラッシュ

Kotlin 2.0.0でKMPのSwiftPM export機能が入る(のかもしれない)

# Kotlin Multiplatform Gradle Plugin supports SwiftPM Export

– 今までFramework or XCFrameworkのDilectLink, CocoaPodsしかサポートされていなかったがSwiftPMのexportも公式にサポートされることになった
– 2.0.0-Beta5で彗星の如く機能が追加されてRC-1にも入っている
– RC-1で確認した

https://github.com/JetBrains/kotlin/commit/d76a6d6a9c0dce00b00cf69b26de921884b2b189

https://youtrack.jetbrains.com/issue/KT-65741

– YouTrackもinternalなものなようで記事執筆時点ではみれない

– まだ2.0.0時点でもExperimentalな機能なのでgradle.propertiesでフラグを有効にしないと使えない

“`properties
kotlin.swift-export.enabled=true
“`

iPhoneの自作カメラアプリで接写がピンボケする場合の対応方法

## はじめに
iPhone11シリーズ辺りからQRコードなどの小さい対象をある程度近づけて撮影したい場合、[builtInWideAngleCamera](https://developer.apple.com/documentation/avfoundation/avcapturedevice/devicetype/2361449-builtinwideanglecamera)を使うだけではピントがボケてしまう問題があります。

これは最近のiPhoneは焦点距離が伸びており、それより近づけて撮影しようとしてもボケてしまうことが原因です。

## 対策

調べたところいくつか方法があります。

1. [What’s new in camera capture](https://developer.apple.com/videos/play/wwdc2021/10047/) (Apple公式)
2. [iPhone 15 Pro/Pro Max で発生する、近距離でカメラのフォーカスが合わない問題への対応](https://zenn.dev/luup_developers/artic

ボタンをタップしても画面遷移できず、前の画面に戻れない

## はじめに
私は最近プログラミングスクールにて学習をスタートした初学者で、学習していく中で疑問に思ったことや苦労したことなどについて記事を書いております。

知識が浅はかですので、間違っている部分があるかもしれません。
あらかじめご了承ください。

## ボタンタップ時にエラー表示が出て画面遷移できない。

現在、簡易的なTwitterサンプルアプリを作成しているのですが、ツイート編集画面にて、ユーザー名とツイート本文を打ち込んでいるにもかかわらず、「ポストする」ボタンをタップしても元の画面に戻れずエラー表示が出てしまう。

![Screenshot 2024-04-26 at 23.34.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715605/2b0cc4a4-ec74-c121-f6e9-48e8c03470ad.png)

コードは以下の通りです。

“`swift:ツイート編集画面

/// データを保存
func saveData() {
guar