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

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

iOS17からLook Aroundの場所移動ができない不具合が解消された

# はじめに
少し前に、iOS16の新機能で紹介された`Look Around`をアプリに導入する機会がありました。
表題の通り、場所移動をする昨日に不具合があったのですが、それが`iOS17`になって解消されました。

同じように、開発しているアプリをiOS16対応していてうまくいかなくておかしいなぁと苦悩している方がいらっしゃったら何かの助けになるかもしれないと思い、今回記事にしています。

# Look Aroundとは
端的に言えばApple版の`Google Street View`のようなものです。
その名の通り、ある地点の周りを見渡して様子を把握することができる機能です。

Google Street Viewは料金コストがかかるのに対し、Look Aroundは**Apple標準の機能**でかつ**無料**で利用ができるので、これからLook Aroundをアプリに導入しようと考える人たちも増えてくるのではないでしょうか。

しかしまだ日本では、`政令指定都市+@`くらいの場所のみのサポートとなるので全国のサポートを想定している場合は注意が必要です。

# 作りたかった

元記事を表示

【Flutter】Integration Testを極めるためのテクニック集

# はじめに
Integration Testを実装していく中で最初に知っておきたかったと思ったことをまとめてみました。これまで実装してきた方やこれから実装する人にも参考になる情報があれば嬉しいです。

https://docs.flutter.dev/cookbook/testing/integration/introduction

ちなみに、Integration Testとは結合テストのことです。
ビルドしたアプリでテストを実行するので単体テストよりも実際の操作に近い環境でテストを実行できます。

# 1. ホットリスタートを使って実装する
テスト実装中は以下のコマンドで実行しましょう。

“`sh
flutter run -t integration_test/main_test.dart
“`

integration testの実行は、以下のコマンドで実行するように紹介されています。

“`sh
flutter test integration_test
“`

`test`コマンドで実行すると`ビルド`→`実行`→`終了`→`ビルド`→`実行`→`終了`のように

元記事を表示

【Swift】バージョンを比較したい

# はじめに
「バージョンアップしてください」的なアラートを出す際に、現在使用しているバージョンとストアにある最新バージョンを比較するという作業が必要です。
バージョンできるようにするための構造体を作成しましたので記録しておきます。

:::note warn
**注意**
セマンティックバージョニングのみ対応してます
:::

# 実装
“`SemanticVersion.swift
import Foundation

public struct SemanticVersion {
public let major: Int
public let minor: Int
public let patch: Int

public init(_ major: Int, _ minor: Int, _ patch: Int) {
self.major = major
self.minor = minor
self.patch = patch
}

public init?(_ string:

元記事を表示

XcodeからApp Store Connect の Test Flight へ アーカイブをアップロードする方法

## Xcodeを用いて直接TextFlight へアップロードする方法

### 1. Xcodeプロジェクトを開く:
Xcodeを起動し、アプリのプロジェクトを開く。

### 2. ビルド設定の確認:
プロジェクトを開いたら、`Runner`の`Target`を開いてアプリのビルド設定を確認します。設定が正しいことを確認してください。

### 3. アーカイブの作成:
Xcodeメニューの “Product” > “Archive” を選択して、アプリのアーカイブを作成します。アーカイブはビルドされたアプリのバイナリファイルです。

### 4. アーカイブの管理:
“”Window” > “Organizer”を開いて、作成したアーカイブを管理します。これは、Xcodeメニューの “Window” から “Organizer” を選択してアクセスできます。

### 5. アップロード:
Organizerで、作成したアーカイブを選択し、”Distribute App” ボタンをクリックします。

### 6. 配布オプションの選択:
配布オプション画面で、”App Stor

元記事を表示

【Swift】CIFilterで画像の色を反転させる

# はじめに
CIFilterで画像の色を反転させてみます

# サンプルアプリ
![Simulator Screen Recording – iPhone 15 – 2023-10-31 at 20.42.54.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/5d4d7a19-f41d-e56f-eb8f-88e6de6a2162.gif)

# 実装
“`swift
import SwiftUI

