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

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

【個人開発】歩数計アプリ「StepSnap」をリリース!

## はじめに
こんにちは、sin3 です。本業は大阪にあるスタートアップでWebエンジニアをしています。
主にバックエンドの開発を担当し、Javaをメイン言語として使用しています。
最近は、より効果的なシステム構築のためにドメイン駆動設計(DDD)の学習にも取り組んでいます。

趣味としてスマホアプリの開発をしていて、先日「StepSnap」というアプリをリリースしたので紹介させていただきます。

https://apps.apple.com/jp/app/stepsnap/id6475646106

## 「StepSnap」とは?

「StepSnap」は、日々の歩数や移動距離を簡単にトラッキングできる歩数計アプリです。歩数等の情報はiOSのヘルスケアから取得し、見やすいUIで表示します。サーバーを利用せず、アプリ単体で完結するため、プライバシーにも配慮しています。

## 主な機能

– **日々の歩数の記録と表示**
– 日々の歩数を自動で記録し、グラフで表示します
– 時系列で累積歩数を表示しているので1日の歩数の推移が見えます

– **カレンダー形式で歩

元記事を表示

WWDC 2023: SwiftUIパフォーマンスを劇的に改善するObservationフレームワークの全貌

# はじめに
WWDC 2023で、AppleはSwift標準ライブラリの新しいメンバーであるObservationフレームワークを紹介しました。このフレームワークは、長年にわたって開発者が直面してきたSwiftUIのビューの無効な更新問題を緩和することを目的としています。

# Observationフレームワークの必要性
Swift 5.9以前は、Appleは開発者に対して参照型のプロパティ変更を効率的に観察するための統一された仕組みを提供していませんでした。KVOはNSObjectのサブクラスに限定され、Combineはプロパティレベルの精密な観察を提供できず、いずれもクロスプラットフォームのサポートが不十分でした。

さらにObservableObjectプロトコルに基づいて実装されています。これにより、不必要なビューの更新が多発し、SwiftUIアプリのパフォーマンスに影響を与えていました。

これらの制限を改善するために、Swift 5.9でObservationフレームワークが導入されました。

## ObservableObjectの観察

ObservableOb

元記事を表示

子育て中でも勉強も開発もやる

![couple_baby_dakko.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346608/c69b18d3-9d74-d933-e4ef-26358d2843b4.png)

# 子育てはやっぱり大変
子育てをしていると幸せなこともたくさんありますが、とにかく時間がかかります。子育て中の誰に聞いても「思ったより大変」と言います。

現代は核家族化がかなり進んでいて、夫婦以外のヘルプを得られる環境はかなり減ってきていますし、「子育て中に勉強なんてできない」と嘆いておられる方も多く見受けられます。現在子育て中でなくても、子育てをすればそうなると思っておられる方も多いと思います。

# 本記事で伝えたいこと
私はアラサーの男で、現在2歳と0歳の子育て中です。Web系の企業でソフトウェアエンジニアをやっています。BEメインでやってきましたが、Web FEもそれなりにやってきました。スマートフォンアプリケーション開発は仕事ではやったことがありませんでしたが、子育てと仕事の合間を縫って、まずはFlutt

元記事を表示

SwiftTestingで例外処理をテストする

## エラーがthrowされることをテストする

