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

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

【Swift】シングルトンは悪くない、sharedを直接触るのが悪いんだ

## シングルトン

古来からあるデザインパターンの一種で

– **A: クラスのインスタンスをアプリ内で1つのみ存在させる**
– **B: static変数のsharedでどこからでもアクセスできる**

という効果があります。
「単一のリソースに対してアクセスするクラスは、複数生成すると並列アクセス等でバグが出るからシングルトンにしようね」なんて言われてたりします。例としては以下のようなクラスです。

– ログイン状態を管理するクラス
– DBを操作するクラス
– デバイスの機能 (Location, Bluetooth) を使うクラス

“`swift
final class Auth {

// static変数で自分自身を保持
static let shared: Auth = .init()

var isSignedIn: Bool { … }
func signIn() async throws { … }

// initをprivateにすることで、クラス外でインスタンスを生成できなくする
//

元記事を表示

HealthKitを使って睡眠分析アプリを作ってみる

# はじめに
本記事はARISE analytics Advent Calendar 2022の13日目です。
昨日は@hktechさんの[AWS App Runnerでアプリケーションを動かす](https://qiita.com/hktech/items/c37dfcae8b17e5907264)
明日は@SaitomTechさんのServerless Framework を用いて Step Functions Distributed Map による Lambda の大規模並列処理を実現する
# HealthKitとは
HealthKitとは、iPhoneやApple Watch、他のヘルスケアアプリから集めた健康データを、iPhoneのヘルスケアアプリに連携する開発者向けツールです。例えば、Apple Watchで計測された心拍数や、体重計と連動しているアプリから連携される体重や体脂肪率をHealthKitが統合管理することで、我々開発者はさまざまなヘルスデータを利用することができます。
![HealthKit.png](https://qiita-image-store.s3.

元記事を表示

R.Swiftのプラグインの導入方法(Xcode project編)

2022/11/29に R.Swift 7.0.0 がリリースされ、Swift Package Manager ビルドツールプラグインの機能が追加されました。この R.Swift プラグインの導入方法についてREADMEに沿って説明します。

– R.Swift 7.0.0 リリースノート
– https://github.com/mac-cain13/R.swift/releases/tag/7.0.0
– リリース一覧
– https://github.com/mac-cain13/R.swift/releases

:::note info
インフォメーション
記事執筆現在、既に 7.2.4 がリリースされており、引き続き頻繁なリリースが続きそうな勢いです。
導入される方は最新のリリースを導入すると良いと思います :ok_woman:
:::

# R.Swiftのプラグインとは

R.Swiftにはこれまでプラグインの機能はありませんでした。今回の7.0.0で新規に追加されたものです。
この機能により、R.generated.swiftが自動生成されます。

元記事を表示

【SwiftUI】Combineでキーボードを監視する

# はじめに
私は現在カスタムキーボードを作成していて、キーボードの状態を知る方法を色々試しています。
この方法はCustomKeyboardExtensionでは使用できませんでしたが、メインターゲットでは使用できました。
せっかく試したので記事にしておきます。

# サンプルアプリ
ちょっと見にくいですが、以下の2項目を表示しています。
– キーボード状態(開いている or 閉じている)
– キーボードサイズ(width, height)
![RPReplay_Final1670849788_MP4_AdobeExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/b335fb1b-9182-a355-9d53-a64fab4642d1.gif)

# 実装
### View
“`swift:ContentView
import SwiftUI

