- 1. 元Flutter使い、現iOSプログラマが、Compose Multiplatformに入門してみた
- 2. iOSエミュレータの時間を変更する方法
- 3. iOS18でタブを押した際に画面がチラつく現象への対応
- 4. [Swift] AppStorageとUserDefaultsについて
- 5. [iOS] MKMapViewで2本指のみのgestureを許可する
- 6. Vanilla JavaScript はマルチプラットフォームの夢を見るか
- 7. [Swift]RxSwift×MVVM ホットペッパーAPIを利用したアプリを作ってみた Part 1
- 8. Xcodeのシミュレータで選択したい機種が表示されない件
- 9. 【iOS】Screen Time APIを使ったアプリを申請するときの落とし穴
- 10. 【Objective-C 】入門1 簡単なテキストを扱うクラス作成して基本を理解する
- 11. 【SwiftUI】カードみたいにコンテンツを表示をするときはGroupBoxを使うと便利だよ
- 12. [Swift] DTMFクラス(プッシュ信号音再生)
- 13. [iOS] Network Activity Indicatorの今後
- 14. @Sendableなクロージャについて
- 15. ショートカットアプリとHomePod miniで毎朝『今日は何の日?』を自動読み上げさせる
- 16. JetBrains FleetでKMPを使ってみる
- 17. CursorでiOSアプリを開発してみよう!ホットリロードもできちゃうよ!
- 18. 携帯でPythonを使う
- 19. 【Swift】AVCaptureSession 公式ドキュメントのコードをコンパイルできるよう修正してみた
- 20. 【Flutter】error: type ‘UIApplication’ does not conform to protocol ‘Launcher’の対応
元Flutter使い、現iOSプログラマが、Compose Multiplatformに入門してみた
# はじめに
以前Flutterを使っていた経験から、現在はSESとしてiOSプログラマをしている[uehatsu](https://x.com/uehatsu)です。ちょっとCompose Multiplatformをいじる必要が出てきたので、連休を機会にさわり始めました。メモがてらまとめてみたいと思います。
https://www.jetbrains.com/ja-jp/compose-multiplatform/
# 環境構築
公式ホームページ通りにやったところ大きな問題はありませんでした。あえて言うなら以下の点で「あれ?」と思いました。
– Xcode 16.1をインストールした状態ではAndroid Studio上でシミュレータが正しく選べなかったので、Xcode 16.0にしたこと
– kdoctorがAndroid Studioのバージョンを正しく認識してくれなかったこと
– kdoctorが「Android Studio上で`Kotlin Multiplatform Mobile Plugin`をインストールしろ」と言うけど、そんなプラグインはなく`Kotli
iOSエミュレータの時間を変更する方法
時間経過の処理をおこなった際に実装確認するため時間を変更する必要があると思います。
今回はエミュレータの時間を変更します。
Mac自体の時間を変更することでエミュレータの時間も変わります。
システム設定 → 一般 → 日付と時間 こちらの設定を変えると時間も変わります。
時間を変更したままだと、GoogleMeetがエラーになった為忘れず戻しましょう!
iOS18でタブを押した際に画面がチラつく現象への対応
# どうした
iOS18でUITabBarControllerで実装したタブをタップしたら、遷移時に画面が一瞬チラつくようになった。
NavigationBarの色も反転して見栄えが悪いので何とかしたい# 発生している環境
– Swift
– Xcode 16.0
– iOS18端末# 対応
UITabBarControllerDelegateを実装して、遷移時のアニメーションを無効化する“`Swift
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
// アニメーションだめー
UIView.setAnimationsEnabled(false)
return true
}func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UI
[Swift] AppStorageとUserDefaultsについて
## 1. AppStorageとUserDefaultsの概要
AppStorageは、SwiftUIで使える便利な仕組みで、@プロパティラッパーとして簡単にユーザーデフォルトにデータを保存したり読み込んだりできます。UserDefaultsを裏で使っているため、SwiftUIのコードがよりシンプルに書けます。UserDefaultsは、アプリ全体でKey-Valueの形でデータを保存できる仕組みです。アプリを再起動しても保存したデータを保持して、自動的に読み込むことができます。
つまり、AppStorageもUserDefaultsも基本的な機能は同じですが、AppStorageの方がSwiftUIと組み合わせて使うときにコードがスッキリするのが特徴です。
## 2. 基本データ型とサポート内容
**AppStorage**がサポートする基本データ型:
– **Bool、String、Data、Int、Double、URL**
– **RawRepresentable**に準拠し、RawValueが**String**または**Int**の型も保存可能**UserDef
[iOS] MKMapViewで2本指のみのgestureを許可する
## はじめに
iOSアプリ開発において、ScrollView内にViewを設置した場合、そのViewにgestureが奪われてしまい、ScrollViewがスクロールできなくなる現象はあるあるかな思います。
その対象のViewによって回避方法は異なると思いますが、MapKitの`MKMapView`の場合どのように対応すれば良いでしょうか。
いくつか解決策はありそうですが、今回は`GoogleMap`を参考に __2本指で行われたgestureのみを検知する方法__ でその問題を回避してみようと思いました。## 動作環境
Xcode 15.3
Swift 5
iOS 14+## 発生事例
まずは例として下記のようなViewがあるとします。“`swift: MultipleTouchMapViewController.swift
import UIKit
import MapKitfinal class MultipleTouchMapViewController: UIViewController {
private let mapView: MKMapVi
Vanilla JavaScript はマルチプラットフォームの夢を見るか
:::note info
本記事は [技術書典17](https://techbookfest.org/event/tbf17) で無料配布する同人誌「[ゆめみ大技林 ’24 (2)](https://techbookfest.org/product/kdUdfz8a1KZQJZvJxRVu8V)」の寄稿です。加筆や修正などがある場合はこの記事で行います。
:::私たちは Swift を利用して iOS、Kotlin を利用して Android のモバイルアプリを開発してきました。さらに昨今は Flutter、React Native そして KMP などマルチプラットフォーム技術を利用して開発する手段も一般的になりました。
今回はマルチプラットフォーム開発を、それらを利用せずに、挑戦します。iOS および Android で利用できるプログラミング言語には C++ や JavaScript があります。iOS アプリ開発の視点から Vanilla JavaScript を本当に導入できるのか、その使い心地はどうなのかを検証します。
本記事は [YUMEMI.grow Mobi
[Swift]RxSwift×MVVM ホットペッパーAPIを利用したアプリを作ってみた Part 1
# APIを利用した実装
引続きRxSwiftの実装をアウトプットしてます。
今回はホットペッパーAPIを利用してテキスト入力からキーワード検索を行い、情報をTableViewに表示させる実装を行いました。# 実装コード
実装したコードをファイル毎に区切り説明をしていきます。## ホットペッパーAPIを取得する手続き
ホットペッパーAPIを取得するためのURLは下記になり取得手順を記載します。
https://webservice.recruit.co.jp/doc/hotpepper/reference.html1. 遷移先の画面中腹にある新規登録からメール登録を行い、返信メールから承認URLをクリックします
2. 承認すると再度メールが届きますので、そこにAPIキーが記載されてますので利用します## GourmetResponseファイル
まずはModel側の実装です。ここでは実際に取得しView側で表示する必要のあるデータを定義していきます。今回であれば店名・住所・ジャンル・予算・収容人数・営業時間・URL・画像を取得したかったのでCodableで定義してます。
Xcodeのシミュレータで選択したい機種が表示されない件
# はじめに
iOS18にした後(正確な時期は定かでないが)Xcodeのシミュレータの機種を選択する際に一部機種が表示されなくなって、経験が浅い私は原因がわからず調べても解決方法が見つけられなかったので忘れないように偶然上手くいった解決方法を記録しておきます。
同じ様な方がもしいらっしゃった場合への手助けになればと思います。
# 症状
普段はiphone12miniを使用しておりシミュレータに見当たらない(「ワイphone12」というのは私の実機の名前なのでスルー…)
# 解決策
.xcodeprojet>General>iOSに行く
【iOS】Screen Time APIを使ったアプリを申請するときの落とし穴## Screen Time APIとは
Screen Time APIとは、iPhoneやiPadの設定アプリにあるスクリーンタイムの機能を開発者が使用するためのAPIです。
親が子どものiPhoneの使用制限をするペアレンタルコントロールに使用したり、アプリをどのくらい使用したかをチェックすることができます。WWDC21で、Screen Time APIとして開発者に開放されました。
[Screen Time APIについて – WWDC21 – ビデオ – Apple Developer](https://developer.apple.com/jp/videos/play/wwdc2021/10123/)そして、WWDC22では自分の端末の制限をコントロールする機能が追加されました。
[Screen Time APIの最新情報 – WWDC22 – ビデオ – Apple Developer](https://developer.apple.com/jp/videos/play/wwdc2022/110336/)詳しくは、WWDCのセッションをご覧ください。
ざっ
【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