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

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

KMP + Koin で DI (Dependency Injection)

今の時代、モジュール間は疎結合、ユニットテストはスタブを注入!💉💉💉

というのが定番みたいだし、実際にも開発しやすいので、
[KMP](https://www.jetbrains.com/kotlin-multiplatform/)[^1] でも Dependency Injection(以下DI)していきたいです。

KMP は開発言語が Kotlin なわけですが、
Android 向けに [Dagger Hilt](https://developer.android.com/codelabs/android-dagger-to-hilt?hl=ja#0) という DI フレームワークがありつつも、残念ながら KMP 非対応です。

じゃあ KMP の場合は何を使えば良いのか?

ということで、自分がいちばん慣れてる [Koin](https://insert-koin.io/) を使ってDIを実現してみます[^2]。

## ライブラリ追加

まず、これがないことには始まりませんので。
[ここ](https://insert-koin.io/docs/reference/koi

元記事を表示

【Swift】配列の全ての要素が条件に一致しているかをチェックする

# はじめに
配列の全ての要素が条件に一致しているかをチェックする機能があることを知ったので記事にしておきます。

# 実装
“`swift
let array = [“acerola”, “almond”, “apple”, “avocado”]

// 配列の全ての要素にaが含まれているかを判定
array.allSatisfy { $0.contains(“a”) } // true

// 配列の全ての要素にbが含まれているかを判定
array.allSatisfy { $0.contains(“b”) } // false

// 配列の全ての要素にcが含まれているかを判定
array.allSatisfy { $0.contains(“c”) } // false
“`

# おわり
これ結構便利ですね
`allSatisfy`がない場合、`filter`や`reduce`を使って同じ事ができそうですが、冗長になりそうですね

# 公式ドキュメント
https://developer.apple.com/documentation/realitykit/loadrequ

元記事を表示

Indian Website Company

![Indian Website Company Logo 400400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623788/3614a547-e483-9d9c-4016-adcf997131f0.png)

Indian Website Company is a leading website design company in India based in Indore.

元記事を表示

AssetsからTextureResourceをLoadできない

Vision OS用にRealityKitでこんな感じで画像からTexttureを生成しようとしたのですが、画像によっては何故かエラーが発生してしまいました。

画像は、Assetsに入れてあり、大きさも同じなのですが、1はOKでも、2は読めないみたいな事象が起きており、悩んでいたのですが、

“`
guard
let texture1 = try? TextureResource.load(named: “1”),
let texture2 = try? TextureResource.load(named: “2”)
else {
// error
}
“`

Assetsからの画像読み込みだと暗くなるという記事を見つけたので、もしやと思い、Bundleから読み込むようにしてみました。すると、

“`
guard
let url1 = Bundle.main.url(forResource: “1”, withExtension: “png”),
let texture1 = try? TextureResource.load(cont

元記事を表示

【SwiftUI】TextにURLを表示させようとすると勝手に青くなるのやめてくれ

# はじめに
TextにURLを表示させようとすると勝手に青くなってしまいます。
`foregroundStyle`などを指定してもずっと青いので💢

# 問題
`Text`にURLを表示させようとするとURL部分が青くなります。
“`swift
import SwiftUI

struct ContentView: View {
var body: some View {
Text(“https://qiita.com/”)
}
}
“`
![スクリーンショット 2023-11-17 20.00.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/71ecc92a-1638-9b99-bd72-e8503d488981.png)

文字+URLだとURL部分だけ青くなります。
“`swift
import SwiftUI

struct ContentView: View {
var body: some View {
Te

元記事を表示

SwiftUIで実装した公式AdMob Bannerのコードを修正する

https://developers.google.com/admob/ios/swiftui

iOSに広告を表示するためのライブラリAdMobは公式にSwiftUIに対応しています。

# Bannerのコード
広告にはいろいろな種別がありますが、バナーのコードを見ていきます。
下記のコードは、公式に沿って実装し、ビルドが通るようにしたコードになります。

“`swift BannerViewControllerWidthDelegate.swift
protocol BannerViewControllerWidthDelegate: AnyObject {
func bannerViewController(_ bannerViewController: BannerViewController, didUpdate width: CGFloat)
}
“`

“`swift BannerViewController.swift
class BannerViewController: UIViewController {
weak var delegate

元記事を表示

【SwiftUI】動画を再生する

# はじめに
SwiftUIで動画を再生するサンプルを記事にしときます。

# サンプルアプリ
![Simulator Screen Recording – iPhone 15 – 2023-11-16 at 21.38.46.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/ac3111c7-93e3-bd7c-d306-65e1adbaccff.gif)

# 実装
### インターネット上にある動画を再生する
“`swift
import SwiftUI
import AVKit

struct ContentView: View {
let url: URL = URL(string: “https://taishin-miyamoto.com/sample.mp4”)!

var player: AVPlayer? {
.init(url: url)
}

var body: some View {
VideoPla

元記事を表示

【Swift】Firestoreのエラーをローカライズする

# はじめに
Firestoreは便利ですが、SDKで定義されているエラーのerrorDescriptionは英語でそのまま使うとユーザーにとってわかりにくいものになってしまいます。
そこでFirestoreのエラーを自前でローカライズしてみようという記事です。

# 実装
StringCatalogを使うために`String(localized:)`で実装しています
“`swift
import FirebaseFirestore
import FirebaseFirestoreSwift
import Foundation

public enum PostError: Error, LocalizedError {
case firestore(FirestoreErrorCode.Code)

public var errorDescription: String? {
switch self {

case .firestore(.OK):
return String(localized

元記事を表示

YouTuberはじめてみました

## YouTuberはじめてみました

先日、岸川さん、松舘さん達iOSデベロッパーとの飲み会で、どういう経緯でそうなったか思い出せませんが、「吉川さんなんか動画やってよ」みたいな話が出てきて、そういえば以前から YouTuberやるなら是非やってみたいと思った企画があったのを思い出しました。

それは、アプリをゼロから開発制作する過程を動画化してみる事です。なんか浦沢直樹の「漫勉」みたいですね。自分は浦沢直樹ほどの大御所ではありませんが、iOS開発者界隈では、まぁまぁのプレゼンスはあるかなと自負しております。

で、ここ何日かほぼ毎日XcodeとSwiftでのアプリ開発過程を深夜、ぶつぶつ独り言をつぶやきながら、アプリの開発を録画してきました。動画時間が長いので、実時間以上の時間を掛けて編集している余裕はないのと、セミライブ感を出すために、ほぼそのままYouTubeに公開していますが、ストックができるまでステルスでアップロードしていました。

ある程度ストックが貯まってきた事から、今回Qiitaの記事として発表する事にしました。動画のプレイリストは以下の通りです。

https:/

元記事を表示

SwiftUIでダイアログ

今回はSwiftUIでダイアログを表示する話。
様々なダイアログを表示してモデルのプロパティを変更できる機構を考えます。

開発アプリPR

3分作曲-musicLine-

# はじめに

モデルのプロパティを

元記事を表示

TCAでGithubリポジトリ検索アプリを作ってみよう①

# はじめに
TCAは注目度は高いと思っていますが、僕の(狭い)観測範囲では導入事例はまだあまり多くない印象です。

僕が関わっているプロダクトではガッツリTCAを使っているので、国内でもっともっとTCAが盛り上がってくれないと困る…!w

ということで、国内でのTCAの盛り上がりに少しでも貢献できればと思い、実践的なサンプルアプリケーションを作って解説記事を書いてみることにしました。

ちゃんと解説しようと思うと結構なボリュームになりそうなので、いくつかの記事に分けて公開していく予定です。

# 想定読者
TCAを全く知らない方向けの記事ではありません。
少なくとも[公式チュートリアル](https://pointfreeco.github.io/swift-composable-architecture/main/tutorials/meetcomposablearchitecture)は一通り目を通し、簡単にでも自分でサンプルアプリを作ったことがある方を想定しています。

簡単なサンプルアプリを作れるレベルから一歩先に進むために必要な技術要素を学べることをイメージしています。

元記事を表示

PencilKitで高解像度の写真に絵を描く

## はじめに

PencilKitで高解像度の画像をスクロールして絵を描けるようにする方法で悩んだので、備忘録です。

## 概要

– PKCanvasViewはStoryboardで設定
– 高解像度の画像を表示する場合はスクロールして絵を描けるようにする
– 画面に収まる画像の場合は画面中央に配置して絵を描けるようにする
– 画像外は絵を描けないようにする

## ソースコード
“`swift
class ViewController: UIViewController {

@IBOutlet weak var canvasView: PKCanvasView!
private let imageView: UIImageView = UIImageView()
private let pkToolPicker = PKToolPicker()

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

元記事を表示

【SwiftUI】TCAのNavigationStackStoreを使うための最もシンプルなサンプル

# はじめに

NavigationStackStoreを使うための最もシンプルなサンプルを作成したのでコピペして使ってください

# サンプルアプリ
![Simulator Screen Recording – iPhone 15 – 2023-11-14 at 22.22.05.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/6d5a45d7-6f32-079f-b7c3-c44e52fd67ec.gif)

# 実装
### ParentView
“`ParentView.swift
import SwiftUI
import ComposableArchitecture

struct ParentView: View {
@ObservedObject private var viewStore: ViewStoreOf

let store: StoreOf

public init(

元記事を表示

5歳児向けの依存性注入から考えるアプリ開発の DI

# 本記事のターゲット

– DI の基本を理解しているが、もう少し理解を深めたい
– アプリ開発(Android/iOS)で DI を採用したことがある。あるいは、これから採用しようとしている

# キーワード

– Dependency Injection
– Service Locator
– Property Injection
– Constructor Injection
– Composition Root

# はじめに

まず、英語版 Wikipedia の [Dependency Injection](https://en.wikipedia.org/wiki/Dependency_injection) の記事に面白い喩え話が載っているので、引用したい。

> Dependency injection for five-year-olds
>
> When you go and get things out of the refrigerator for yourself, you can cause problems. You might leave the do

元記事を表示

【Flutter】Xcode 15でiOS 17のシュミレーターが起動しないUnable to get list of installed Simulator runtimes

# はじめに
なぜかiPhoneシュミレーターが起動しない事件が発生した。。。。
「またか・・」
とため息をつきながら👇の対応を行った。

https://qiita.com/kokogento/items/465984cad8624f483782

**しかし、今回はいくらキャッシュを消してもシュミレーターが起動しない!!!!**

「何かがおかしい:expressionless:」

そう思いとりあえず`flutter doctor`で確認

“`console
% flutter doctor (git)-[master]
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.13.3, on macOS 14.1 23

元記事を表示

iOSでのレイアウト崩れ問題とその対処法

## 事象

Next.js と Tailwind CSS を使用してiOS向けのレスポンシブ対応を行っている際に、mainタグにh-screenを適用してもiOSのアドレスバーが画面下部に表示されることでレイアウトが崩れる現象が発生しました。

## 対処法

この問題の原因は、iOSでのビューポートの高さ (vh) が動的に変化するため、アドレスバーの表示によってビューポートの高さが変わり、それがレイアウト崩れを引き起こしていました。これを解決するためには、Tailwind CSSの設定を以下のように変更します。この設定では、標準のビューポート高さ (vh) ではなく、ダイナミックビューポート高さ (dvh) を使用しています。

“`tailwind.config.ts
module.exports = {
theme: {
extend: {
// Solutions for Safari address bar display issues
height: {
screen: [“100vh”, “100dvh”],

元記事を表示

【最新】Unity でiOS, Android バイブレーションを簡単に共通化!Nice vibration, Feelを使って手軽に!

Unityで人気のアセット、Nice Vibration(Feelに統合された)のプリセットバイブレーション一覧がこちら。

これらのメソッドを使うだけでいい感じになる。

“`
public virtual void SelectionButton()
{
HapticPatterns.PlayPreset(HapticPatterns.PresetType.Selection);
}

public virtual void SuccessButton()
{
HapticPatterns.PlayPreset(HapticPatterns.PresetType.Success);
}

public virtual void WarningButton()
{
HapticPatterns.PlayPreset(HapticPatterns.PresetType.Warning);
}

public virtual void FailureButton(

元記事を表示

【SwiftUI】trimで図形の一部のみを表示させる

# はじめに
正方形をtrimを使って切り取ってみます。

# サンプルアプリ
![Simulator Screen Recording – iPhone 15 – 2023-11-13 at 22.50.32.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/7032ce18-0caa-6450-2e6e-db3a3fedf452.gif)

# 実装
“`swift
import SwiftUI

struct ContentView: View {
@State private var trim1: CGFloat = 0

@State private var trim2: CGFloat = 0

var body: some View {
VStack {
Rectangle()
.trim(from: trim1, to: trim2)
.f

元記事を表示

アラートテンプレ集(コピペおけ)

実際によく使う順にアラート(UIAlertController)のテンプレをご用意しました。最後の全体コードをあなたのXcodeプロジェクトに新しくswiftファイルを作ってコピペすれば、すぐにご利用頂けます。

## 目次
[タスク完了アラート](#タスク完了アラート)
[エラー発生アラート](#エラー発生アラート)
[短文説明アラート](#短文説明アラート)
[二択(はいorいいえ)アラート](#二択アラート)
[入力欄付きアラート](#入力欄付きアラート)
[文字数オーバーアラート](#文字数オーバーアラート)
[入力破棄して画面巻き戻しアラート](#入力破棄して画面巻き戻しアラート)
[全体コード](#全体コード)

## タスク完了アラート
“`swift:AlertExtension.swift
static func taskDoneAlert(taskString: String, viewController: UIViewController, completion: (() -> Void)?) {
let alert = UIAlertCont

元記事を表示

Bitriseの機能を使ってSwiftLintを導入

# 概要
BitriseでiOSアプリのCI/CD環境を構築すると簡単にSwiftLintのチェックを導入する事ができます。Bitriseの機能を使用しておりFastlaneやDangerを使用してません。
## 前提
本記事は以下の前提で作ってます。
– Bitriseでアプリのビルドを完了している事。
– SwiftLintをSwiftPMで導入している事。
– `BuildTools`ディレクトリに`Package.swift`を置いている事。
– `.swiftlint.yml`がプロジェクトルートにある事。
## Bitriseのステップ構成
全体のステップに関しては以下になります。

### 1. `Activate SSH key (RSA private key)` ステップ
– 役割
– Bitr

元記事を表示

OTHERカテゴリの最新記事