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

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

【Objective-C 】入門1 簡単なテキストを扱うクラス作成して基本を理解する

# はじめに
初めて、Objective-Cのコードを見たとき、呪文のようにしか見えずとても混乱しました。
C#(C++は少し)の経験はありSwiftの開発は比較的楽に出来たのですが、Objective-Cは難しく思えました。

iOSアプリのプロダクトでObjective-C実装されたものをコードリーディングするにあたり必要最低限のもの・理解すべきことを記載します。今回は、XCodeのコンソールアプリでテキスト(文字列)を扱うクラスを作成して簡単な例を紹介していきます。

今回の記事で、Objective-Cが少し特殊なだけであることを理解し開発の助力になればと思います。
(参考サイトがとてもわかりやすかったです。一部古い情報もありますがとても参考になる部分が多かったのでみて見てください。)

# 対象読者
– Objective-C 初心者の方!
– Objectiv-C に困惑している方!

# Objective-C がなぜ呪文に感じるのか
オブジェクト指向における文法の考えた方は、Java/C++ 流が一般的です。しかしObjective-Cは、SmallTalkという言語の

元記事を表示

【SwiftUI】カードみたいにコンテンツを表示をするときはGroupBoxを使うと便利だよ

## GroupBoxとは

今回は、SwiftUIの便利なViewのひとつ「GroupBox」を紹介します。

GroupBoxは意味のあるひとまとまりのコンテンツを視覚的にわかりやすく表示してくれるViewです。

