- 1. [Swift] Task Groups の基礎
- 2. SwiftUIのsearchableモディファイアを使ってみる
- 3. 【Swift】CocoaPodsに自作ライブラリを登録する時躓いた
- 4. 【Flutter】アプリアイコンを変更する
- 5. 【Swift】iOSバージョンを取得する方法
- 6. RealityKitをnonARモードで使ってみた
- 7. Flutter 3.0.x 環境をmacOS上に構築する(XcodeとFlutterの複数バージョン対応版)
- 8. 【Swift】Storyboardでバージョンに関する警告
- 9. [Swift] actor の isolated / nonisolated キーワードの使い方
- 10. 【SwiftUI】画面サイズに応じて広告数を変化させる
- 11. 【SwiftUI】iOS15以降 & SwiftUIでATT許可ダイアログを出す
- 12. SwiftUI.Button の action は @MainActor なのか – @Sendable でないクロージャが actor コンテキストを受け継ぐことについて
- 13. (iOS 14 以前向け) SwiftUIで、TextField 付き Alert を作る
- 14. [SwiftUI]外観モードを変更する際の注意点
- 15. 【Swift】外観モードの検知
- 16. XcodeのExcluded Source File Namesを使って不要なファイルを除外する
- 17. iOS向けの最小限機能のブラウザーを開発中?
- 18. 【AdMob】iPadでAdMob広告を表示する場合に発生するエラー
- 19. FlutterアプリをApp Store Connectに登録する時に参考にしているサイト
- 20. XCTMemoryMetricが動かない場合のワークアラウンド
[Swift] Task Groups の基礎
## 概要
Task Groups は複数のタスクを並列に実行するための仕組みです。この記事では Task Groups の基本的な使い方から、キャンセル周りも含めた細かい振る舞いまで理解していきます。
記事中の動作検証は Xcode 14 Beta 5 で行っています。
## TL;DR
– Task Groups は子タスクを並列に実行したいときに使う。とくに、同じ型を返す動的な数の子タスクの実行に適している
– Task Group は `withTaskGroup` か `withThrowingTaskGroup` で生成できる。子タスクがエラーを投げない場合は前者、投げる場合は後者を使う
– 基本的な流れとして `with(Throwing)TaskGroup` に渡すクロージャの中で子タスクを生成する処理とそれを受け取る処理を書く
– 子タスクの生成は `addTask(UnlessCancelled)` で行う。典型的には `for` 文で Collection の要素を回してそれをもとにタスクを生成することが多い
– 受け取り処理は `for
SwiftUIのsearchableモディファイアを使ってみる
アプリで検索機能を実装するときによく使用するのがSearchBarですが、iOS15からSwiftUIに`.searchable`モディファイアが追加されたので使い方などを書いていこうと思います。
https://developer.apple.com/documentation/swiftui/view/searchable(text:placement:)
# 事前に
今回の記事で使用する検索フィールドを追加するViewです。
こちらのコードにsearchableモディファイアなどを追加していきます。“`swift
struct ContentView: View {let colors: [String] = [“Red”, “Blue”, “Yellow”, “Purple”, “Orange”, “Green”, “Pink”, “White”, “Gray”, “Black”]
var body: some View {
NavigationView {
List {
【Swift】CocoaPodsに自作ライブラリを登録する時躓いた
ライセンスめんどくさいし自分でも作れるんじゃね?と思いQRReaderを作成。
配布にCocoaPods(遺産なんて言わないで)を採用。
結果出来たが、少し躓いたのでメモ#### 今回作ったライブラリ
今後も更新します。https://github.com/kirasoga/QRReader
#### 下記の記事を参考にさせていただきました。
https://qiita.com/taji-taji/items/e23373f9b8124de728a2
めちゃくちゃ参考にさせていただきました。ありがとうございます。
## はじめに
上記の投稿で、自分の理解の及ばなかった箇所を備忘録として作成。
上記の記事に沿って作成します。## 1. ライブラリの作成
ここは順調## 2. Githubに公開
ここは順調## 3. podspecファイルの編集
### podspecの内容チェック`pod lib lint SampleLib.podspec`
このコマンドでpodspecの内容をバリデーションチェックしてくれる
1. `s.description`はなく
【Flutter】アプリアイコンを変更する
## 初めに
Apple Store や Google Play Store にアプリを表示させる場合、当然のことながら、自分独自のアイコンを作成して表示させる必要があります。
今回は作成したアイコンをアプリアイコンとしてホーム画面に表示させる方法を紹介します。## flutter_launcher_icons
今回は [flutter_launcher_icons](https://pub.dev/packages/flutter_launcher_icons) というパッケージを使用します。
このパッケージはアプリのアイコンを変更する際に使用されるパッケージです。## 準備
まずは、パッケージのバージョンを「 pubspeck.yaml 」に記述します。
このパッケージを使用するのは開発段階であるため、`dependencies` ではなく、 `dev_dependencies` に追加します。パッケージのバージョンは、特に制約がなければ最新のバージョンで問題ありません。
“`yaml: pubspeck.yaml
dev_dependencies:
flutt
【Swift】iOSバージョンを取得する方法
# はじめに
ユーザーエージェントを偽造する際にユーザーの端末のiOSバージョンの情報を使ったので取得方法を備忘録として載せておきます。# 方法
“`swift
let iosVersion = UIDevice.current.systemVersionprint(iosVersion)
“`# おわり
意外と使わない機能なので全然知りませんでした笑
RealityKitをnonARモードで使ってみた
# RealityKitをnonARモードで使ってみた
* [RealityKit](https://developer.apple.com/documentation/realitykit)はAR表示を推しているFrameworkですが、CameraModeに[.nonAR](https://developer.apple.com/documentation/realitykit/arview/cameramode-swift.enum/nonar)があったので、これを試してみました
* リポジトリはコチラ↓ですhttps://github.com/fuziki/RealityKitPlus
* 作成したみたものがコチラ↓です
RealityKitのnonARモードやってみた pic.twitter.com/Ep8xN0fwK8
Flutter 3.0.x 環境をmacOS上に構築する(XcodeとFlutterの複数バージョン対応版)
# なぜこの記事を書いているか
以前、[Flutter 2.5.x 環境をmacOS上に構築する(XcodeとFlutterの複数バージョン対応版)](https://qiita.com/uehatsu/items/bdd652464a81c9c71ff7)と題した記事を投稿したのですが、この記事では3.0.x環境でも同様の手順で構築できるのかを検証する意味も含めてトレースします。
# 環境(2022/08/17現在)
– MacBook Pro (Intel Mac)
– macOS Monterey (12.5)
– Flutter (3.0.5)
– Android Studio (Chipmunk | 2021.2.1 Patch 2)
– Xcode (13.4.1)# インストール
## Homebrew
今回もHomebrew経由で色々なものをインストールします。
“`bash:terminal
/bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HE
【Swift】Storyboardでバージョンに関する警告
# はじめに
以前あげた[こちら](https://qiita.com/SNQ-2001/items/7151fdcb8e9f8c2c42c2)の記事を見ながらネイティブ広告を実装してる際にStoryboardに警告が出ていたので修正方法を記載しておきます。# 警告
“`
warning: Unsupported Configuration: This file is set to build for a version older than the deployment target. Functionality may be limited.
“`
![スクリーンショット 2022-08-15 22.15.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/7fd2eb6d-07a1-97bb-c688-42668591e056.png)# 原因
![スクリーンショット 2022-08-15 22.17.07.png](https://qiita-image-store
[Swift] actor の isolated / nonisolated キーワードの使い方
## 概要
actor のメソッドやプロパティは actor に isolate されています。 [SE-0313 Improved control over actor isolation](https://github.com/apple/swift-evolution/blob/main/proposals/0313-actor-isolation-control.md) のプロポーザルで追加された `isolated` / `nonisolated` キーワードを使うことで、 actor のメンバーでない処理を actor に isolate したり、逆に actor のメンバーを actor に isolate しないことができます。この記事では、プロポーザルをもとにこれらのキーワードの使い方をまとめます。記事中の動作検証は Xcode 14 Beta 5 で行っています。
## `isolated` キーワード
actor の例として、以下の `Counter` 考えます。
“`swift
actor Counter {
var count: Int =
【SwiftUI】画面サイズに応じて広告数を変化させる
# はじめに
かなり限定的なお題ですが同じ事をする方がいると思うので記事にしておきます。# やりたい事
|iPhone12|iPadPro11(縦)|iPadPro11(横)|
|:-:|:-:|:-:|
|![simulator_screenshot_2CBECF57-4401-4526-95D5-EC1044944B8B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/b99a4fac-5008-c3c7-58e6-4c2bd704b269.png)|![simulator_screenshot_9C0BCD94-3C2C-4E1E-BE31-E7A0A9DAC4DF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/10d3f599-c38b-d92a-8245-044c89276827.png)|![simulator_screenshot_95EDA013-9111-40FF-AD
【SwiftUI】iOS15以降 & SwiftUIでATT許可ダイアログを出す
以前は didFinishLaunching でATT許可ダイアログ出してもいけましたが、iOS15からはアプリがアクティブな状態でないとダイアログが出なくなりました。
そこでSwiftUIでATTダイアログを出す方法です。
“`swift
struct MainView: View {
var body: some View {
VStack {
Text(“Hello!”)
}
.onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in
if ATTrackingManager.trackingAuthorizationStatus == .notDetermined {
ATTrackingManager.requestTrackingAuthorization(completionHandler:
SwiftUI.Button の action は @MainActor なのか – @Sendable でないクロージャが actor コンテキストを受け継ぐことについて
## 概要
SwiftUI で開発する際、ViewModel を `@MainActor` にしてそのメソッドを `Button` の `action` パラメータに渡すということがよくあると思います。このとき、 `action` に渡すクロージャの中で `@MainActor` である ViewModel のメソッドが `await` せず同期的に呼べるので `action` 引数は `@MainActor` なのかと思っていたのですが、ある日同じメソッドを引数に直指定すると `@MainActor` を `@MainActor` でない型に渡すなという旨の warning が出てしまいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159260/e980dd17-7423-4ee1-5bbd-f6438a7130ce.png)
一見、もし `action` が `@MainActor` なら `// 2` のメソッドを直指定するケースで warning が出ないはずだし
(iOS 14 以前向け) SwiftUIで、TextField 付き Alert を作る
# 概要
(普段 React をメインで仕事している者ですが、只今SwiftUI勉強中です。
勘違い等あるかもしれませんが、何か誤り等あればコメント欄でご指摘いただければ幸いです。)個人開発でアプリを作っていて、TextField 付きの Alert を表示したい場面があったのですが、色々と詰まった箇所があったので、備忘録としてやり方を書きます。
なお、作成にあたって、以下の記事を参考にさせていただきました。
– [UIKitとSwiftUIでテキストフィールド付きアラートを表示する | DevelopersIO](https://web.archive.org/web/20220815184927/https://dev.classmethod.jp/articles/ios-alert-with-text-field/)
– [ios – SwiftUI: UIAlertController’s textField does not responding in UIAlertAction – Stack Overflow](https://stackoverf
[SwiftUI]外観モードを変更する際の注意点
# 外観モードの変更
SwiftUIでは外観モードを
“`swift
.preferredColorScheme(.light)
“`で変更できますが少し癖があるので紹介します。
# 1. 宣言に一番近いpresentationまでが変更される
これはドキュメントにも書いてあるのですが、preferredColorSchemeを呼ぶとその直近のpresentationよりも下のビューの外観モードが変わります。
**アプリ全体が変更されるわけでは無いので注意**https://developer.apple.com/documentation/swiftui/path/preferredcolorscheme(_:)
つまり、次のようなView構造の場合、Buttonは外観モードが変わらずListは動的に変更されることになります。
“`swift
@State private var isPresented = false
@State private var isDarkMode = truevar body: some View {
Butto
【Swift】外観モードの検知
# はじめに
https://qiita.com/SNQ-2001/items/9289e5a9730be6f94d81私は以前、SwiftUIでの外観モードの検知について記事を投稿しました。
今回は以前紹介した方法とは別の方法でUIKitでも使用できる方法を紹介します。# 方法
“`swift
if UITraitCollection.current.userInterfaceStyle == .dark {
// ダークモード
} else {
// ライトモード
}
“`私はどの場面で使うことになったかというと、
SwiftUIでTabBarに色をつける際に使用しました。
“`swift
import SwiftUIstruct ContentView: View {
init() {
let appearanceT: UITabBarAppearance = UITabBarAppearance()
if UITraitCollection.current.userInterfaceStyle =
XcodeのExcluded Source File Namesを使って不要なファイルを除外する
Xcodeの`Build Settings`の`Excluded Source File Names`を利用する事で、対象のビルドから指定したファイルを取り除くことが出来ます。
`#if DEBUG`のようなマクロは、おそらく、いろんなプロジェクトで利用されていると思いますが、`Excluded Source File Names`は意外と使われていない印象を受けたので、記事にしてみようと思いました。
最近関わったプロジェクトでも、`Excluded Source File Names`ではなく、ファイルの先頭と末尾に、`#if DEBUG`と`#endif`を書いて運用していました。
こんな感じですね。“`swift
#if DEBUGimport SwiftUI
/// Data for the top style charts.
struct DebugTopStyleDataB {
/// Sales by pancake style for the last 30 days, sorted by amount.
static let last3
iOS向けの最小限機能のブラウザーを開発中?
Webサービスを先行してリリースした後に後発でモバイル向けアプリをリリースする場合、WebViewベースのアプリ(いわゆるガワネイティブ)となることが結構あると思います。このガワネイティブの実装では、WebView上でのイベントをフックしてネイティブのUIを表示したり、ネイティブ側で特定の処理を実行したりといった要件がありますよね。
また、SwiftUIではまだWebViewが提供されていないため`WKWebView`を`UIViewRepresentable`でラップして利用する必要があります。ただ、WebViewのインタラクション(検索・戻る・進む・リロードなど)までラップしているサンプルはGitHubなどを調査してもあまり見当たりません(あったとしても多機能すぎたり実装がよくない)でした。
このような事情から、WebViewの仕様を学び、扱う練習を目的としてブラウザを自作してみることにしました。
## 要件
– SwiftUIベースのアプリにする
– [デフォルトブラウザの要件](https://developer.apple.com/documentation/xcod
【AdMob】iPadでAdMob広告を表示する場合に発生するエラー
# はじめに
今回の問題はシュミレーターのみで発生します。
実機テストやリリースアプリでは発生しない問題なのでエラーが気にならない方はスルーでいいと思います。私は気になったので対応しました
# エラー
![スクリーンショット 2022-08-03 17.32.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/dc13e708-51f0-3dd3-e26f-b471a3811e5f.png)
“`
Invalid Request. The GADRequest scene property should be set for applications that support multi-scene. Treating the unset property as an error while in test mode.
“`# 解決方法
## バナー広告の場合
バナー広告の表示方法解説は[こちら](https://qiita.com/SNQ-2001/it
FlutterアプリをApp Store Connectに登録する時に参考にしているサイト
# App Store Connect登録手順(Flutter)
FlutterアプリをApp Store Connectに登録する際に、参考にしているサイトのリンク集です。
私が独学でFlutterを学んでいる時に、以下のサイトには大変お世話になりました:bow_tone1:
※参考にしているサイトは随時更新予定です。## 1. Certificates Identifiers & Profiles
https://qiita.com/c_tomioka/items/af5942b7031962c3faff
https://harublog.site/developer-identifiers
##### Bundle ID
例)`com.organizationName.appName`
※organizationNameは組織名
※appNameはアプリ名## 2. アプリをAppStore Connectに登録する
https://zenn.dev/moutend/articles/feebf0120dce6e6426fa## 3. Xcodeでアーカイブ
XCTMemoryMetricが動かない場合のワークアラウンド
XCTestでは、measureを使うと使用メモリや実行時間を計測できるが実行時間以外のメトリクスはうまく動いてくれない。
“`
final class MeasureTests: XCTestCase {
func testSingleContextLayer() {
measure(metrics: [XCTMemoryMetric(), XCTClockMetric()]) {
}
}
}
“`どうもiOSシミュレータでは動いてくれないようなので、実行ターゲットをMacにすると使えるようになる。
![CleanShot 2022-08-14 at 02.13.29@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24979/98214ed3-4550-7cc7-f79f-0f6d0ae9553b.png)