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

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

コマンドラインでiOSアプリをビルドしシミュレータで起動する

# はじめに

本稿は、コマンドラインでiOSアプリをビルドし、シミュレータにインストールおよび起動する方法について書いています。

# シェルスクリプトの作成

以下のbuild.shをプロジェクトのルートディレクトリに配置します。
build.shには `chmod +x build.sh` して実行権限を与えておきます。

“`shell:build.sh
#!/bin/sh

SCHEME=’Your Scheme’
SIM_NAME=’iPhone 15′ # シミュレータ名
DESTINATION=”platform=iOS Simulator,name=$SIM_NAME”
CONFIG=’Debug’ # ‘Debug’ or ‘Release’
DERIVED_DATA_PATH=’./build’
APP_NAME=’Your App Name’
APP_PATH=”$DERIVED_DATA_PATH/Build/Products/$CONFIG-iphonesimulator/$APP_NAME.app”
BUNDLE_ID=’your.bundle.id’

元記事を表示

【SwiftUI】ATTが表示されない問題の解決策

# はじめに
「ATTが表示されない」で検索すると同じ問題で記事を書いてる方が割といます。
それらの記事は`DispatchQueue.main.asyncAfter(deadline: .now() + 1.0)`で遅延実行してATTを表示させてました。
1秒遅延させたら表示されないってことはなかなかないと思いますが、個人的には美しくないと思うので、別の解決策を考えました。

# 原因
おそらく、`applicationState`が`active`になっている時にATTリクエストしないとアラートが表示されないっぽい?です。

`applicationState`の確認方法です。

“`swift
func debugApplicationState(mark: String) {
switch UIApplication.shared.applicationState {
case .active:
print(“\(mark): active”)
case .inactive:
print(“\(mark): inacti

元記事を表示

sheetの中でキーボードにフォーカスさせたい時の注意点

# やりたかったこと
ボタンを押すと下から入力フォーム的なのを出す
出すと同時にテキストフィールドにフォーカスし、キーボードを出す

# 遭遇した現象
`FocusState`を`onAppear`内で`true`にしたのにフォーカスされない

# 原因
ミニマムなViewを作っていろいろ検証した結果、いくつかわかったので共有

### フォーカスされないコード

“`swift
struct ContentView: View {
@FocusState private var isFocused: Bool
@State private var showSheet = false
@State private var text = “”

var body: some View {
Button {
showSheet = true
} label: {
Text(“Show sheet”)
}
.sheet(isPresente

元記事を表示

[Swift]enumで変数が定義できる?

# 目次
[1.enumで変数が使える?](#1-enumで変数が使える?)
[2.実例](#2-実例)
[3.おわりに](#3-おわりに)

# 1. enumで変数が使える?
Swiftにおいて何かと便利に使用できるenumですが、実は変数(プロパティ)が定義できるってご存知ですか?
ちなみにenumは個人的にはデータ管理に非常に役立っていると感じます。

# 2. 実例
~~~swift: enumプロパティ
enum Month: Int {
case january = 1
case february = 2
case march = 3
}

extension Month {
var japanese: String {
switch self {
case .january:
return “睦月”
case .february:
return “如月”
case .march:
return “卯月”

元記事を表示

【ios 17】新機能とアップデートの魅力

## 【ios 17】新機能とアップデートの魅力

こんにちは。今回は、ios 17について初心者エンジニアに向けて、新機能とアップデートの魅力についてご紹介します。

## 新デザインとインターフェースの革新

ios 17では、新たなデザインとインターフェースが導入され、使いやすさと視覚的な魅力が大幅に向上しました。これにより、ユーザーはより直感的に操作できるようになり、素晴らしいユーザーエクスペリエンスを体験することができます。

新たなデザインとインターフェースの革新によって、アプリの起動速度や画面遷移のスムーズさも向上しました。これにより、ユーザーはストレスなく素早くアプリを利用することができます。

以下に、新デザインとインターフェースの革新に関するサンプルコードを示します。

“`swift
// タブバーのアイテムの設定
tabbaritem.title = “ホーム”
tabbaritem.image = uiimage(systemname: “house”)
tabbaritem.selectedimage = uiimage(systemname: “hous

元記事を表示

【Swift】OptionSetという複数の値をまとめて管理できるものがあるらしい

# はじめに
デフォルトで用意されているコードスニペットを見ていたら使ったことのない機能を見つけたので使ってみました。
![スクリーンショット 2023-11-21 22.35.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/0ee0c7d7-186d-371e-2e98-3b46fc52f5b0.png)

# サンプルアプリ
![Simulator Screen Recording – iPhone 15 – 2023-11-21 at 22.34.58.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/0ea152a9-4188-f89a-d4b0-dd8d86c8fe52.gif)

# 実装
“`swift
import SwiftUI

struct ContentView: View {
@State private var sectionOptions: Sect

元記事を表示

【Swift】PlaygroundでPreviewできるらしい

# はじめに
PlaygroundでViewをPreviewする事ができることを知りました。
![スクリーンショット 2023-11-20 20.22.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/42988a25-a24f-caf0-ce50-897d7591a80c.png)

# 実装
“`swift
import SwiftUI
import PlaygroundSupport

struct PlaygroundView: View {
var body: some View {
VStack {
Text(“Hello, World!”)
Text(“Hello, World!”)
Text(“Hello, World!”)
Text(“Hello, World!”)
Text(“Hello, World!”)

元記事を表示

【SwiftUI】KeyframeAnimation使ってみた

# はじめに
iOS17から使えるKeyframeAnimationを調べならが使ってみたのでちょっとまとめたのを投稿しておきます。

# 最小単位のサンプル
“`swift
import SwiftUI

// `KeyFrameAnimationValues`で指定した値を`keyframeAnimator`で使用できる
struct KeyFrameAnimationValues {
var scale = 1.0
}

struct ContentView: View {
var body: some View {
VStack {
Image(systemName: “heart.fill”)
.resizable()
.scaledToFit()
.frame(width: 100)
.foregroundStyle(.red)
.keyframeAnimat

元記事を表示

【SwiftUI】プレビューでカスタムテキストスタイルの Dynamic Type に対応する

# はじめに

Dynamic Type とはフォントサイズをユーザが調整できるようにする OS の機能です。

アプリ内設定ではなく、設定アプリから端末全体に対して設定するやつですね。

公式が用意している [`Font.TextStyle`](https://developer.apple.com/documentation/swiftui/font/textstyle) を使用することで簡単に対応できます。

ただし、`Font.TextStyle` はフォントサイズがガチガチに決められているためデザイン指示がある場合などは対応しきれないことが多いでしょう。

というわけで、この記事では**カスタムのテキストスタイルの Dynamic Type 対応方法**について紹介します。

# 実装方法2パターン

上記に対応する場合、パターンとしては以下の二つがあります。

1. [`UIFontMetrics`](https://developer.apple.com/documentation/uikit/uifontmetrics) を使用するパターン
2. [`Scaled

元記事を表示

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/refere

元記事を表示

【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
“`

:::note warn
空の配列に対しては常にtrueが返されるので注意が必要です。
“`swift
let array = [String]()
array.allSatisfy { $0.contains(“a”) } // true
“`
:::

# おわり
これ結構便利ですね
`al

元記事を表示

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)は一通り目を通し、簡単にでも自分でサンプルアプリを作ったことがある方を想定しています。

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

元記事を表示

OTHERカテゴリの最新記事