言葉で説明するとわかりにくいので、Apple公式ドキュメントのサンプルをご覧ください。こちらのサンプルのように、カードのような見た目で表示してくれるコンポーネントです。
[GroupBox | Apple Developer Documentation](https://developer.apple.com/documentation/swiftui/groupbox)

![スクリーンショット 2024-10-29 14.46.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38924/fe0f970b-170f-3dbc-0a07-7a416f984213.png)

## GroupBoxを使ってみよう

こちらのサンプルはわたしがリリースした集中アプリのFocus Rai

元記事を表示

[Swift] DTMFクラス(プッシュ信号音再生)

DTMFとは、`Dual-Tone Multi-Frequency`の略で、プッシュホン回線で信号を送信する音声信号のこと。

高音と低音の4種類ずつの周波数の音を組み合わせて、下表に示す16種類の符号を表現する。

| 低音 \ 高音 | 1209Hz | 1336Hz | 1477Hz | 1633Hz |
|:-:|:-:|:-:|:-:|:-:|
| 697Hz | 1 | 2 | 3 | A |
| 770Hz | 4 | 5 | 6 | B |
| 852Hz | 7 | 8 | 9 | C |
| 941Hz | * | 0 | # | D |

・Pythonによる実装については、次のサイトで詳しく説明されています。

https://github.com/lambda-tech-club/DTMF-generator

・Swiftでの実装は、次のサイトに公開されています。これを参考に、次の DTMFクラス を作りました。

https://github.com/palmerc/DTMFSounds

“`swift: D

元記事を表示

[iOS] Network Activity Indicatorの今後

## Network Activity Indicatorとは?
![154_on_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/199826f1-49cb-d415-4dd1-3b1812c06ca3.png)
Status Barに通信中を表す`グルグル`を表示する機能です。

## Network Activity Indicatorの現状
– iOS13で`Deprecated`になっている。
– Touch ID機種でしか表示されない。

### iOS18で表示されなくなった模様
| | iOS | | | | |
| — | — | — | — | — | — |
| Device | 18.1 | 18.0 | 17.5 | 16.4 | 15.4 |
| iPhone SE 3rd | ***非表示*** | ***非表示*** | 表示 | 表示 | 表示 |
| iPhone SE 2nd | ***非表示*** | ***非表示**

元記事を表示

@Sendableなクロージャについて

# はじめに
swift concurrencyの対応をしている中で、以下のようなワーニングが出たので、その対応方針について検討していたら`@Senbable`なクロージャってなんだ?となったので調べてみました。

“`
Main actor-isolated property ‘completion’ can not be referenced from a Sendable closure; this is an error in the Swift 6 language mode
“`
まず上記のワーニングで怒られているのは、Sendableでないプロパティ’completion’がSendableなクロージャでキャプチャして参照してはいけないというものです。

# コードの内容
具体的なコードとしては以下です。

“`swift
@MainActor
class SingleSelectImagePickerWrapper: AssetPickable {

// MARK: – private property

private var completion: (R

元記事を表示

ショートカットアプリとHomePod miniで毎朝『今日は何の日?』を自動読み上げさせる

# 背景

Google Home mini を利用していたときは「今日は何の日?」機能で、その日の日付の過去の出来事を毎朝起床時間に自動読み上げさせていた。しかし、Home Pod mini に買い替えてからは同様の機能が見つからず…(Siriアホの子すぎる😥)。

個人的に好きな機能だったので、同様の機能をショートカットアプリとHome Pod miniで実現させた。

# 実装

## ショートカットアプリ

[別記事](https://qiita.com/howmuch515/items/fbc30fc7d9780a07642c)でショートカットアプリからPythonのコードを直接実行させる方法を示した。

今回はコード量が少々長くなっているのでGistにPythonコードをアップロードしておき、それを読み込むことにした。こうすることでPythonのコードをPC上で修正したり、差分管理できるメリットがある。

実装した結果は以下の通り。`curl -s` と sオプションを指定することでcurlコマンドの余計なログを出力しないようにした。

![7ED33C84-9357-

元記事を表示

JetBrains FleetでKMPを使ってみる

# Fleetとは
https://www.jetbrains.com/help/kotlin-multiplatform-dev/fleet.html
> Fleet は、あらゆる言語に対応した強力な開発ツールに変身できる、あらゆる言語に対応したコード エディターです。Kotlin Multiplatform に優れたエクスペリエンスを提供することを目指しています。最初のステップとして、Fleet は Kotlin Multiplatform を macOS に導入します。
Fleet を使用すると、Android、iOS、Web、デスクトップ プラットフォームを対象としたマルチプラットフォーム プロジェクトをすばやく開いて実行できます。Fleet のスマート モードは、適切なコード処理エンジンを自動的に選択します。
iOS をターゲットとする場合、プロジェクトで使用されるすべての言語でナビゲーション、リファクタリング、デバッグが利用できます。これにより、混合言語のコードベースの管理が容易になります。Fleet はすぐに使用できる状態で Swift を完全にサポートしているため、アプ

元記事を表示

CursorでiOSアプリを開発してみよう!ホットリロードもできちゃうよ!

## はじめに
アプリ開発にはCursorはあんまり関係ないかな〜。なんてったって我々にはXcodeがいますからね!という気持ちがあり、Cursorには触れてきていませんでした。

しかし、やっぱりAIの力を借りられるのなら借りたい!爆速開発したい!個人開発ももっと高速でやりたい!そう思いCursorでのモバイル開発の可能性を探りに行きました。

## Cursorとは
VSCodeライクなAIエディターです。普段VSCode使ってるよという人は移行しやすいと思います。

モバイルエンジニアズの我々はあまりVSCodeに馴染みがない人もいるかもしれません。でも初期設定時にAndroidStudioっぽくショートカットを設定することもできます。残念ながらXcodeは選択肢にありませんでした。

とりあえず触ってみる!くらいであれば無料なのでぜひ使ってみてください。
今回の記事で紹介する機能を使うのも無料で使えます。

https://www.cursor.com/

## Cursorの便利な機能
いろんな機能がありますが個人的にこれめちゃよい!と思ったものを紹介しておきます。

##

元記事を表示

携帯でPythonを使う

# iphoneでもpythonを使う!
iphoneのapp storeでpythonを検索するといくつか出てきますが、実はシェル環境をインストールするとpythonがついてきます。
なので
https://apps.apple.com/jp/app/a-shell/id1473805438
を入れればpythonインタープリタをシェルから起動できます。
pipでインストールされているライブラリも調べることが可能でエディタはvimが起動します。

# androidでもpythonを使う!
iphoneのa-shell同様にシェルが使えればpythonもついてきます。
androidではTermuxというアプリを使うとシェルが起動します。
https://play.google.com/store/apps/details?id=com.termux&hl=ja
こちらもvimが起動します。
pipで見ると拡張されたライブラリはありませんでした。

元記事を表示

【Swift】AVCaptureSession 公式ドキュメントのコードをコンパイルできるよう修正してみた

# はじめに
本記事では、Swiftの公式ドキュメント([AVCaptureSession](https://developer.apple.com/documentation/avfoundation/avcapturesession))記載のコードについて、
コンパイルできるよう修正する方法を解説します。

https://developer.apple.com/documentation/avfoundation/avcapturesession

# 開発環境
OS : macOS Sequoia 15.0.1
Xcode : Version 16.0

# 修正前のコード

以下は公式ドキュメント([AVCaptureSession](https://developer.apple.com/documentation/avfoundation/avcapturesession))に記載されているコードです。

“`swift:
// Create the capture session.
let captureSession = AVCaptureSession()

/

元記事を表示

【Flutter】error: type ‘UIApplication’ does not conform to protocol ‘Launcher’の対応

## はじめに
最近、macOSを `Sonoma 14.6.1` から `Sequoia 15.0.1` にアップデートしました。
新しい macOS Sequoia 15.0 以降では Xcode 16.0 以上が必須とのことだったので、Xcodeも `15.3` から `16.0` にアップデートしました。

しかし、このアップデート後に iOSでタイトルにあるビルドエラーが発生したので、その解決方法を共有します。

## 環境
macOS Sequoia 15.0.1
Xcode 16.0
Flutter 3.24.0
ライブラリ:`url_launcher: 6.2.6`を使用

https://pub.dev/packages/url_launcher

## エラー内容
何やら`error: type ‘UIApplication’ does not conform to protocol ‘Launcher’`と怒られている。
“`
Launching lib/main.dart on ******のiPhone in release mode…
Automati

元記事を表示

【Flutter】dart-define-from-fileの環境変数をAppDelegate.swiftで使う

## 環境
Flutter 3.19.6
Dart 3.3.4
M2 mac Sonoma 14.5
xcode Version 15.3

## 課題

どうしてもアプリ起動時にAppdelegate.swiftにdart-define-from-fileで定義している環境変数を渡したかった。ただし.envとか使った方が圧倒的に楽そうではある。

↓この記事が非常に参考になった。chatGPTが相決してくれなかったことを解決してくれた。AIばっかりに頼っていてはいけないかもしれない。

https://qiita.com/nonoik/items/0c676a278558a1ee3ebc#%E4%BD%9C%E3%82%8B%E3%82%82%E3%81%AE%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

## 解決方法

/libディレクトリ内の任意の場所に環境変数の橋渡しをするためのファイルを作る(別にmain.dartに直接書いても構わない)。
`MethodChannel()`には任意の文字列を渡す。これはAppDelegateでも同じ文字列

元記事を表示

歴5年のバックエンドエンジニアが初めてiOSアプリを作成・公開して、一ヶ月経った収益がこちらw w w w w w w w w w w w w w

前回の記事からの続きです↓
『歴5年のバックエンドエンジニアが初めてiOSアプリを作成・公開して、一週間経った収益を公開する。』
https://qiita.com/hallelujah_8475/items/0d2ebd776f2ea14fcd40

私は普段フリーランスでGoのバックエンドエンジニアをやっています。

## 結論:point_up:
![スクリーンショット 2024-10-23 20.07.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455017/c8e5c693-6998-32d0-edcf-1c45efea28b4.png)

![スクリーンショット 2024-10-23 20.06.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455017/229cc259-4844-eac7-1811-0677898f083a.png)

![image.png](https://qiita-i

元記事を表示

iPhoneのChromeでフォーム送信がうまくいかない場合の解決方法

## iPhoneのChromeでフォーム送信がうまくいかない場合の解決方法

iPhoneのChromeで、フォーム送信時に正しい画面遷移が行われない問題に対して、主な原因としてキャッシュの影響やJavaScriptの処理タイミングの問題が考えられます。この記事では、その具体的な解決方法を2つの観点から紹介します。

### 1. キャッシュの無効化

iPhoneのブラウザは、ページやフォームのキャッシュを保存してしまい、予期せぬ動作を引き起こすことがあります。特に、フォーム送信後にキャッシュされた内容が原因で、正しい画面遷移が行われないことがあります。これを防ぐために、以下の対策を行うことが推奨されます。

#### HTTPヘッダーでのキャッシュ制御
サーバー側でHTTPヘッダーを設定することで、ブラウザにキャッシュを使わないよう指示できます。以下のヘッダーを設定しましょう。

– `Cache-Control: no-store, no-cache, must-revalidate, max-age=0`
– `Pragma: no-cache`
– `Expires: 0`

元記事を表示

SwiftでEnumとSwitchを使って条件分岐をシンプルに!〜フルーツとエラーコードの実用例〜

### 概要
現場のリーダーからSwiftのenumとswitchは、条件分岐をシンプルかつわかりやすく記述するのに最適なツールだからしっかり使おう!との指摘がいただいたので今回は、果物の種類(半分ネタ)を処理する場合と、エラーコードを処理(半分本気)する場合の2つのシチュエーションに焦点を当てて、それぞれの実用例を紹介します。

フルーツコードをenumで処理し、対応する名前を返す。
エラーコードをenumで処理し、対応するエラーメッセージを返す。
これにより、条件分岐が複雑になりがちな場面でも、enumとswitchを使ってシンプルに記述できるようになります。

#### 1. フルーツコードを処理する
コード例
フルーツのコード値を受け取り、それに応じた果物の名前を返す例です。

“`swift
import Foundation

// 果物の種類を表すenum
enum Fruit: Int {
case apple = 1
case banana = 2
case orange = 3
case unknown // 該当しない場合
}

元記事を表示

Swiftで関数をペアにしてスタック処理をシミュレートしてみた

### 概要
Swiftで関数をペアで扱い、スタックのような操作をシミュレートする方法を紹介します。特に、追加や削除、生成や消費といった操作を1対1で設計することで、コードの整合性や管理がしやすくなることを目的としています。

今回は「果物を育てる」から「果物を売る・食べる」といった具体的なシチュエーションを使って、関数の対になる動作をわかりやすく表現してみました。

### 背景
あるプロジェクトで、関数を1対1で設計するように指示がありました。例えば、リソースを「追加する」関数がある場合、その逆の操作(「削除する」)も用意するという指針です。

このアイデアを応用して、ビジネスや生活の中で行われる動作(育てる、卸す、売る、食べる)を関数でペアリングし、スタックのような流れでシミュレーションしてみます。

### 実装例
#### 1. FruitManagerクラス
以下が果物を管理するクラスFruitManagerです。このクラスでは、果物を育てたり、卸したり、売ったり、食べたりする操作ができます。それぞれの操作は対になる形で関数が存在しており、スタックのように順に処理されます。

元記事を表示

SwiftUIのAnimationについてふわっと学ぶ(phaseAnimator編)

# はじめに
今回はWWDC2023の以下動画で見たphaseAnimatorについて実際に触ってキャッチアップしてみました。

https://developer.apple.com/jp/videos/play/wwdc2023/10157/

普段SwiftUIでAnimationを付与するときは、withAnimationでanimatableなmodifierの値を変更するなどして行うのですが、そういった方法とは少しやり方が違いそうです。

https://qiita.com/stotic-dev/items/9449981afe9b20077c3e

早速みていきましょう。

# phaseAnimatorとは
まずは公式のドキュメントを見てみます。

>アニメーション内の個別のステップを定義する、提供されたフェーズのコレクションを自動的に循環させることでコンテンツをアニメーション化するコンテナー。
>
>概要
アプリで段階的なアニメーションを作成するには、フェーズ アニメーター ビュー モディファイアのいずれかを使用します。phaseAnimator(_:content:

元記事を表示

[Swift] Duration 型、Stopwatch クラス

# はじめに

みなさんは、[`Duration`](https://developer.apple.com/documentation/swift/duration/)型 をご存知でしょうか?
自分は、つい先日、初めて知りました(後述する Stopwatch クラスを作る際に、たまたま見つけた)。
iOS 16.0 から、macOS 13.0 からサポートされた 新しい型で、[`TimeInterval`](https://developer.apple.com/documentation/foundation/timeinterval/)型を**超高精度**にしたような型となっています。

# `TimeInterval`型とは

おさらいになりますが、

[`TimeInterval`](https://developer.apple.com/documentation/foundation/timeinterval/)型の実態は、単なる[`Double`](https://developer.apple.com/documentation/swift/double)型です。

元記事を表示

Fletによる実機テスト

# Fletで開発すると・・・
実機テストも簡単に行える。
対象は、iOS、android、webブラウザ、デスクトップアプリ(Windows、Linux)
なんでもありでした。

# Android版Fletアプリ
以下のアドレスから、Android端末にアプリを入れる
https://play.google.com/store/apps/details?id=com.appveyor.flet&hl=ja

Flet run appname –android
で起動すると、接続先へのQRが表示されるのでAndroid端末でURLを読み取るとAndroid用のFletアプリが起動される。

# iOSアプリ版Fletアプリ
以下のアドレスから、iOS用アプリを入れる
https://apps.apple.com/us/app/flet/id1624979699

Flet run appname –ios
で起動すると、接続先へのQRが表示されるのでiOS端末でURLを読み取るとiOSアプリ用のFletが起動される。

# ブラウザ
特に何もいらない!
Flet run app

元記事を表示

[Flutter]多言語化対応で、アプリをグローバル化しよう!

## 概要
少々大袈裟なタイトルですが・・・
どうせアプリをリリースするなら、日本だけでなく世界中の方に使ってもらいたいですよね!

Flutterは、多言語対応を容易に行うことができます!
ユーザーの言語設定に応じた表示が可能になるということです。

本記事では、Flutterアプリを日本語、英語、中国語
に対応させるための具体的な手順を解説します!

### サンプル(日本語)

![スクリーンショット 2024-10-20 19.09.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945342/99df716e-034e-f29a-f061-0cb25eb8729d.png)

### サンプル(英語)

![スクリーンショット 2024-10-20 19.09.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945342/a80a4cbf-3fb5-2cb2-dc59-8012fbabad29.png)

元記事を表示

OTHERカテゴリの最新記事