struct ContentView: View {
private let image = UIImage(named: “sample1”)!

@State private var uiImage: UIImage?

var body: some View {
ScrollView {
VStack {
if let uiImage {
Image

元記事を表示

【RxSwift】BehaviorRelayとPublishRelay

# 目次
[1.BehaviorRelayとPublishRelayの特徴](#1-BehaviorRelayとPublishRelayの特徴)
[2.実例](#2-BehaviorRelayとPublishRelayの違い)
[3.おわりに](#3-おわりに)

# 1. BehaviorRelayとPublishRelayの特徴
– BehaviorRelayとPublishRelaは.nextメソッドのみ流せる
– .errorと.completedが流れない
– .nextメソッドを流すには`.accept()`を使用する

# 2. BehaviorRelayとPublishRelayの違い

| |BehaviorRelay |PublishRelay |
|—|—|—|
|初期値の有無 |有 |無 |
|valueプロパティの有無 |有 |無 |
|現在値流しの有無 |有 |無 |

~~~swift:behaviorRelay基本形
var disposeBag = DisposeBag()
let behaviorRelay = B

元記事を表示

モバイルアプリのリリース毎の変化を一覧で確認

# 概要
モバイルアプリのリリースをした際に、**「最新のリリースが結果としてユーザーに良い体験を提供できているのか?」**、**「逆にリリースによってパフォーマンスや体験の悪化が発生していないか?」** など、リリース後に気になることは沢山あります。

New Relicの9月のアップデートで、モバイルアプリのバージョン視点で柔軟な傾向分析ができるようになったので画面を確認していきたいと思います。

:::note info
最新のアップデートの詳細はこちら。[New Relic アップデート(2023年9月)
](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202309 “New Relic アップデート(2023年9月)”)
:::

公式ガイドはこちらです。

https://docs.newrelic.com/jp/docs/mobile-monitoring/mobile-monitoring-ui/mobile-app-pages/version-trends-compare-user-adoption-me

元記事を表示

【SwiftUI】NavigationStackの戻るボタンをカスタマイズする

NavigationStackを使用して画面遷移を行う際、必ず左上に`< Back`というボタンが表示されます。このボタンをカスタマイズしてアプリの雰囲気に調和したデザインに変更したいと思います。 ![スクリーンショット 2023-10-31 0.47.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111542/44007fab-bd3f-48e9-b9f4-4bf267830e22.png) # NavigationStackで画面遷移を記述する シンプルに`FirstView`と`SecondView`を作成するとこんな感じです。 #### ソースコード ``` Swift: FirstView.swift struct FirstView: View { var body: some View { NavigationStack { VStack { Text("FirstView")

元記事を表示

SwiftUIとCombine: ObservableObjectの基本

Combine,ObservableObjectとかよく分からなかったのでメモします。

### SwiftUIとCombine: ObservableObjectの基本
#### SwiftUIとは?
SwiftUIは、SwiftによるネイティブUIの作成のための新しいフレームワークです。SwiftUIは、iOS、macOS、watchOS、そしてtvOS向けのアプリケーションのUIを簡単に構築することができます。

#### Combineとは?
Combineは、Swiftでの非同期プログラミングとストリームの処理をサポートするフレームワークです。Combineを使用すると、イベントやデータの流れをオブザーバブルなシーケンスとして扱い、変化に応じてUIを更新することができます。

#### ObservableObjectとは?
ObservableObjectはCombineフレームワークに属するプロトコルで、クラスのインスタンスの変更を監視可能にするものです。このプロトコルに従ったオブジェクトは、そのオブジェクト内で@Publishedプロパティラッパーがマークしたプロパティ

元記事を表示

iOSの各アーキテクチャサンプル(忘備録)

# はじめに

現在進行形で使っていないアーキテクチャのことは忘れてしまうので、(忘備録として、最近流行りの)簡単なTODOアプリを使って、iOSの各アーキテクチャごとのサンプルを作ってみました。

ソースコードは以下で公開しております。

https://github.com/YokohamaHori/ArchitectureSample

## 備考

各アーキテクチャがざっくりこんな感じというのが一目で分かるように、最小構成で1ファイルにまとめています。教科書的な記事ではございません。

## 対象となるアーキテクチャ

– MVC
– MVVM
– RxSwift
– RxSwift+MVVM
– Clean Architecture
– VIPER
– SwiftUI
– SwiftUI+MVVM
– TCA

## 各アーキテクチャの特徴

各アーキテクチャの特徴はChatGPTにまとめてもらいました。

1. **MVC (Model-View-Controller):**
– 最も基本的なiOSアーキテクチャ。
– アプリケーションを3つの主要なコンポー

元記事を表示

【storyboard】StackViewの中身の均等配置

# 目次
[1.StachViewの中身の均等配置とは?](#1-オプショナルバインディングとは?)
[2.実例](#2-シャドーイング)
[3.おわりに](#3-実例)

# 1. StachViewの中身の均等配置とは?
UIStackViewで中身を均等配置&スペースを開けたいことありませんか?
以下のイメージが今回のゴールです。
![スクリーンショット 2023-10-30 11.08.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534617/359b1656-6e13-0967-7466-9b23790c66b3.png)

# 2. 実践方法
1. UIStackViewを配置
1. Viewを3つStackViewの中に配置
1. Spacingに設定したい間隔の数値を入力
![スクリーンショット 2023-10-30 11.14.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353

元記事を表示

Tailscale CLI をjailbroken iOSで動かす

## はじめに
TailscaleはWireguardベースのVPNソフトウェアで、Windows, MacOS, LinuxやAndroidに公式で対応しています。もちろんiOSにも対応していますが、最低要求バージョンは15.0となっています。当方の環境はiPhoneX iOS14.3ですので、アプリは利用できません。よってソースからビルドしようというわけです。下記の手順は自己責任でお願いします。

## iOS向けにBuildは可能か
TailscaleはGo languageで書かれています。
READMEに従って
~~~
GOOS=darwin GOARCH=arm64 ./build_dist.sh tailscale.com/cmd/tailscale
GOOS=darwin GOARCH=arm64 ./build_dist.sh tailscale.com/cmd/tailscaled
~~~
ここでのポイントはMシリーズのMac向けにビルドすることです。

元記事を表示

【Xcode】シュミレーターを最前面に固定する

# はじめに
Twitterを見ているとめちゃくちゃ便利そうな機能を発見したので記事にしておきます。

https://x.com/pihero13/status/1718523502280716554?s=46

# やりかた
① 「Window」を選択します
② 「Stay On Top」を選択します
![スクリーンショット 2023-10-29 21.44.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/fc04e0dd-a42d-a798-8733-1109f3a668b9.png)

# おわり
ウインドウの切り替えめんどいんで、シュミレーターだけ最前面に固定できるのめっちゃいいですね

元記事を表示

CarPlay Navigation Appのナビ情報の扱い方

CarPlayでナビゲーション機能を実装する時の実装についてです。
Appleのガイドを読むとプロジェクト設定などはわかるのですが、実際にナビ情報を表示しようと思うとよくわからなかったのでまとめておきます。

## 参考資料

Appleのナビゲーションアプリのガイド

https://developer.apple.com/carplay/documentation/CarPlay-Navigation-App-Programming-Guide.pdf

Appleのサンプルコードを参考にしました。

https://developer.apple.com/documentation/carplay/integrating_carplay_with_your_navigation_app/

## ルート検索結果の表示
ルート検索を何かしらの方法で実行し、その結果をユーザーに示します。

![スクリーンショット 2023-10-29 17.07.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5

元記事を表示

SwiftでViTPoseのランタイムを書いたので精度を確認する

[先日作成した姿勢推定のコード](https://qiita.com/mbotsu/items/f1eb6dcd2b7da6489e35)の動作確認にval2017で精度を評価した。
精度の評価には[cocoapi](https://github.com/cocodataset/cocoapi/)に姿勢推定の結果を評価する[サンプルコード](https://github.com/cocodataset/cocoapi/blob/master/PythonAPI/pycocoEvalDemo.ipynb)があるので、評価データをJSONで出力するコードを実装した。

## データセットのダウンロード

今回は、val2017で評価したいので[COCO DATASET](https://cocodataset.org/#download)から下記の二つのデーターセットをダウンロードした。

– 2017 Val images [5K/1GB]
– 2017 Train/Val annotations [241MB]

## 評価用のJSONを作成するコードの実装

ダウンロードしたval

元記事を表示

値オブジェクトの魅力 〜 プリミティブ型を濫用しないで

最近、Modelの設計をちゃんと勉強したいなと思うようになり「[ドメイン駆動設計入門](https://www.shoeisha.co.jp/book/detail/9784798150727)」という本を読み始め、今は6章を読んでいるところです。 サンプルコードはC#で書かれていますが、とても分かりやすく、iOSを勉強している人にも是非オススメしたい一冊です。

特に、**2章** (主に2.5節) の **値オブジェクト** についての内容が勉強になったので、Swiftのコードを使って紹介します。

# 改善前
例えば、ToDoアプリのドメインモデルとして、以下のようなModelがあるとします。
“`swift
final class ToDo {
let id: String
private(set) var title: String

init(id: String, title: String) {
self.id = id
self.title = title
}

func cha

元記事を表示

【Swift】CIFilterを使用して画像をピクセル画像に変換する

# はじめに
CIFilterで画像をピクセル化することができるっぽいのでやってみました

# サンプルアプリ
![Simulator Screen Recording – iPhone 15 – 2023-10-28 at 20.32.34.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d6a3604c-ba56-e76e-9628-068c0fbebb3f.gif)

# 実装
“`swift
import SwiftUI

struct ContentView: View {
private let image = UIImage(named: “sample1”)!

@State private var uiImage: UIImage?

@State private var scale: CGFloat = 0

var body: some View {
ScrollView {
VStac

元記事を表示

【Swift】Protocol の命名規則について調査した

# はじめに

Swift でコードを書いていると Protocol を使う場面は多いですが、
Protocol にどのような名前をつけるべきか、今までよく悩んできました。

標準ライブラリでよく見られる「 `Equatable` 」や「 `Hashable` 」のような、
「 `**able` 」 Protocol はどういう時に定義すべきなのかも曖昧だったので、
一般的な命名パターンをある程度把握しておきたいと思いました。

そこで本記事では、一般的にどのように Protocol の命名がなされているのかを Web で調査して、自分なりに整理してみました。

## 公式ドキュメントの記述

[API Design Guidelines](https://www.swift.org/documentation/api-design-guidelines/) には、プロトコルの命名規則についてはそれほど多く語られておらず、
主な記述は以下の数行にまとめられています。

> * Protocols that describe what something is should read a

元記事を表示

FlutterでWebリンク、ユニバーサルリンク、アプリリンクを統一的に扱いたい

# 結論

“` dart
setUrlStrategy(PathUrlStrategy());
“`

を設定するとOK!

# やりたいこと

Flutterで `go_router` 等でルーティングすると、Webでは以下のようなURLになりますね。

“`
https://example.com/#/pages/1
“`

Flutter Webをホスティングし上記URLをクリックすると、URLがハンドリングされ `go_router` で設定したパスに飛びます。同一のFlutterアプリをモバイル向けに公開している場合、アプリインストール済の端末ではブラウザではなく、アプリ側で開いてほしいということがあります。

http[s]から始まるURLをアプリでハンドリングするには、iOSでは「universal link」、Androidでは「app link」という仕組みを利用する必要があります。
アプリリンクやユニバーサルリンクの設定方法については下記参照してください。Androidは `AndroidManifest.xml` 、 iOSは `info.plist`

元記事を表示

【Swift】CIFilterで画像の露出度を調整する

# はじめに
CIFilterで画像の露出度を調整してみます

# サンプルアプリ
![Simulator Screen Recording – iPhone 15 – 2023-10-27 at 21.48.56.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/3c32c2ce-b1ce-96b7-0656-409ed0971662.gif)

# 実装
“`swift
import SwiftUI

struct ContentView: View {
private let image = UIImage(named: “sample1”)!

@State private var uiImage: UIImage?

@State private var exposure: CGFloat = 0

var body: some View {
ScrollView {
VStack {

元記事を表示

OTHERカテゴリの最新記事