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

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

【iOS】新規プロジェクトにSPMマルチモジュールを採用する際の手順書

## 目的
SPMマルチモジュール化の手順を整理すること
備忘録

## ゴール

以下のような、`SPMマルチモジュール構成`を採用したプロジェクトを作れるようになること

## 前提
SwiftUIベースの`初期プロジェクト`作成
今回は初期プロジェクトを`SPMViewTranslation`とします

## 手順

### パッケージを生成 (1/4)

– [ ] パッケージ用のフォルダを作成 (`SPMViewTranslationPckage`)
– [ ] フォルダをパッケージ化

“`.bash
$ cd ~~~~/SPMViewTranslation
$ ls
SPMViewTranslation.xcodeproj SPMViewTranslationUITests
SPMViewTran

元記事を表示

[Swift] isolatedなasync functionからnon-isolatedなasync functionを呼び出した時は必ずActorから出る

# TL;DR

**Swift5.7以降では**

“`swift
@MainActor
func isolatedFunc() async {
await nonIsolatedFunc()
}

func nonIsolatedFunc() async {
// ここはMainActorではない
}
“`

**Swift5.6以前では**

“`swift
@MainActor
func isolatedFunc() async {
await nonIsolatedFunc()
}

func nonIsolatedFunc() async {
// ここはMainActor

try? await Task.sleep(nanoseconds: 100)

// ここはMainActorではない

}
“`

参考

https://github.com/apple/swift-evolution/blob/main/proposals/0338-clarify-execu

元記事を表示

[Swift] VaporをDockerでビルドしようとするとインクリメンタルビルドが無効になる件

最近いろいろあってVaporに入門しているのですが、Dockerでビルドしようとするとインクリメンタルビルドが無効になって、ビルド時間が余計にかかってしまうという問題が発生しました。

Dockerコンテナは起動する度に、ファイルシステム上のファイルが新しい作成日時、最終変更日時などのメタデータを取得してしまい、Swiftのコンパイラがファイルがすべて変更されたと認識してしまうため、インクリメンタルビルドが無効になるみたいです。

どうやら解決策があるようなので、忘れないように記事にします。

# 解決法
Dockerfileにあるswift packageコマンドを使っているRUN命令すべてに以下の文字を添えることでキャッシュされたものが使われるようになります。

“`
–mount=type=cache,target=/build/.build
“`

全体のDockerfileはこのようになりました。

“`Dockerfile
# ================================
# Build image
# =====================

元記事を表示

SwiftUIで一覧画面から詳細画面へ遷移後、データを更新して一覧画面に戻るとちゃんと更新されたデータが反映される実装例

