- 1. [Swift]RxSwift×MVVM ホットペッパーAPIを利用したアプリを作ってみた Part 2
- 2. iOSアプリのライフサイクル (Life Cycle)
- 3. Flutterの基礎をまとめてみた(3)
- 4. Flutterの基礎をまとめてみた(2)
- 5. Flutterの基礎をまとめてみた(1)
- 6. 調査結果 AppleによるiOSアプリのレビューガイドラインについて
- 7. UISliderで作る、重なり合う画像のグラデーション効果
- 8. Swiftで作成したゲームに広告を入れる
- 9. 元Flutter使い、現iOSプログラマが、Compose Multiplatformに入門してみた
- 10. iOSエミュレータの時間を変更する方法
- 11. iOS18でタブを押した際に画面がチラつく現象への対応
- 12. [Swift] AppStorageとUserDefaultsについて
- 13. [iOS] MKMapViewで2本指のみのgestureを許可する
- 14. Vanilla JavaScript はマルチプラットフォームの夢を見るか
- 15. [Swift]RxSwift×MVVM ホットペッパーAPIを利用したアプリを作ってみた Part 1
- 16. Xcodeのシミュレータで選択したい機種が表示されない件
- 17. 【iOS】Screen Time APIを使ったアプリを申請するときの落とし穴
- 18. 【Objective-C 】入門1 簡単なテキストを扱うクラス作成して基本を理解する
- 19. 【SwiftUI】カードみたいにコンテンツを表示をするときはGroupBoxを使うと便利だよ
- 20. [Swift] DTMFクラス(プッシュ信号音再生)
[Swift]RxSwift×MVVM ホットペッパーAPIを利用したアプリを作ってみた Part 2
# ホットペッパーAPIの実装 Part2
今回は前回投稿したPart1の続きのホットペッパーAPIを利用したアプリのViewModel側の実装を紹介します。## ViewModelの実装コード
次回紹介しますが今回は`searchBar`と`tableView`をセットしたHomeViewと、ホットペッパーAPIで取得したデータを配置させるHomeCellでファイルを分けました。
このHomeViewとHomeCell各ファイルに対してViewModelを用意しました。View側ではUIパーツのバインドのみを行い、ロジックを持たせないことで、ViewとViewModelの責務が明確に分かれるようにしています。## HomeViewModel
HomeViewControllerにデータを加工して送る役割を担います。
ここではPart1で紹介したAPIデータを取得する処理を実装した`gourmetSearchRequest`を利用し、検索結果を表示させる仕組みを定義したファイルになります。searchGourmetメソッド内の流れを下記に記載します。
1. メソッドが走ると
iOSアプリのライフサイクル (Life Cycle)
## 1. アプリのライフサイクルとは?
アプリを使用中に電話がかかってくると、アプリは自動的に電話画面に切り替わり、非アクティブ状態になります。このように、アプリは使用中にユーザーの行動やイベントによって様々な状態に切り替わります。この仕組みを「ライフサイクル」と呼びます。
iOSはアプリの状態を管理し、その状態に応じたイベントを `AppDelegate` や `SceneDelegate` を通じて開発者に提供します。
## 2. アプリの主要な状態
iOSアプリはシステムの状態変化に応じて、次のような主要な状態を持ちます。
“`
Not Running → Inactive → Active
↑ ↓ ↓
Suspended ← Background
“`– **Not Running**
アプリが実行されていない状態。メモリにロードされていない場合を含む。
– **Inactive**
アプリが実行中だが、イベントを受け取らない状態。
例: 電話の着信や通知の表示など。
– **Active**
アプリが実行中
Flutterの基礎をまとめてみた(3)
# Flutterのカウンターアプリについて
次は、Flutterで新しいプロジェクトを作ったときに自動で作られる「カウンターアプリ」について見ていきます。
### カウンターアプリって何?
![スクリーンショット 2024-11-07 14.50.40.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929117/9be21d2f-81a7-6b6a-6ef6-88a5459f514d.jpeg)カウンターアプリは、ボタンを押すたびに数字が増える、とてもシンプルなアプリです。Flutterを学ぶときに最初に見ることが多いアプリで、どんなふうにアプリが動くかを知るための良い例です。
例えば、このアプリでは画面の中央に大きな数字が表示されています。そして、その下にあるボタンをタップすると、数字が1つずつ増えていきます。こうすることで、Flutterの基本的な画面作りや、ボタンを押したときにどう動くかなどを学ぶことができます。
### カウンターアプリの動き方
Flutterのカウンターアプリで
Flutterの基礎をまとめてみた(2)
![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929117/80a01506-ebd3-ac14-4f10-306434ddb46c.png)
# Dartってなに? – Flutterで使われる言語について
Flutterで使うのがDart(ダート)というプログラミング言葉です。Dartはとても簡単で覚えやすく、楽しくアプリを作るために作られた言葉です。ここでは、Dartの特徴を3つに分けて説明して、その後で基本の使い方を見ていきましょう。
## 1. シンプルで使いやすい言葉
Dartはプログラミングを初めてやる人にもわかりやすく作られています。
– **短い時間
Flutterの基礎をまとめてみた(1)
# Flutterってなに?
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929117/5871ab9e-fb65-3de4-7b24-6faabd324eff.png)## Flutter(フラッター)ってどんなもの?
Flutterは「フラッター」と読み、Google(グーグル)が作った便利なツールです。このツールを使うと、1回だけアプリを作れば、スマホやタブレット、パソコンでも同じアプリを動かすことができます。例えば、1枚の絵を描くだけで、いろんな画面にその絵が表示できる感じです!Flutterを使うと、たくさんのプログラムを書く手間が減って、いろんな機械で動くアプリを一気に作れるます。
### マルチプラットフォーム対応って?
調査結果 AppleによるiOSアプリのレビューガイドラインについて# 1.iOSアプリのプライバシー要件
### 要点
1. Appleは、iOSアプリのプライバシー保護を強化するため、サードパーティSDKに対してプライバシーマニフェストと署名の提出を義務付けています。
2. 2024年5月1日以降、特定のAPIを使用するアプリは、その使用理由をプライバシーマニフェストで明示する必要があります。
3. これらの要件は、ユーザーのプライバシー保護とデータ収集の透明性向上を目的としています。### 詳細な説明
Appleは、iOSアプリにおけるユーザーのプライバシー保護を強化するため、サードパーティのソフトウェア開発キット(SDK)に対して新たな要件を導入しました。具体的には、一般的に使用されるサードパーティSDKに対し、プライバシーマニフェストと署名の提出が求められます。これにより、デベロッパはアプリ内のすべてのコードに対して責任を持ち、データ収集と使用方法を把握することが求められます。さらに、2024年5月1日以降、特定のAPIを使用する新規アプリやアップデートされたアプリは、App Store Connectにアップロードする際、プライバシー
UISliderで作る、重なり合う画像のグラデーション効果
## **1. はじめに**
iOSアプリ開発において、画像を重ねたレイアウトの透明度を変えることで、視覚的なグラデーション効果を作り出すことができる。レイヤーごとに透明度を変えることで、スライダーの操作に応じて見え方が少しずつ変化し、インタラクティブな視覚効果が生まれる。このブログ記事では、`UISlider`を用いて3つの画像の透明度を調整し、グラデーションのような効果を得る方法について解説する。
## **2. グラデーション効果の仕組み**
このコードでは、以下のロジックでグラデーション効果を実現している:
– **重ねた画像の透明度を動的に変更**:3つの画像を重ねた状態で、それぞれ異なる透明度が設定されている。スライダーの操作により透明度が変化するため、画像が重なりながら滑らかに見え方が変化する。
– **異なる透明度が重なって表現される**:透明度の変化により、前景の画像が後景の画像を覆うようにフェードイン・フェードアウトし、自然なグラデーション効果が視覚的に表現される。こうした重なりによる透明度の変化は、複数の画像や色の要素が組み合わさる場面で、柔らかな変化
Swiftで作成したゲームに広告を入れる
## 事前準備
[Google AdMob](https://admob.google.com/intl/ja/home/)に登録
## 広告ユニットの作成
種類はバナー広告にしました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/adb56e74-08a5-9717-0fa2-154f1188f583.png)## 実装
Swift Package Manager (SPM) でGoogleMobileAdsライブラリを使うための準備
Xcode→File→Add Packages…を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/561806f9-a054-9ce7-1f0c-e943519bfa93.png)
下記を検索して、Add Package
“`
https://github.com/googleads/swift
元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