“`swift
@Suite final class SampleTests {
@Test func throwErrorTest() throws {
// なにかしらのエラーがthrowされることをテスト
#expect(throws: (any Error).self) {
try sample()
}

// SampleTestErrorがthrowされることをテスト
#expect(throws: SampleTestError.self) {
try sample()
}

// SampleTestError.hogehogeがthrowされることをテスト
#expect(throws: SampleTestError.hogehoge) {
try sample()
}
}
}

元記事を表示

App Store審査却下😱AI機能搭載アプリは中国で配信規制があるらしい

## はじめに
弊社では、自社プロダクトのスマホアプリをApp StoreとGoogle Playにて公開しています。
先日、最新バージョンのリリースをApp Storeに申請したところ、審査が却下されてしまいました😱
その原因と対策を紹介します。

## 審査が却下された原因
メールから、「**Guideline 5 – Legal**」に引っかかってしまったようです😱

英語でいろいろ書いてありましたが簡単にまとめるとこんな感じ。
> 中国政府はディープシンセシス技術(DST)や生成AIサービス(ChatGPTを含む)に関する規制を強化しているよ。これらのサービスを中国で運営するには、工業情報化部(MIIT)からのライセンス取得を含む許可要件を満たさなあかんで!

> 対応オプションは以下の通りや!
> 1. 必要な変更を行い、AI機能を削除したことを確認して再提出する。
> 2. 中国での配信を希望しない場合は、App Store Connectの設定で中国本土の選択を解除する。
> 3. すでに法令を遵守していると考える場合は、追加情報を提供して返信する。

知らなかったねー!

元記事を表示

リリース作業のしくじり

# はじめに
結論から言うと、以下二3点となります。
①リリース作業は業界一年目にやらせるなよw
②ちゃんとダブルチェックはやろうね
③ちゃんと使用している公式アナウンスはチェックしようね

IT業界20年近いですが、なんだかんだずーーっとリリース作業に関わってます。
その経験について少々話します。

とは言っても、あまりにも基本的なことしか記載しません。。
リリース作業の工夫とかテクニカルな記事では一切ございませんので、あしからず。

# 最初の仕事でやらかすリリースミス
業界最初にやったのがリリース作業でした。

今考えると正気の沙汰では無いですが、
客曰くやらせることがなかったから取り敢えずリリース作業を割り振ってみたw
だった気がします。

どうなったかというと、**案の定リリースミスを起こしましたorz**。
エンドの客に納品するソースコードのビルドが通らないと。。

ハッキリ言って渡された手順書もイケてなかったし、ダブルチェックもほとんどしない状態で納品物のまとめ作業も私が担当。。

作業を振る側もどうかと思いますが、振られた私も文句言えなかった私が悪いと言えば悪い。。

元記事を表示

【iOS】URLのInitializerの仕様がiOS17から変更されていた

# 事の経緯
あるとき、URLの初期化が絡んだUTのケースでテストが失敗するようになった。
しかし、該当する実装はいじっていない。
謎挙動だ。。

でも影響してないからヨシ!としてしばらく目を背けていました。
これにちゃんと向き合って深ぼってみたよという話です。

# 問題
テストコードを簡単に作ってみました。
“`swift
import UIKit

func test() {
let path = “https://www.google.com/”

guard let url = URL(string: path) else {
print(“nil”)
return
}

print(url) // https://www.google.com/
}

test()
“`

これは正常系なので期待値は想定通り。

次に、本来URLに渡したら値を返さないはずの値を入れてみました。
“`swift
//let path = “https://www.google.com/”
let path1 = “^-^”

元記事を表示

やさしい @MainActor

## はじめに
多くのUIフレームワークがそうであるように、UIKit・SwiftUIといったAppleプラットフォームのUIフレームワークでは、UIの更新処理をメインスレッドで行う必要があります。

そのため開発者は、どのスレッドでコードが動作するのかを注意深く確認しながらUIの更新処理を実装しなければなりません。しかし、それはとても難しいことです。

そのソリューションとなるのが `@MainActor` です。この記事では `@MainActor` が解決する課題を明確にし、`@MainActor` が私たちにもたらしてくれる恩恵についてやさしく理解できるようにします。

::: note
この記事は出てくるSwiftコードは Xcode 15.4 (Swift 5.9)で実行しビルドおよび動作させています。また、その結果を掲載しています。
:::

## `@MainActor`登場前のUI更新の課題
`@MainActor` 登場までの課題を再確認するために、次のようなUIKitのコードを例にします。`fetchTodo(id:)` 関数はバックグランドスレッドでTODOデー

元記事を表示

R.Swift使い方とエラー対応方法について忘れないように

R.Swiftの導入と使い方で詰まることが多かったので、参考にした記事と共に備忘録として書きます。

## 導入方法と使い方
– https://mama-lifestyle.jp/swift-dev-jp/rswift/
Localizable.stringsファイルを使用した文字列撲滅方法について、ファイルの作り方から、使用方法まで具体的に書かれている。
– https://qiita.com/m_rn/items/7c73d77e07ee7bd484cb
R.Swiftの導入方法について具体的に書かれている。
この記事で画像と色はAssetsに追加すれば使えるんだなと分かりました。