[株式会社Never](https://neverjp.com/)のshoheiです。

株式会社Neverは「NEVER STOP CREATE 作りつづけること」をビジョンに掲げ、理想を実現するためにプロダクトを作り続ける組織です。モバイルアプリケーションの受託開発、技術支援、コンサルティングを行っております。アプリ開発のご依頼や開発面でのお困りの際はお気楽にお問合せください。
https://neverjp.com/contact/

弊社のアプリ開発は`Flutter`を利用していますが、PJによってはiOSネイティブで開発しています。そこで得た知見を共有します。

本記事は新しい発見とかではないですが、誰かの悩みを解決できるものであれば幸いです。

# 概要

メモアプリ等でよくある、一覧画面から詳細画面へ遷移後、データを更新して一覧画面に戻るとちゃんと更新されたデータが反映される実装例を紹介します。

今回紹介するコードはこちらにまとめてます。
https://github.com/never-inc/iOSAdventCalendar2023

# 実装例のアプリ

元記事を表示

[iOS] サウンド再生時のバックグラウンド音声のコントロール方法

# はじめに
動画を再生する画面の実装にあたり、バックグラウンドで流している音楽等のサウンドに干渉した場合の調整方法に調べました。

# 環境
Xcode15

# 内容
アプリのバックグラウンド再生されているオーディオのコントロールには、`AVAudioSession`を使うことで実現できる。

`AVAudioSession`でiOSのオーディオセッションの管理ができ、アプリがどのようにオーディオを扱うかをシステムに伝えることができる。

“`swift
import AVFoundation

func configureAudioSession() {
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(.playback, mode: .default)
try audioSession.setActive(true)
} catch {
print(“Audio Session con

元記事を表示

【Xcode】runtime profile not found using “System” match policy Download the com.apple.CoreSimulator.SimRuntime.iOS-x-x simulator runtime from the Xcode Settings.

# はじめに
シュミレーターが使えなくなる問題に遭遇したので記録しておきます。

https://x.com/SNQ2001/status/1730123989975171171?s=20

# 状況
シュミレーターで実行すると以下のようなエラーが出る

![スクリーンショット 2023-11-30 16.17.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/f56c699a-0723-d3e3-9f0d-1b6c080b99bc.png)

全てのシュミレーターで発生するわけではない

# それっぽい記事
ただ、あんまり情報がなかった
https://developer.apple.com/forums/thread/708544

# 解決方法
① 「Manage Run Destinations…」を選択します。
![スクリーンショット 2023-11-30 22.02.57.png](https://qiita-image-store.s3.ap-northeast-1.

元記事を表示

Blazor wasmがiOSで動かない時の解決方法

## TL;DR
*index.html* ファイル内の “`“` の前に “`“` を入れることで解決

## この問題について
### 問題発生条件
– OS: iOS
– ブラウザ: Safari, Chrome, Opera (検証したブラウザ全部)

![エラー画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2769460/07447608-10d4-c987-643a-9b0d4a4a32f5.png)
↑のようなエラーが発生し、画面が読み込まれない
(このスクリーンショットではロードがされているが、実際はロードが98%ぐらいのところで止まっているため、サイドバーや文字は表示されない)

### 解決方法
“`プロジェクト名/wwwroot/index.html“` を以下のように編集する
“`diff_html
<

元記事を表示

【ios 17】アクセシビリティ機能の拡張と向上

## バイブレーションとホームボタンのアクセシビリティ設定

### 概要
バイブレーションやホームボタンのアクセシビリティ設定がios 17で拡充されました。これにより、ユーザーはより快適にデバイスを操作できるようになります。

### バイブレーションの設定
バイブレーションの設定は、ユーザーがデバイスの振動に対して感じる強さやパターンを調整することができます。具体的な設定方法は以下の通りです。

“`swift
// バイブレーションの強さの設定
uidevice.current.isproximitymonitoringenabled = true

// バイブレーションのパターンの設定
audioservicesplaysystemsoundwithvibration(vibrationpattern, -1)
“`

上記のコードを使用することで、ユーザーは自分に合ったバイブレーション設定を行うことができます。また、バイブレーションの強さやパターンはアプリ内で動的に変更することも可能です。

### ホームボタンのアクセシビリティ設定
ホームボタンのアクセシビリティ設

元記事を表示

No such module ‘FirebaseCore’を解決した話

検証のためにFirebaseをiOSプロジェクトに導入しようとしていたところ、
「Apple アプリへの Firebase の追加手順 4.初期化コードの追加」
で以下のようなエラーが出た。

`No such module ‘FirebaseCore’`

このエラーが出た時にそのまま検索しても回答が出ていなかったが、以下のように手順を踏むことで解決できた。

TARGETS>APP NAME>Frameworks,Libraries,and Embedded Content
の+ボタンをクリックし、使用するサービスを選択して追加することで解消する。

今回の検証ではAnalyticsとCrashlyticsを検証する想定であったため、以下のように該当サービスを追加したところ、無事エラーが消えた。
![スクリーンショット 2023-11-30 1.36.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412789/49799468-0c8f-7d76-5d13-b33ea0246f81.png)

元記事を表示

爆速CoreData

## はじめに
こんにちは、watnowのアドベントカレンダー初日を担当させていただきます。
よろしくお願いします!
記事を書くのは2回目なのでかなり拙い文章となっております、ご了承ください。:bow_tone1:

そしてこの記事は、
##### いち早くCoreDataを使いたい!!

そんな人向けの記事になっているので詳しいことは個人的に分かり易いなと思った記事を貼っておくので詳しくはそちらで学習してもらえればと思います。
では本題に移ります。

## CoreDataってなに?(爆速)
CoreDataは、ローカルにデータを保存、取得などをするためのCocoaFrameWorkに搭載されたO\RマッパーのことでありDB自体はSQLiteを使っています。

:::note info
O\Rマッパー
O\RマッパーとはオブジェクトとRDBをつなぐ橋渡しのようなもの
通常プログラムでインスタンスの値を保存するSQL文などを生成するコードを書かなければいけないが、O\Rマッパーはあらかじめ設定しておいた対応関係から自動でデータベースの対応するテーブルに書き出しや逆にデータを

元記事を表示

【SwiftUI】マップ上に範囲を表す円を表示する(iOS17)

# はじめに
昨日に引き続きiOS17で大型アップデートの入ったMapKitに関する記事です。

https://qiita.com/SNQ-2001/items/ae0fd2ff2a415d7e0713

今回はタップした位置に範囲を表す円を表示してみます。

# サンプルアプリ
![Simulator Screen Recording – iPhone 15 – 2023-11-29 at 21.07.52.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d9e951c0-88c6-691a-dd74-f66eafaf1558.gif)

# 実装
“`swift
import SwiftUI
import MapKit

struct ContentView: View {
// 東京駅の座標
@State private var position: MapCameraPosition = .region(.init(
center: .init(l

元記事を表示

SwiftUIで元のアスペクト比を保ちつつ、長方形に画像を表示させたい!In LazyVGrud!

# はじめに
SwiftUI楽しいです![むらお](https://twitter.com/ymurao2)です!
LazyVGrid内で、画像のアスペクト比を保ったまま画像の枠の比率を指定したい!ただ、frame指定はやりたくない!という状況に陥り、実装に手こずったので備忘録として残しておきます!

# 想定する画面
以下のようなデザインを想定しています。
* 画像のアスペクト比は1:1
* 画像の枠のアスペクト比は2:1(横:縦 = 2:1)
* 見切れるのは構わない → scaleはfill

* 使用する画像はこちら
* かわいい
RenovateがPRを出してくれない場合の対処法

個人開発しているアプリにRenovateを導入しましたが、なぜかOnboardingのPRが作成されませんでした。そこで今回は、RenovateがPRを出してくれない場合の対処法についてご紹介します。

# 対処法

https://developer.mend.io/

にアクセスし、Renovateを有効にしたいオーガナイゼーションを指定します。

![スクリーンショット 2023-11-29 20.42.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627061/f577457c-4158-e805-65cf-e3c92d355423.png)

次に、設定をクリックします。

![スクリーンショット 2023-11-29 20.45.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627061/69668146-5208-00d4-c1ed-cac57c26c871.png)

そしたらModeをI

元記事を表示

【ios 17】音声アシスタントとai機能の進展

## siriの新機能と自然な対話能力の向上

siriは、iosデバイスの音声アシスタントとして非常に便利な機能です。しかし、ios 17ではsiriの機能がさらに進化し、より自然な対話が可能になりました。たとえば、siriはあなたの声のトーンや感情を検出し、適切に応答することができます。

以下は、siriの新機能を使ったサンプルコードです。

“`
func startconversation() {
let speechrecognizer = speechrecognizer()
let speechsynthesizer = speechsynthesizer()

// 話しかけるユーザーの声を検出する
let uservoice = speechrecognizer.listen()

// ユーザーの声のトーンや感情を分析する
let toneanalyzer = toneanalyzer()
let usertone = toneanalyzer.analyze(uservoice)

// 応答する

元記事を表示

ID by amoのアプリを閉じる挙動を再現

ID by amoにて新着通知を全て確認し終わると、「おわり!」「そっちでも楽しんでね」などのメッセージと共にアプリが終了する

https://scrapbox.io/files/6566b2e4698aa20023c35fd8.mov

これをSwiftでやるには任意の場所で以下を実行する
“`Swift
UIControl().sendAction(#selector(URLSessionTask.suspend), to: UIApplication.shared, for: nil)
Timer.scheduledTimer(withTimeInterval: 0.2, repeats: false) { _ in
exit(0)
}
“`

> ホーム画面に戻る
“`Swift
UIControl().sendAction(#selector(URLSessionTask.suspend), to: UIApplication.shared, for: nil)
“`

`exit(0)`はCの標準ライブラリに存在する関数
 プログラムを正常終了させるもの

元記事を表示

【ios 17】カメラと写真機能の進化

## 新たなカメラ機能と写真撮影のクオリティ向上

こんにちは。今回は、ios 17について初心者エンジニアに向けて、新たなカメラ機能と写真撮影のクオリティ向上についてご紹介します。

ios 17では、カメラ機能がさらに進化し、写真をより美しく鮮明に撮影することができるようになりました。これにより、ユーザーはより高品質な写真を撮影し、思い出をより美しく残すことができます。

具体的には、画質向上や低光環境での撮影の向上など、さまざまな機能が強化されています。カメラの起動が速くなり、被写体の動きによるブレやノイズを少なくすることができます。また、デュアルカメラ搭載の機種では、より広い範囲を撮影することができるようになりました。

以下に、新たなカメラ機能と写真撮影のクオリティ向上に関するサンプルコードを示します。

“`swift
import uikit
import avfoundation

class cameraviewcontroller: uiviewcontroller, avcapturephotocapturedelegate {

var capture

元記事を表示

【Swift】いつも忘れるif let

# 目次
[1.いつも忘れるif letの役割](#1-いつも忘れるifletの役割)
[2.実例](#2-実例)
[3.おわりに](#3-おわりに)

# 1. いつも忘れるif letの役割
私だけかもしれませんが、“`if let ~“`は何しているんだっけ? となります。
本記事は“`if let ~ “`のイメージを心に刻み込むための記事です。

# 2. 実例
~~~swift:if let構文
if let people = friend {
peaple.name()
} else {
print(“no friends TT”)
}
~~~

これを以下のように読み替えてください。
~~~swift: if let構文読み替え
if peaple != nill {
let peaple = friend!
peaple.name()
} else {
print(“no friends TT”)
}
~~~

# 3. おわりに
swiftにおいて「nillを許容するかどうか」の“`

元記事を表示

【SwiftUI】MapKitでストリートビューのような機能を使用する

# はじめに
昨日に引き続き、iOS17以降のMapKitに関することを調べてみました。

https://qiita.com/SNQ-2001/items/23cdfa74f4d554d174b0

今回はGoogleマップでいう「ストリートビュー」をAppleMapを使用して実装します。

# サンプルアプリ
![Simulator Screen Recording – iPhone 15 – 2023-11-28 at 22.08.56.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/69162a45-f6b3-433b-366c-e26702f05fed.gif)

# 実装
“`swift
import SwiftUI
import MapKit

struct ContentView: View {
// 東京駅の座標
@State private var position: MapCameraPosition = .region(.init(

元記事を表示

Xcode15以降のローカライゼーション(多言語対応)

# 概要

iOSアプリのローカライゼーション(多言語対応)の効率的な開発方法を調べていたら、WWDC2023で発表されていた[Discover String Catalogs](https://developer.apple.com/videos/play/wwdc2023/10155)の内容が良さそうに見えたので自分用のメモも兼ねて投稿します。

なお、今までの多言語対応の方法は[こちら](https://developer.apple.com/documentation/Xcode/localization)に記載されています。

– – –
# 詳細

Xcode15よりも前のバージョンでローカライゼーションを対応しようと考えたとき、`String`ファイルと`STRINGDICT`ファイルに対応するワードを記載し、手作業で翻訳を追加する方法がメインでした。
この方法だと翻訳の抜け漏れがあるのをチェックするのが手間だというデメリットがありました。

2023年9月にリリースされたXcode

元記事を表示

【ios 17】新しいアプリケーションと統合機能

## 新機能「app connect」の活用方法

### 概要
ios 17では、新機能「app connect」が追加されました。この機能を活用することで、アプリケーション間のシームレスな連携とデータ共有が可能となります。初心者エンジニアの皆さんに向けて、app connectの活用方法を紹介します。

### 使い方
app connectを使うためには、まずアプリケーションのプロジェクトに以下のコードを追加する必要があります。

“`swift
import appconnect

class viewcontroller: uiviewcontroller {
override func viewdidload() {
super.viewdidload()

// app connectの初期化
appconnect.initialize(apikey: “your_api_key”)

// 他のアプリケーションとのデータ共有を設定
appconnect.enabledatashar

元記事を表示

OTHERカテゴリの最新記事