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

iOS関連のことを調べてみた2022年04月26日
目次

[iOS][Swift]CombineでUIKitのUI更新を実装してみる

データバインディングに関してはRxSwiftを基本的には使用してきました。
しかしiOS13からバインディングのライブラリとしてSwiftUIと同時にCombineが登場しました。
そこで使用感を比較するためにCombineを使った実装をしてみようと思います。
async/awaitの実装と組み合わせる場合など注意事項もあったのでご紹介いたします。

サンプルコードに関してはこちらの記事の続きです。
[[iOS][Swift5.5]async/awaitを使った通信処理のサンプル実装](https://qiita.com/bu-ka/items/258099de42aae50f4d77)

# やること
ViewModelでasync/awaitを利用した通信処理でデータを取得してViewModelのプロパティの値を更新します。
そしてその値を元にUIが更新されるようにします。

# `@Published`
“`ViewModel.swift

@Published var title = “”

“`
このようにプロパティに`@Published`を付けることによっ

元記事を表示

関数の引数に関数を指定する(クロージャ)

# はじめに
最近まで「関数の引数に関数を指定する」のやり方がわからなかったのですがちょっと理解したので今後、見返せるようにまとめておきます

# クロージャについて
公式のクロージャのサンプルです

“`Swift
let sum = { (x: Int, y: Int) -> Void in
print(x + y)
}

sum(7, 8) // OK
sum(x: 7, y: 8) // エラー
“`
これはクロージャ定数というものです
クロージャ定数を使ってみて不思議だったのが使用時に引数名を記述してはいけないという点です。
関数と同じ様な使い方なので今までの自分では関数との区別ができていなかったです。

また、デフォルト値の指定ができない様です
“`Swift
// ❌
let sum = { (x: Int = 0, y: Int = 1) -> Void in
print(x + y)
}
“`

# 関数の引数に関数を指定
これが今回のメインです
これは「関数の引数にクロージャを使う」というみたいです
“`Swift
struct Conte

元記事を表示

SwiftUIアプリにおける非同期処理の基本

# この投稿は何?
Swift 5.6で導入された言語機能「async/await構文による非同期処理」について、シンプルなアプリ開発を通して学びます。

## 環境
– macOS 12.3.1
– Xcode 13.3.1
– Swift 5.6

## 非同期関数
非同期的に実行される関数を定義するには、宣言に`async`キーワードをマークします。
そして、ボディではコード実行を一時的に停止(サスペンド)する箇所を、`await`キーワードでマークします。

“`Swift:非同期関数の基本的な構文
func someFunction() async {
await anotherAsyncFunction()
}

await someFunction()
“`

非同期関数の呼び出し時には、`await`キーワードをマークする点に注目できます。

# 開発するアプリの概要
SwiftUIフレームワークを使って、「スライダーでテキストの不透明度を制御する」アプリを開発します。

## 非同期的な処理を理解する方法
開発するアプリではスライダーの他に、以下に挙げる2

元記事を表示

KMMプロジェクトを作ってバージョンカタログが利用できるスタート地点に立つまで

## はじめに
設定が複雑で設定やちゃんと動くようにするだけで一苦労。
とりあえず現時点での環境でプロジェクトが動くようになるまでまとめておく。後々別環境とかで動かす機会があったら、最初から環境構築から書きたい。
ライブラリのバージョンカタログ、バージョン管理ができるようになるまでします。

## 環境
* Macbook Air M1 2020
* iOS 12.1 Monterey
* Android Studio Bumblebee | 2021.1.1 Patch 1
* Kotlin Multiplatform Mobile plugin 0.3.2
* Xcode 13.2.1

## プロジェクトが動くようになるまでの手順
1. Android StudioでNew Project->Kotlin Multiplatform App
2. 名前を任意で決めて、OSバージョンは29〜
3. アプリ名は、androidApp,iosApp,shared
4. iOS frameworkは、 CocoaPods dependency frameworkを利用
5. Androi

元記事を表示

【SwiftUI】なぜ、MVVMをやめて、The Composable Architecture(TCA)を採用するのか?

## はじめに

先月、 **【「SwiftUIでMVVMを採用するのは止めよう」と思い至った理由】**
という記事を公開し、多くの反響がありました。

https://qiita.com/karamage/items/8a9c76caff187d3eb838

上記の記事では

**「じゃあ、MVVMをやめて、アーキテクチャは何を採用すればよいの?」**

という問いに対する、明確な答えを出していませんでした。

あれから時が経ち、今ならば、この問いに対して、

ぼくは **「The Composable Architecture(TCA)をおすすめします」** と答えることができます。

![Screen Shot 2022-04-23 at 13.58.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93703/8c10e925-446c-3474-18ee-99b0487107a4.png)

https://github.com/pointfreeco/swift-composable-a

元記事を表示

いらなくなったシュミレーターの掃除

# 背景

Xcodeのバージョンアップや、Macを買い換えるタイミングで不要ファイルを削除する時に、いつも確認するので、自分用に纏め?

Xcodeの`Devices and Simulators` (shift + command + 2)で作成したシュミレーターは削除できる(?)が、
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30834/0080bfa2-64d2-95b8-5e01-3192ea9e449c.png)

上記で削除を行なっても、`Preferences…`の`Components`からダウンロードした`.simruntime`ファイル(?)は消えない。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30834/9a32627b-2c6a-4e6f-90a8-af671512beac.png)

`.simruntime`ファイルの方がサイズも大きいので、不要になったら削除したい。
でも、Xc

元記事を表示

オブザーバパターンでのイベント通知が受け取れない時にまず確認すること

# はじめに
NotificationCenterを使用したオブザーバパターンでのイベント通知を実装したのにオブザーバに設定したメソッドが呼ばれない!そんな時にまず確認したいことを記事にしました。
# 環境
・Swift 5.5.2
・Xcode 13.3.1
# やること
個人開発では全てのコードを自分が書いており、どこに何を書いてるかをある程度把握できていると思うのでこのようなことが起こる確率は低いと思いますが、チーム開発などでいろんな人がコードを書き込んでいるプロジェクトでは比較的起こりやすいのかな思いました。僕は起こりました。
##### 確認事項
・command + Fで検索ウインドウを開き`removeObserver`を検索してみる
`NotificationCenter.default.removeObserver(self)` <- 解除処理 数十分ほど悩んでいたところ、まさかなと思いながら検索するとそのまさかでした。 通知を登録した直後に登録を解除されておりメソッドが呼ばれないということが起きてました。 ちなみに、iOS 9.0・macOS 10.11以降では解

元記事を表示

UITextFieldのキーボードにUIDatePickerを設定する

# はじめに
プロフィールの誕生日欄(textField)を入力する際に、キーボードをUIDatePickerにしようと思ったので記事にしてみました。
# 環境
・Swift 5.5.2
・Xcode 13.3.1
# 使ってみる
再利用できるようにクラスにしてみました。
“`DatePicker.swift
final class DatePicker {

static let picker = UIDatePicker()
static let formatter = DateFormatter()

static func setup(_ vc: UIViewController, action: Selector, for textField: UITextField) {
picker.datePickerMode = .date
picker.preferredDatePickerStyle = .wheels
picker.locale = Locale(identifier: “ja_JP”)

元記事を表示

今更ながらRiverPodのdependenciesをためしてみた

タイトルの通り、今更ながらRiverPodのdependenciesを試してみたメモです。
※RiverPod 1.0.3で確認
# そもそもdependenciesとは?
https://pub.dev/documentation/riverpod/latest/riverpod/Provider/dependencies.html
かんたんにいうと、ProviderRefからScopedなProviderにアクセスするためのパラメータです。dependenciesにScopedなProviderを指定すると、そのProviderもScopedになりアクセスが可能になります。

“`dart
final scopedValue = Provider((_) => ‘1’);
final valueDependsOnScopedValue = Provider(
(ref) => ref.watch(scopedValue),
// この指定により、scopedValueがoverrideされるとvalueDependsOnScopedValueもscopedになる
de

元記事を表示

AnimatedSwitcherが動かない!というときの対処法

# 結論
これを
“`dart
class _BadWidget extends ConsumerWidget {
const _BadWidget({Key? key}) : super(key: key);

@override
Widget build(BuildContext context, WidgetRef ref) {
return AnimatedSwitcher(
duration: const Duration(milliseconds: 100),
child: Icon(
ref.watch(_shouldShowDetail)
? Icons.keyboard_arrow_up
: Icons.keyboard_arrow_down,
),
);
}
}
“`
こうする
“`dart
class _GoodWidget extends ConsumerWidget {
const _GoodWidget({Key? k

元記事を表示

[SwiftUI] 個人的に有用だと感じたテクニック集を『Effective SwiftUI 候補(仮説)』として公開しました。

## Tl;Dr

GitHub Discussions にて公開しています。

https://github.com/YusukeHosonuma/Effective-SwiftUI

どなたもリアクション・コメントなどで、お気軽にディスカッションいただければ幸いです :pray: (もちろん読むだけでもOKです)

## 経緯(興味のある方のみどうぞ)

私はここ2〜3ヶ月ほど、SwiftUI にどっぷりと浸かっていました。

SwiftUI はコードの見た目からは想像できないほど **難しく**、また Apple からは推奨される設計・実装パターンはおろか、必要十分といえるドキュメントすら提供されていないように感じました。

そのような状況の中で試行錯誤を繰り返しているうちに、これは多くの SwiftUI プロジェクトで使える **効果的(Effective)** なパターン・慣習であると感じるものが見つかってきました。

最初はそれを思いついたタイミングで、雑にツイートしていました。

https://twitter.com/tobi462/status/15026601736

元記事を表示

SwiftでのJSONのパースは構造体?辞書?

今回はJSONをパースする際、どっちの方がいいのかが気になったので検証してみました。
検証が甘いかもしれませんが多めにみてください

# どっちが楽か
これは検証するまでもなく圧倒的に辞書の勝利です

JSONの情報量が少なければ構造体も苦ではありませんが返ってくるKeyの数が300件+ネストも深いともなってくると苦行です

# 速度
実はこれがメインです
構造体の方が早いのは予想がつくのですがどのくらい差があるのかが気になったので検証してみました。

**計測の方法**
こちらの記事の計測方法を使いました

https://qiita.com/osamu1203/items/9160f5f4951ebe205ea3

**取得するJSON**
TwitterAPIのJSONを使用します
“`
https://api.twitter.com/1.1/users/show.json
“`

**HTTP通信**
“`Swift
// 構造体でパース
public func user_info(screen_name: String) async throws ->

元記事を表示

iOS ReactNativeでOpenUrlを使って設定アプリの好きな画面へ遷移させる方法

# 結論:rootが必要ない

OpenUrlで色んなアプリを呼び出せる。
“`
line://
fb://
“`
など

iOSの設定アプリを呼び出す方法でハマったのでメモとして残します。

ReactNativeのLinkingで呼び出す場合
“` 
export const openSetting = () => {
Linking.openURL(‘App-Prefs:APPLE_ACCOUNT&path=PASSWORD_AND_SECURITY’).catch(
err => Alert.alert(‘URLを開けませんでした。’, err),
);
};
openSetting()
“`

一度AppleSignInしたらFullNameが取れなくなるのでユーザーに解除してもう一度やって貰いたかったから調べました。

参考URL:
https://blog.thetheorier.com/entry/ios15-settings-urlscheme
https://github.com/FifiTheBulldog/ios-settings-url

元記事を表示

SwiftでFontファイルを読み込んで使う

# XCodeにFontファイルを取り込む
![スクリーンショット 2022-04-21 22.36.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/042dac2b-e15e-cab3-3bdc-5338998c0314.png)

– [x] Copy items if needed
– [ ] Create groups
– [x] Create folder referenses
– [ ] Add to targets

![スクリーンショット 2022-04-21 22.37.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/8ce9fd02-9d2d-3b0e-1bd7-815b5b7d2ed1.png)

こんな感じで取り込めたらOKです

# Info.plistでFontの設定
![スクリーンショット 2022-04-21 23.01.55.png](ht

元記事を表示

【Flutter】XcodeをアップデートしたらiOSシュミレーターでビルド失敗(domain=NSMachErrorDomain, code=-308)

# はじめに
タイトル通りですが、XcodeをアップデートしたくてmacOSも同時にMontereyにアップデートさせました。

するとアプデ前まで正常にシュミレーターでビルドできていたのに、?のようなエラーで失敗するようになりました。。。。

“`console
Unable to install /Users/userName/flutter/insta/build/ios/iphonesimulator/Runner.app on DE709473-59D9-47A3-AE88-A4F9A756EE21. This is sometimes caused by a malformed plist file:
ProcessException: Process exited abnormally:
An error was encountered processing the command (domain=NSMachErrorDomain, code=-308):
The operation couldn’t be completed. (Mach error -308 –

元記事を表示

iOS safariで「問題が繰り返し起きました」と出てページが表示できない場合の対応方法

## 事象
コンテンツが多い一覧ページをスマホのブラウザで開くと、

__https//hogehoge.comで問題が繰り返し起きました。__
__問題が起きたため、このWebページを再度読み込みました__

といった現象に遭遇した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308656/df3857fe-163a-ad6f-7144-98ebcaaaa24d.png)

【環境】
検証端末:iphone XS、iphone12Pro
iOS:15.4.1
Safari:15.4
Chrome:100.0.4896.85

## 詳細
調査の過程で以下のようなことがわかりました。
・PCブラウザでは発生しない(chrome、Safari、firefox)
・iOSのSafariだけでなく、iOS版のchromeでも似た現象になる
・キャッシュやcookieなどを削除しても現象は起こる
・webフォントやJSなどは使っていない
・ページ内のコンテンツ数を減らすと表示できる
・コン

元記事を表示

[SwiftUI 2.0] 忙しい人向けの #WWDC20 まとめ

以前、[note でまとめた WWDC2020 の記事](https://note.com/tobi462/n/n4755c3320183) へのリンクです。

最近、SwiftUI を触ってる関係で見直す機会が多かったのですが、note のマガジンだと検索性が悪かったのでまとめ直しました。

## SwiftUI
### [忙しい人向けの What’s new in SwiftUI](https://note.com/tobi462/n/n4f4e7a46f343)
* [App](https://developer.apple.com/documentation/swiftui/app)
* [Scene](https://developer.apple.com/documentation/swiftui/scene)
* [WindowGroup](https://developer.apple.com/documentation/swiftui/windowgroup)
* [Settings (macOS)](https://developer.apple.com/docum

元記事を表示

SPM対応していないライブラリをSPM Package内で利用する

サンプルプロジェクト

https://github.com/kntkymt/UseNonSPMFrameworkInSPMSample

# どんな状況?

`SampleView` と言う`target`で `Hoge` と言うライブラリを使いたい。しかし、`Hoge`はSPM対応していない。

“`swift:Package.swift
// swift-tools-version: 5.6

import PackageDescription

let package = Package(
name: “Package”,
defaultLocalization: “en”,
platforms: [.iOS(.v15)],
products: [
.library(
name: “SampleView”,
targets: [“SampleView”]),
],
dependencies: [
// SPM対応していない!
// .

元記事を表示

アラートダイアログ基本パターン

## 概要

UIAlertControllerによるダイアログの表示を、汎用クラスを作成し各画面から呼び出せるようにします。
一般的なボタン1つもしくは2つのダイアログを想定。
3つ以上のボタン構成や、テキストフィールド付きのダイアログは使用頻度が低いと考え汎用クラスの要件には含めていません。

## 基本的なダイアログの記述

“`swift:AlertDialog

let alert = UIAlertController(title:<#title#>, message:<#message#>, preferredStyle:UIAlertController.Style.alert)

alert.addAction(UIAlertAction(title: <#buttonTItle#> , style:UIAlertAction.Style.default){
(action:UIAlertAction)in
//ボタンが押された時の処理

})

alert.addAction(UIAlertAction(title: <#cancelButton

元記事を表示

CapacitorとCreate React AppでiOSアプリを作り実機実行するまで

CapacitorとCreate React AppでiOSアプリを作り実機実行するまでの手順。

## 環境

– MacBook Pro (16-inch 2019)
– macOS Monterey 12.3.1
– Xcode 13.3.1
– Node.js v14.17.1

## 手順
### 準備

まずcocoapodsをインストールする。

“`sh
sudo gem install cocoapods
“`

### プロジェクトの作成

“`sh
npx create-react-app my-app –template typescript # TypeScriptを使うかどうかは好みで
cd my-app
npm install @capacitor/core
npm install @capacitor/cli –save-dev
npx cap init # アプリ名等をここで質問されるので決める。後から変更もできる
npm install @capacitor/ios
npx cap add ios
“`

### 実行

“`sh
n

元記事を表示

OTHERカテゴリの最新記事