## R.SWiftの利点と仕組み
– https://dev.classmethod.jp/articles/r-swift-introduction/
上記の記事から引用します。下記の通り記載されています。
“`markdown
プロジェクトがビルドされるたびに、
このR.generated.swiftファイルの中にリソースファイルへのアクセスが構造体として定義されて、
それによって型指定によ

元記事を表示

ユニバーサルリンクの設定とリダイレクトに関するトラブルシューティング

## はじめに

最近、iOSアプリにユニバーサルリンクを設定しました。その中で、理解をブラッシュアップすることができたので、記事に残したいと思います。

## ユニバーサルリンクとは?

ユニバーサルリンクは、特定のURLにアクセスするとiOSアプリを直接開くことができる機能のようです。アプリがインストールされているかどうかに関係なく機能するという解説をよく見かけます。一見、開発者が意識することなく、そのような設定ができると思われますが、アプリのインストール状態に応じた仕掛けを作る必要があるようでした。

## 設定プロセス

ユニバーサルリンクの設定プロセスをざっと記載します。

### 1. アプリのAssociated Domains設定

Xcodeにて、Associated DomainsのCapabilitiesを有効にし、ユニバーサルリンクで使用するドメインを追加します。

例: applinks:mydomain.com

※もしかすると、Apple DeveloperのCertificates, Identifiers & Profilesの画面でもAssocia

元記事を表示

iOSアプリのリリースで躓いたこと・・

# 概要
実務ではともかく、個人的にモバイルアプリをリリースするのが初めての際
躓いたことが多かったです。
この記事では躓いたことの備忘録として記録しています。
(一部愚痴みたいにもなってますが・・・)

皆さんがリリースする時は色々躓かないよう、この記事が
役立てば嬉しいです!

# Apple Developer Programで躓いたこと
まずは「Apple Developer Program」に登録することになりますが、
登録するだけで私は1週間かかりました。。

まずはそこで躓いた点のご紹介です!

https://developer.apple.com/jp/programs/

## Webで登録すると上手く行かなかった
下の画像の通り、Webで登録するのが当たり前かのように
誘導されますが、私の場合Webで登録すると上手くいきませんでした。

![ios-ble-7-7-1200×610.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945342/ba3125b2-bf69-a08c-3

元記事を表示

SwiftUIのTextEditor/TextFieldとキーボードとの間隔を調整

# SwiftUIのTextEditor/TextFieldとキーボードとの間隔を調整する

SwiftUIでTextEditorやTextFieldは、フォーカスが当たると自動でキーボードを避けて上に持ち上がります
デフォルトだとTextEditorやTextFieldのコンポーネントの底部とキーボードの上部には隙間がありません
このコンポーネントの底部とキーボードの上部を隙間を調整しようとした際に、思いの外ハマったので備忘録です

| デフォルト | 期待動作 |
| :-: | :-: |
| ![image 89.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214313/3e408dfe-0dbd-45d4-44a5-8830c2ffbb83.png) | ![Frame 298.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214313/bb826f5f-cf91-4ffd-5a66-edd3b46217ea

元記事を表示

iOS17でPHPhotoLibrary.authorizationStatusの結果が変わっていた話

# iOS17でPHPhotoLibrary.authorizationStatusの結果が変わっていた話
iOS17から写真へのアクセスの権限が **「選択した写真」** から **「制限付きアクセス」** に変更されました
この変更に伴いPHPhotoLibrary.authorizationStatusの結果が一部変わっていた話です
小さい変更なので、ほとんどのアプリは影響を受けていない印象です

# 変わっていた箇所
`PHPhotoLibrary.authorizationStatus(for: .addOnly)` の結果が
* iOS16の **「選択した写真」** の場合、 **.limited** だったのに対して
* iOS17の **「制限付きアクセス」** の場合、 **.authorized** に変わっています

他の権限の「フルアクセス(旧すべての写真)」や「写真の追加のみ」、「なし」の場合、`PHPhotoLibrary.requestAuthorization(for: .readWrite)` で権限確認した場合の結果に変更はありませんでした
また

元記事を表示

【Xcode/Swift】たかがログ、されどログ、素晴らしきos.Logger

# はじめに
iOS(Swift)では複数ログ出力する方法がある。
最新バージョンのXcodeを使用して検証してみようと思う。

# 前提
| 項目 | 内容 |
|:-:|:-:|
| Mac OS | Sonoma 14.5 |
| Xcode | 15.4 |
|使用言語 | Swift (バージョンは5) |

# 結論
いきなりですが、ログ出力はos.Loggerを使ってください!!
これが便利すぎるので、他のログ出力メソッドは使う必要ありません:thumbsup:

# ログの種類
## print
 昔からあるシンプルなログ出力メソッド。
 タイムスタンプは自動では出力されないが、他言語と同じ使い方で出力可能。

## NSLog
 これも思いっきり昔からあるログ出力メソッド。
 自動でタイムスタンプが出力される。

## debugPrint
 これもシンプルなログ出力メソッドで、Debug時の効率が良い(らしい)

## os.Logger
 勝ち、圧倒的勝利、便利すぎる。
 Xcode15からoslo

元記事を表示

【SwiftData】SwiftDataプロジェクトのテンプレートを解説する

# この記事は何?

XcodeのiOSプロジェクトについて、ストレージ設定で「SwiftData」を選択した際のテンプレートコードを解説する。

> Swiftを基礎から学ぶには
自著、工学社より発売中の「[まるごと分かるSwiftプログラミング](https://amzn.asia/d/7YPWJwl)」をお勧めします。変数、関数、フロー制御構文、データ構造はもちろん、構造体からクロージャ、エクステンション、プロトコル、クロージャまでを基礎からわかりやすく解説しています。
> また、Swiftプログラミングを基礎から動画で学びたい方には、Udemyコース「[今日からはじめるプログラミング](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwii1qTuj_2BAxV4hlYBHbj5BqEQFnoECBYQAQ&url=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fstart-programming-today%2F&usg

元記事を表示

【SwiftData】Query with dynamic properties in a View

結果を表示する子 View にて。

“`swift
struct UserListView: View {
@Query var users: [User]

init(sort: SortDescriptor) {
_users = Query(sort: [sort])
“`
こういうことですか。

# 🧑🏻‍💻 参考

【SwiftData】@Query の検索条件や並び順を変更する

元記事を表示

【CreateML】画像分類モデルを作成して、bravesoftキャラクター画像分類アプリ作成してみた!

初めまして!
bravesoft株式会社でiOSエンジニアをしている永井です。

最近、Visionフレームワークに触る機会があり、機械学習機能は「面白い!」と個人的になりました。もっと追求するべく、Appleの機械学習から画像分類というのを見つけたので今回は「CreateML」についてのモデル作成からアプリの組み込み/実装までの記事となります。

この記事では、bravesoftの自社開発にあるキャラクターを分類していきます。

## この記事で得られるもの
・CreateMLの基礎知識
・画像分類モデルについて
・モデルの作成方法
・モデルのアプリ組み込み

## CreateMLとは
macOS向けに開発された機械学習モデル構築フレームワークです。GUIベースのツールで、テキスト分類や画像分類や音声分類などのタスクを簡単に実行できます。Swiftとのシームレスな統合が特徴で、最適化されたモデルを生成し、Core MLでの統合も容易で作成したアプリに簡単に組み込むことが可能です。

公式サイト
https://developer.apple.com/jp/machine-lear

元記事を表示

Flutter案件待ち間の冒険:アプリ模倣チャレンジ – 第1章「時計」アプリ 世界時計編

## 世界時計のヘッダーを作ってみよう!
まずは世界時計の顔となるヘッダー部分から攻略開始だ!

![スクリーンショット 2024-06-21 11.13.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147814/4b9e9fb7-c6b6-5979-cd87-964a48109561.png)

### スクロールで現れるタイトル
iPhoneのデフォルトアプリと同様に、ヘッダーのタイトルはスクロールに応じて表示されるように実装したぞ!
![Jun-21-2024 11-19-14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147814/b6e8f3cb-6d9b-4c45-12fd-791c26061031.gif)

### ボタン配置で迷宮入り!?
ヘッダーにボタンを配置するのも一苦労だったんだ。レイアウト調整はまるで迷宮をさまようよう…。でも、Flutterのレイアウトウィジェットを駆使して、な

元記事を表示

【CSS】一部のスマホで動画再生中に動画上の画像が見えなくなる問題の解決方法

ウェブページで動画を再生する際、一部のスマホでは、動画の上に配置した画像やボタンが見えなくなることがあります。この問題は、CSSの`transform`プロパティを使用して解決できました。

## 確認環境
– **デバイス**: iPhone X
– **ブラウザ**: Chrome、Safari

## 問題の概要

以下のようなHTMLとCSSを使用している場合、一部のスマホで動画を再生すると、動画の上に配置したロゴや音量ボタンが見えなくなることがあります。

これらのブラウザでは、特にiOSの仕様により、動画要素のレンダリングが他の要素と異なる方法で処理されるため、このような問題が発生するようです。

### HTML

“`html

元記事を表示

iOSにおける画面サイズとインターフェースのバリエーションを探る

### はじめに

iOSアプリ開発では、多様な画面サイズに対応する柔軟なインターフェース設計が重要です。

### 記事の目的

“wC”, “wR”, “hC”などの値に戸惑ったことはありませんか?この記事を読むと、Size Classの概念や、インターフェース設計での利用方法、そしてあらゆるデバイスで適応するユーザーインターフェースを作成するためのヒントを理解できるようになります。

### 概念

#### 1. Size Class

**Size Class**は、iOSで異なる画面サイズに対応するためのシステムです。画面サイズを次の2つの軸に分けて管理します:

– **横幅 (Width)**
– **縦幅 (Height)**

各軸には2つのタイプがあります:

– **Compact**: 小さいサイズ (例:縦向きのiPhone)
– **Regular**: 大きいサイズ (例:横向きのiPad)

例:横向きのiPadは、横幅と縦幅の両方がRegularなSize Classを持ちます。一方、縦向きのiPhoneは横幅がCompactで縦幅がRegularな

元記事を表示

OTHERカテゴリの最新記事