iOS関連のことを調べてみた2022年08月17日

iOS関連のことを調べてみた2022年08月17日

[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 = true

var 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 SwiftUI

struct 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 DEBUG

import 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)

元記事を表示

Unity2021の2D Mobile[プログラミング]

# はじめに
 この記事は一つ前の**初期設定**を済ましていることを前提としています。それから、そこそこのプログラミング経験がある方でなければ分かり辛い表現が多いと思います。
 ご注意ください。

 Unityを初めてたったの二日目ですがUnityの仕様がだんだん掴めてきた現状です。
 備忘録として記事を書いている形ではありますが、あまりに基礎的なことなので自分でも見返すかはよく分かりません。まぁ誰かの役に立ったらいいや程度の認識で進めましょう。
 一日目に「一日あったら簡単なゲームくらい作れるやろwww」という甘い見通しが残念ながら達成されなかったのに続いて二日目も無事終わりそうですが、全容が掴めてきましたのでその先駆けとしてプログラミングについて書き留めておきたいことを書いていきます。
 特にTMPを使用していた場合、古いTextに関するプログラムは軒並み使えなかったので、TMPを使用していてボタンやテキストのUIのスクリプトアタッチが出来ないよ~!という方に参考にしていただければ幸いです。

https://qiita.com/king_dog_fun/items/60dcdf

元記事を表示

SwiftUI標準的なアラートの表示方法

普段はAndroidエンジニアをしています。
SwiftUIでiOSアプリの開発の勉強中です。

勉強記録として振り返れるように記事にしております。
SwiftUIでアラートの表示する方法です。

使用バージョン
Xcode13

# SwiftUIでアラートの表示する方法

“`ContentView.swift
struct ContentView: View {
@State var isShowAlert: Bool = false

var body: some View {
Button(action: {
isShowAlert = true
}) {
Text(“アラート”)
}.alert(isPresented: $isShowAlert) {
Alert(title: Text(“タイトル”), message: Text(“メッセージ”),dismissButton: .default(Text(“OK”), acti

元記事を表示

【Swift】MVPを簡単なサンプルと共に。

# はじめに
今回はMVPを簡単なサンプルとともに紹介していきます。
MVPのイメージを記事にしたものもあるのでそちらもよろしければどうぞ。

https://qiita.com/Ri__/items/4ccd2dab642b2959aaf8

# 想定読者
– MVP聞いたことあるけどよく知らないなという人
– MVCで開発しているけどかなりコードの見通しが悪くなってきてどうにかしたいという人

# サンプルアプリ
今回MVPを紹介するために作るアプリは単純な割り算アプリです。

### 機能詳細
– 割られる数と割る数を入力すると計算結果が表示されます
– 割る数が0の場合はエラーを表示します

※入力された文字が数字じゃなかったらなどなど細かいところはかなり適当に実装しております

![Simulator Screen Recording – iPhone 11 – 2022-08-13 at 14.11.49.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644705/23101835-38

元記事を表示

Unity2021の2D Mobile[初期設定]

# はじめに
 スマホのゲーム開発を始めようと思い至ったのは夏休みが暇すぎたからです。
 幸い僕にはあまりある時間と大量のプログラミングの経験とコンピュータに関する知識がありました。一日で簡単なゲームくらいは作れるだろうと思い適当なサイトを参照しながら開発を進めようとしたところ、参照しているサイトより進んだUnityのバージョンが存在していることに気が付きました。それがUnity2021です。正確にはUnity2021.3.8f1です。
 まぁ大丈夫だろうと最新の安定バージョンらしいそれをインストールして進めていたのですが、どうにも文字化けがあったり、エラーが起きたりで進められない。こうして僕の簡単な目論見をした一日は消費されていきました。
 この記事を書いているのは、その次の日です。
 この記事では僕が忘れてもいいように、Unityの2021において行うべきだと判断した初期設定の数々を書いていきたいと思います。

# Unity Hub

 Unityをインストールするため、あるいはバージョン管理をするためのソフトです。Unityを扱うにはこれを入れるのが最も賢いらしく、僕もそれには

元記事を表示

【Swift】Viewが生成されてからレイアウトしたい

# はじめに
Qiitaに書くほどではないとは思いますが、
UIKit初心者の自分からしたらどうやってやるの?ポイントだったので記事にしておきます

# やろうとしてること
① UIViewControllerでWKWebViewを表示します
② 作ったUIViewControllerをUIViewControllerRepresentableでViewにします
③ SwiftUI側でsheetで表示します

# 問題点
iPadの`sheet`は全画面ではないのでWebViewがはみ出る
|iPhone|iPad|
|:-:|:-:|
|![simulator_screenshot_C3E6D1A2-91C1-4992-A399-57FD25C93EA8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/59b4560f-a945-ddce-97b8-7598a9d76d07.png)|![simulator_screenshot_9881A23D-FBC7-43C2-831E-173F1

元記事を表示

AppiumでAndroid/iOSアプリのテストコードを書いてみた

# これは何?

所属しているチームのお隣のQAチームがテスト自動化ツールであるAppiumを使う機会があり、そこにちょっとだけ参加することになったので、お盆休みの勉強がてら環境構築とテストコードを書いてみました。
この記事は、そのときの手順を示しています。

# Appiumについて

https://appium.io/

Appiumは、モバイルアプリ向けのUIテスト自動化ツール。

サーバクライアントモデルを採用しており、テストコード側からクライアントライブラリ等を介してWebDriver API(の拡張)を叩くと、APIサーバ側でそれを解釈して、プラットフォームごとにあるUIテスト自動化ツール(UIAutomatorやXCUITestなど)の命令に変換し、アプリ操作の自動化を実現している。
クライアントの部分をAppium Client、APIサーバをAppium Server、命令を変換する部分をDriverと呼んでいる。

誤解を恐れずに言えば、Seleniumのモバイルアプリ版。

アーキテクチャについては、下記記事内の図が非常にわかりやすいのでお借りします(2022/

元記事を表示

【AdMob】iOSでテストデバイスを設定する方法

# はじめに
現在AdMobではシュミレーターで起動した際には自動でテストモードの広告が表示されます。
しかし、実機でビルドした際には本番広告が表示されます。
実機テストの際に本番広告を謝ってタップしてしまってポリシー違反に引っ掛かってしまわないように実機テストするデバイスはテストデバイスに登録が推奨されています。

今回はAdMobにテストデバイスを登録する方法を紹介します。

# アプリ側での実装
場所はどこでも構いません。
`AdSupport`をインポートして広告IDを取得します。
“`swift
import AdSupport

print(ASIdentifierManager().advertisingIdentifier)

// XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
“`

取得できたらコードは削除して大丈夫です。
後ほど使うので広告IDは控えておきましょう。

# AdMob側での設定
「設定」を選択します。
![スクリーンショット 2022-08-11 23.51.22.png](https://qiita-image-s

元記事を表示

Google AdMobにアプリを登録する方法

### アプリ登録の手順メモ

1. AdMobのホーム画面を開く
1. 画面左側の[アプリ]-[アプリ追加]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/6af7f5ad-8f05-1819-ad7a-1086dd3cd657.png)
1. プラットフォームとストアにリリースされているかを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/9fa1f34c-9ba0-1aa3-38a7-7236099c48d0.png)
1. アプリ名を入力(リリースして場合は後から変更されるので適当で良い)
1. ユーザ指標を選択し、アプリ追加をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/9d224a77-5dfc-cc87

元記事を表示

OTHERカテゴリの最新記事