struct ContentView: View {
@StateObject private var viewMode

元記事を表示

SwiftのCollectionViewCellの型崩れについて

## 概要
SwiftのCollectionViewCellの実装中に、Cell内に配置しているUIButtonの形を円形にしようと実装していたところ、なぜかひし形のような形になって型崩れしてしまっていました。
## 条件
サーバーから取得してきたユーザー情報をCollectionViewCellに入れるというごく単純なものになります。
Swiftファイルとは別に切り出した、『CollectionViewCell.Swift』を作成し、ViewController.SwiftファイルのcellForAtでセル一つずつに情報を入れるという形で実装していました。

## 実装
コードの状況としては、以下のような感じでした。

“`CollectionViewCell.Swift
final class CollectionViewCell: UICollectionViewCell {

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

override func layoutSubviews() {
super.layo

元記事を表示

openapi-generator で自作テンプレートを用いて iOS API クライアントを自動生成した話

この記事は [ドワンゴ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/dwango) 11 日目の記事です。1日遅刻してしまいました :bow:

こんにちは、@tasuwo です。普段はニコニコ動画 iOS アプリの開発に携わっています。ニコニコ動画iOSアプリ (以下、動画iOSアプリ) では3年程前から OpenAPI 仕様を元に APIクライアントを自動生成し、動画iOSアプリとボカコレアプリで利用しています。その中で得られた知見について紹介しようと思います。(そもそも OpenAPI とは?という話は、今回は割愛します :pray: )

## コード自動生成導入の経緯

主なモチベーションはやはり省力化でした。導入以前は仕様書を元に実装を行い、同じ仕様書を元にレビューするといった工程が必要でしたが、仕様書からコードが自動生成できれば多くの手間を省くことができます。
また、動画iOSアプリから主に利用するAPIでは既にOpenAPI仕様が提供されていました[^1]。この仕様を提供するチームは動画i

元記事を表示

SwiftUIで作る「Drag処理を利用したCarousel型UI」と「Pinterest風GridレイアウトUI」の実装例とポイントまとめ

## 1. はじめに

皆様お疲れ様です。Swift AdventCalendarの12日目を担当させて頂きます、fumiyasac(Fumiya Sakai)と申します。何卒よろしくお願い致します。

最近になって、業務や個人開発の中でも徐々にSwiftUIやそれを取り巻くアーキテクチャ等にも触れる機会が徐々に増えてきました。

UIKitが主流だった時代から今日までiOSアプリにおけるUI実装に関する部分は、自分にとっては一番関心が高いトピックではあるので、今後はある程度まとまった記事の形でも継続的な投稿ができる様にして参ります。
(もちろん不定期で公開しているTwitter等での手書きノートによるアウトプットも継続していく所存ではあります?)

私自身もそれほどSwiftUIに慣れているわけでは決してありませんが、これまでUIKitを活用して実装経験があるものや、サンプル実装検証をすすめた経験があるものの中で、

– UIKitを利用した際でも想像以上に工夫が必要だったUI実装を、SwiftUIに置き換えて考える事は可能か?
– 更にSwiftUI製の実装する場合は、従来のUIK

元記事を表示

SwiftUI でサイズクラスに対応する

# はじめに
Storyboard を利用していると、サイズクラスを利用して以下のように柔軟にビューのレイアウトを変更することが、比較的簡単に実現できていました。

– iPad で画面を分割していないので、幅が十分にあるからビューを横に並べよう
– iPad をマルチタスキングで画面分割して幅が狭くなったので、ビューを縦に並べよう

`UIStackView` で、幅と高さが Regular のデバイス(iPad で画面非分割時など)の場合のみサブビューを横に並べるのであれば、以下のような設定を行いました。

sizeclass_in_storyboard.png

サイズクラスは SwiftUI でも利用できるので、その使い方を記載します。

# 今回のゴール
以下のように、画面幅の広い状態ではビューを横に、狭

元記事を表示

SpriteKitで2D横スクロールゲームをつくろう(番外編)

![Xcode-14.1](https://img.shields.io/badge/Xcode-14.1-brightgreen) ![iOS-16.0](https://img.shields.io/badge/iOS-16.0-brightgreen)

## はじめに
その1〜その5の番外編です。

* [その1](https://qiita.com/am10/items/df42c1f0091e6c4705e2)
* [その2](https://qiita.com/am10/items/d53d1cdf1b973a9f56cc)
* [その3](https://qiita.com/am10/items/8729f77f3ee512a86052)
* [その4](https://qiita.com/am10/items/90e3a2f58ae88e4ad6c4)
* [その5](https://qiita.com/am10/items/deacceda00c034ac29bb)

今回はこんな感じでコントローラーで操作できるようにします:wink:

子育て中のママが5日間でiOSアプリを開発→リリースした話

これはWEBCAMP ENGINEER COMMUNITY Advent Calendar 2022の12日目の記事です!
(私事ながら結婚記念日なので今日を選びました!祝って〜!)

## はじめに

おがまりと申します。
現在IT愛好家という肩書きを勝手に名乗り、Web制作代行やIT関連講師などを行っています。
今年の5月に娘を出産しました!

## 作ったアプリ
[託児サービス付店舗検索アプリ meimei](https://meimei-app.studio.site/)というアプリを作りました。
現在iOS版のみですが、[こちら](https://apps.apple.com/jp/app/meimei-%E8%A8%97%E5%85%90%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E4%BB%98%E3%81%8D%E5%BA%97%E8%88%97%E6%A4%9C%E7%B4%A2-%E3%82%81%E3%81%84%E3%82%81%E3%81%84/id6444382754)からダウンロードできます!

「The Ultimate Guide to WKWebView」をSwiftUIで実装する #13 – Showing custom UI –

「[The Ultimate Guide to WKWebView](https://www.hackingwithswift.com/articles/112/the-ultimate-guide-to-wkwebvie)」をSwiftUIで実装してみるの、
13個目になります。12個目を投稿以降、しばらくサボっていてごめんなさい。 :bow:

今回はWebViewで新しいウィンドウを開く方法についてです。
SwiftUIだと色々ハマりまりました。正直SwiftUIが悪いのか私が悪いのか不明なところも残っています。(いつもか、、)
色々な方法を試してみたつもりではあるのですが、他にもっと良い方法があるんじゃないかとも思うので、もしあればコメントで優しく教えてくださるととてもありがたいです。 :pray:

## 目次

シリーズ化していこうと思うので、全体の目次を置いておきます。
リンクが貼られていないタイトルは、記事作成中または未作成のものになります。

|#|タイトル|
|——|—————–|
|01|[Making a web view fil

【SwiftUI】Combineでバッテリーを監視する

# はじめに
ゼンリーのアプリを見てたらバッテリー残量が表示されていたのでどうやるのかなと思い、試してみました。
せっかく試したので記事にしておきます。

https://qiita.com/SNQ-2001/items/7ebfadb553c2682ea69b

これをちょっと変えてサンプルアプリを作成します。

# サンプルアプリ
充電中 → 緑
それ以外 → 黒
![RPReplay_Final1670752390_MP4_AdobeExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d7e229da-d994-d0b3-1e51-6ae5c621014e.gif)

# 実装
### View
“`swift
import SwiftUI

struct ContentView: View {
@StateObject private var viewModel = ViewModel()
var body: some View {

元記事を表示

Appium on Azure Pipelines

この記事は、[ソフトウェアテスト Advent Calendar 2022](https://qiita.com/advent-calendar/2022/softwaretesting)の11日目の記事となります。
前日10日の記事は、@cvusk さんの「[ソフトウェアテストの実行を効率化するPredictive Test Selectionの衝撃](https://qiita.com/cvusk/items/358e7964927af4128d32)」でした。

https://qiita.com/advent-calendar/2022/softwaretesting

https://qiita.com/cvusk/items/358e7964927af4128d32

## 概要

スマホアプリを[Azure Piplines](https://azure.microsoft.com/ja-jp/services/devops/pipelines/)でCI対応した後にビルドしたアプリが問題なく起動して動作するか簡単なE2Eテストを[Appium](https://appiu

元記事を表示

[weak self]と唱えることについて

## 概要
Swiftでコードを書いていると[weak self]っていう記述よく目にすることありますよね?
結論から申し上げますと、
###### [weak self]は、selfを弱参照にして、クロージャとselfを循環参照をしないようにするために唱えられるものです!

と、このようによく言われますが、僕自身正直なんのことかさっぱりわからない時期が長かったです。僕と同じような状況の方は大勢いるかと思いますので、復習がてらQiitaにまとめようと思いました。
ちなみに、当方も完全に理解しているかは怪しいため、間違っていればご指摘いただけるとありがたいです!

## 前提条件
前提条件として、[weak self]との関係が深いのがクロージャと循環参照ですので、クロージャに関しては優良な記事がゴロゴロとあるので詳しくはそちらを参照いただければと思います。
また、[weak self]と言うのは、Swiftの文法でキャプチャリストと呼ばれるものを活用しています。
そして公式の解説では、
> デフォルトでは、クロージャー式は、それらの値への強い参照を使用して、周囲のスコープから定数と変数

元記事を表示

エラー処理についてすごく簡単にまとめてみた#1

## はじめに
エラー処理について3にパターン分けて記事を投稿する。

①Optional型 >>>>> 成功時は値を返し、失敗時はnilを返す
②Result型 >>>>> 成功時は値を返し、失敗時はエラーの値(詳細)を返す
③do-catch文によるエラー処理

今回は①について記載する。

## 対象者
この記事は下記のような人を対象にしている。

– プログラミング初学者

## 詳細
– 成功時は値を返し、失敗時はnilを返す

“`swift:Swift
//①Optional型 >>>>> 成功時は値を返し、失敗時はnilを返す
struct User {
let id: Int
let name: String
let email: String
}

//対応するユーザーが存在しない場合はnilを返すようにする処理
//戻り値は構造体のUserオプショナル
func findUser(byID id: Int) -> User? {
//配列usersにUse

元記事を表示

SwiftUIでサイコロを振る

![Xcode-14.1](https://img.shields.io/badge/Xcode-14.1-brightgreen) ![iOS-16.0](https://img.shields.io/badge/iOS-16.0-brightgreen)

## はじめに
去年に[SceneKitでサイコロを振る(Swift)](https://qiita.com/am10/items/8f872daf8d0aa0b72672)でサイコロを振ったのですが SwiftUI でやる方法は断念しました。

今回はそのリベンジです:muscle:

できたやつはこんな感じ。

![dice_roll](https://user-images.githubusercontent.com/34936885/205488954-d560814d-c6e4-42e8-beb1-691cc3938253.gif)

## ソース
ソース全体はこんな感じです(前回は独自 `SCNScene` を作るという発想がなかった)。

ソース全体
元記事を表示

BitriseでのdSYMのアップロードに試行錯誤した話(Bitcodeなし & SPMでFirebaseを利用している場合)

# 初めに

いま担当しているAppでは、CIにBitriseを利用しており諸々の運用プロセスを自動化しています。

– Bitrise
– ユニットテスト実行・AppStoreへのアップロードetc..を自動化
– Firebase Crashlytics
– FirebaseパッケージはSwift Package Managerで取得
– dSYMアップロードは[Fastlaneのdownload_dsyms](https://docs.fastlane.tools/actions/download_dsyms/)を利用してコマンドを一発叩くのみ

そんな環境下でdSYMアップロードが出来なくなったというトラブルの対処法について記しておきます。

# 経緯

### BitcodeをOFFにする

あくる日にAppStoreへのアップロードを実行したところ、下記のエラーメッセージとともにバイナリが無効と判定されアップロードが失敗しました。

![スクリーンショット 2022-12-02 17.53.22.png](https://qiita-image-store.s3

元記事を表示

スクロールで伸縮するヘッダをSwiftUIで実装する

# はじめに
この記事はand factory.inc Advent Calendar 2022 11日目の記事です。

and factory iOSエンジニアのy-okuderaです!
SwiftUIで、以下のように引っ張ると伸縮するヘッダを実装しましたので、まとめてみます。

![result.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103695/d9746784-4a1d-ef40-5bd2-27bf14b61960.gif)

## StatusBarまで画像を描画する
まずは、画像をStatusBarまで描画してみます。
ScrollViewに `.edgesIgnoringSafeArea(.top)` を指定して、StatusBarまで描画されるようにします。

ScrollViewのサイズ・位置を取得するために、GeometryReaderを使用して、その中にImageを実装します。
Imageのサイズは、GeometryReaderと同じに設定して、GeometryReader

元記事を表示

【SwiftUI】HomeIndicatorを非表示にする

# はじめに
iOS16からHomeIndicatorを非表示にする機能がSwiftUIの公式のAPIとして提供されました。
使ってみたので記録しておきます。

# HomeIndicatorとは
ホームボタンのない端末で下の方に表示される棒です。
![IMG_1758.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/03eab896-a04e-5d46-2bcb-83b990a4ed80.png)

# 動画
ちょっとわかりにくいですが、下の棒が消えています。
![Simulator Screen Recording – iPhone 14 – 2022-12-10 at 21.00.04.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/597b1623-bd77-546c-fc82-7650e67218f9.gif)

# 実装
“`diff_swift
import SwiftUI

元記事を表示

SwiftUI:Viewの.clipped()領域外はタップできなくする方法(とてもシンプル!)

SwiftUIでViewの表示領域を限定する際に、.clipped()モディファイアはとても便利である.
しかし….clipped()を使って画像のドラッグ移動などを実装する時、例えば.offset()などで画像表示位置を変更した場合、下記の図の様にclippedで非表示領域もタップが有効なままなので、下層のView(ボタンとか)がタップできなくなくなってしまう.
別に気にならないケースもあるでしょうけど、この例みたいに別のタップしたいアクションがあるとちょっと困るのだ.
![aboutClipped.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2212777/b15c5082-d3ad-5b4b-eb71-e8989943d4f4.jpeg)

そこで、シンプルな解決法がこれ.
“`swift
.contentShape(Rectangle())
“`
このモディファイアを1行追加するだけで問題は解消するのである.
例)画像をドラッグ移動するサンプル↓
“`swift:

元記事を表示

OTHERカテゴリの最新記事