iOS関連のことを調べてみた2023年07月31日

iOS関連のことを調べてみた2023年07月31日

@_dynamicReplacementを動的にロードして挙動を差し替える

# @_dynamicReplacementを持つframeworkを動的にロードして実装を差し替える
Swiftは@_dynamicReplacementの仕組みを使い、dynamic修飾子が設定されたメンバの実装を差し替えることができます
この仕組みは、**SwiftUIのPreview**などに活用されているようです
そこで、@_dynamicReplacementの基本的な挙動を確認し、@_dynamicReplacementが設定された実装を含むモジュールがロードされたタイミングで実装が差し替わるという特徴を生かし、frameworkを動的に読み込むことで、動的に挙動を差し替えるのを試してみました

:::note warn
この記事は@_dynamicReplacementの挙動を確認することを目的としており、frameworkを動的にロードする仕組みをプロダクトに導入することを推奨するものではありません
:::

# @

元記事を表示

【Carthage】Xcode14.3以降でcarthage bootstrapが失敗する?

こんにちは。withでiOSエンジニアをしている長尾( @zrn-ns )です。

突然ですが、最近Xcodeを14.3以上にアップデートしたらCarthageのビルド(carthage bootstrap)が通らなくなった… って方、結構多いんじゃないでしょうか。

今回はこの問題について、弊社で行った対応についてお話します。

# どんなエラーが出るのか

今回解説する問題については、既にCarthage公式でIssueが起票されています。

しかし現状その対処方法について、公式からのアナウンスはありません。コラボレーターの方も忙しいんでしょうね…。

https://github.com/Carthage/Carthage/issues/3333

具体的な現象としては `carthage bootstrap` を実行すると下記のようなエラーが発生します。(上記Issueから引用です)

“`shell
Build Failed
Task failed with exit code 65:
/usr/bin/xcrun xcodebuild -workspace /

元記事を表示

【SwiftUI】matchedGeometryEffectを使って拡大機能を作成する

# はじめに
`@Namespace`と`matchedGeometryEffect`を使って滑らかなアニメーションを実装することができるので拡大機能を実装してみました

# サンプルアプリ
![Simulator Screen Recording – iPhone 14 Pro – 2023-07-30 at 22.58.30.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/fa5da798-f863-780c-ba6d-f349063d0733.gif)

# 実装
“`swift
import SwiftUI

struct ContentView: View {
@State private var selectedEmoji: String?

@Namespace private var namespace

private let emojis = [“☺️”, “?”, “?”, “?”, “?”, “?”, “?”, “?‍?”, “?”

元記事を表示

iOS14以降のUniversal Links開発時のTips

今更ながら、Universal Links開発時に少しつまづいたポイントのメモ。

## Universal Linksのおさらい

Appleが提供する、いわゆるディープリンクの手法の一つです。これによりウェブサイトURLから直接アプリ内のコンテンツを開く、といったことが可能になります。あるいは、カメラからQRコードを読み取った際に表示されるリンクから、アプリに遷移することも可能です。(未インストールの場合とインストール時の場合で表示されるリンク・タップ時の挙動が異なります)

最低限必要になる実装は2つあります。
1. TARGETS → Signing & Capabilities → Associated Domains を有効にし、`applinks:{domain}` の記載を追加
1. `apple-app-site-association` をサーバーに配置

“`apple-app-site-association.json
{
“applinks”: {
“apps”: [],
“details”: [
{

元記事を表示

各パーツにアニメーションを付与する(SwiftUI)

こんにちは。[フエルマネー](https://apps.apple.com/us/app/%E3%83%95%E3%82%A8%E3%83%AB%E3%83%9E%E3%83%8D%E3%83%BC/id6446435231)開発者です。

[前回](https://qiita.com/yoshi-eng/items/91666637cd7cdd8edf88)はNavigationStackを使った画面遷移設計を行いました。
続いては、Viewに用いる共通パーツ(コンポーネント)を作成していきます。

そうです、ここに来てもまだメインのView構成はしません。周りからしっかりと固めていくのが最近の僕のスタイルです。

# .animation(_:value:)とは
iOS16時点で推奨されているアニメーションのためのモディファイアです。
アニメーションさせたいViewにくっつけて使用します。
![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/54c67972-1acc-722c

元記事を表示

Macでスマホアプリ開発への道(1)

今回は、画面上に三つの四角形を垂直に並べ並べ横と縦の長さを変えながら表示させてみた。
VStackで垂直
HStackで並行に
ZStackでZ軸方向に積み立て
.foregroundColor(.色)でカラーの指定
.frame(width: 幅, height: 高さ)
![スクリーンショット 2023-07-30 12.42.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522639/6ac9fb2b-e120-169b-460e-9a59c193020b.png)

元記事を表示

SwiftUIでindexによってリストの見た目を変える実装方法

現在SwiftUIを勉強中なので、さまざまなUIを実装しています。
今回は、SwiftUIでindexによってリストの見た目を変える実装をしてみました。

Xcode Version 14.2

“`EditListView.swift
struct EditListView: View {
@State private var tee = [“緑茶”, “烏龍茶”, “ほうじ茶”, “ジャスミン茶”, “麦茶”, “烏龍茶”, “ほうじ茶”, “ジャスミン茶”, “麦茶”, “烏龍茶”, “ほうじ茶”,
“ジャスミン茶”, “麦茶”, “烏龍茶”, “ほうじ茶”, “ジャスミン茶”, “麦茶”, “烏龍茶”, “ほうじ茶”, “ジャスミン茶”, “麦茶”]

var body: some View {
VStack(spacing: 0) {
Divider().background(Color.brown).padding(.top, 10)
List {

元記事を表示

【SwiftUI】Viewの更新をプリントする

# はじめに
謎のバグに遭遇する時は意図しないタイミングでViewに更新がかかってるからかもしれません。
Viewの更新を知る方法を2つ知ったので記事にしておきます。

# 方法1
“`swift
import SwiftUI

struct ContentView: View {
@State private var count = 0
var body: some View {
VStack(spacing: 50) {
let _ = print(“Viewを更新しました”)

Text(count.description)

Button {
count += 1
} label: {
Text(“カウントアップ”)
}
}
}
}
“`

“`
Viewを更新しました
Viewを更新しま

元記事を表示

【Swift】enumの値をランダムで返す

# はじめに
enumで定義した値をランダムで取得したい時の方法です。

# 実装
“`swift
enum Sample: Int, CaseIterable {
case one = 0
case two = 1
case three = 2

static func random() -> Sample {
Sample(rawValue: Int.random(in: 0…Sample.allCases.count)) ?? .one
}
}
“`

# 使い方
“`swift
print(Sample.random())
“`

# おわり
enumをIntに準拠させて、`Int.random`を使ってenumをランダムに取得します

元記事を表示

【TCA】Reducerの共有ロジックの実装パターン

# アクションを送信して共有ロジックを呼び出すのはアンチパターン
[公式ドキュメント](https://pointfreeco.github.io/swift-composable-architecture/main/documentation/composablearchitecture/performance#Sharing-logic-with-actions)で言及されていますが、**共有ロジックを呼び出すためにアクションを送信するという実装パターンは非推奨**とされています。
TCAにおいてアクションを送信するというのはパフォーマンス観点で高いコストを伴う処理であるためです。

以下は公式から引用したコードですが、`.sharedComputation`というアクションに共有ロジックが実装されており、この共有ロジックを使用するために他のアクションから`.sharedComputation`アクションが送信されています。

“`swift
switch action {
case .buttonTapped:
state.count += 1
return .

元記事を表示

NavigationStackを一番活かす人(SwiftUI)

こんにちは。[フエルマネー](https://apps.apple.com/us/app/%E3%83%95%E3%82%A8%E3%83%AB%E3%83%9E%E3%83%8D%E3%83%BC/id6446435231)開発者です。

この度コードを1から書き直すという暴挙に出た次第ですが、[前回](https://qiita.com/yoshi-eng/items/52f7b9aa1d8d7826bdba)に引き続いて次に行うことはズバリ、画面遷移設計ですね。

# NavigationStackとは
iOS16時点で推奨されている、画面遷移のためのViewです。
以前のNavigationViewを使っていて、なかなか移行に腰が上がらない人もいるでしょう。僕も当初はNavigationViewの機能だけで済ませようと思っていました。

でもここでついていかないと、時代に取り残されて未だにObjective-Cで開発している人の二の舞になると思ったので移行しました。

意外と楽しいので、ここで使いこなせるようになっておきましょう。

# 何ができるの?
NavigationSt

元記事を表示

Flutter?audioplayers を使ったのに ios, android 端末で音が鳴らない、小さい時の対処法

AudioPlayer の Global 設定を変更する必要があります。

下記のような関数を作成した場合、

初期化(initialization)時に

`initAudioPlayer()`

を実行してください。

下記のコードはゲームSE を鳴らす場合を想定した設定項目です。

“`
import ‘package:audioplayers/audioplayers.dart’;

final AudioContext audioContext = AudioContext(
iOS: AudioContextIOS(
category: AVAudioSessionCategory.ambient,
options: [
AVAudioSessionOptions.defaultToSpeaker,
AVAudioSessionOptions.mixWithOthers,
AVAudioSessionOptions.allowAirPlay,
AVAudioSessionOptions.allowBlu

元記事を表示

SwiftUIでFirebaseAuthenticationを使用したログイン機能作成

こんにちは。今回はFirebaseAuthenticationを使用して、ログイン機能を作成するやり方について書いていきたいと思います。

## Firebaseの設定について

#### まず初めにプロジェクト作成の手順から
![](https://storage.googleapis.com/zenn-user-upload/0d47f4d4f3f9-20230205.png)
名前はプロジェクト名前なんかを書いたほうが分かりやすくていいと思います

![](https://storage.googleapis.com/zenn-user-upload/b2e5e71b31f0-20230205.png)
アナリティクスに関しては無料で使用でき、優れているので導入するのをオススメします

![](https://storage.googleapis.com/zenn-user-upload/964cfc06c177-20230205.png)
アナリティクスのアカウントは元から用意されてあるものを選択してください

これでFirebaseのプロジェクトは完成したと思います。
次に、

元記事を表示

【Swift】カスタムのPrefixOperatorを作成する

# はじめに
デバッグを楽にするためにPrefixをカスタムします

# 実装
“`swift
prefix operator ~~ // ここは記号のみ

extension String {
static prefix func ~~(_ str: String) -> String {
return “✅: \(str)”
}
}
“`

# 使い方
“`swift
import SwiftUI

struct ContentView: View {
var body: some View {
Button {
print(~~”テスト”)
} label: {
Text(“プリント”)
}
}
}
“`

# 出力
“`
✅: テスト
“`

# おわり
`prefix operator`なんて初めて知りました

元記事を表示

iOSのBluetooth通信サンプル(セントラル)

## 本記事について

[【M5Stack】段階的に動かして学ぶBluetooth通信](https://qiita.com/Teach/items/629c338da05a3134a1eb)

上記の記事のセントラルを iOS の CoreBluetooth で置き換えた。
その際に学べたことと、コードをまとめる。

## 環境

macOS Venture 13.3 (M2)
Xcode 14.3
iOS 16.5
M5Atom S3 (ペリフェラル)

## 前提

https://qiita.com/Teach/items/a547e1383680c8372339#%E3%83%86%E3%82%B9%E3%83%88%E7%94%A8%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AA-%E3%81%A8-macos%E7%94%A8%E3%81%AE%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%92%E4%BD%9C%E3%82%8B

上記の記事で作った以下のリポジトリを使う。

https:/

元記事を表示

【SwiftUI】Pull-to-Refreshの実装

# はじめに
`refreshable`を使ったことがなかったので簡単なサンプルを作成してみました

# サンプルアプリ
![Simulator Screen Recording – iPhone 14 Pro – 2023-07-26 at 20.47.34.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1cd3da1a-8140-90ea-9f4b-9df849d9a4a8.gif)

# 実装
“`swift
import SwiftUI

struct ContentView: View {
@State private var items: [String] = [“サンプルセル”, “サンプルセル”]
var body: some View {
List {
ForEach(items, id: \.self) { item in
Text(item)
}

元記事を表示

【読書感想】SwiftUIたった2日でマスターできる〜前編〜

## はじめに
こんにちは、@taikiti(たいきち)です!

今回は、学習中のSwiftUIについて、参考書から得た知識をまとめていきます。

このあと紹介する参考書やSwiftUIが気になっている方は、ぜひ読んいただければと思います。

ちなみに、想像以上に学ぶことが多かったので、記事は2部構成にしようと思います。

## 学習中の参考書
この記事は「[たった2日でマスターできる iPhoneアプリ開発集中講座](https://www.amazon.co.jp/gp/product/B0BJQ6RN44/ref=ppx_yo_dt_b_d_asin_title_o02?ie=UTF8&psc=1)」で学習した内容のふりかえりとなります。

**要約ではないため、この記事を読むだけではアプリを開発することはできません。**
あらかじめご了承ください。

本書では、「2日でSwiftUIをマスターする」ということを目的としています。(もちろん基礎知識のみ)

1日目と2日目の2部構成になっており、プログラミング経験のある方なら、ちょうど2日で一通り完了できると思います。

僕は、

元記事を表示

【Swift】viewDidLoad時の画面遷移

## はじめに
UIViewControllerの“viewDidLoad“で画面遷移したい!と思って色々調べたのでメモします。

## 結論
**結論から言うと、`viewDidLoad()`内での画面遷移はできません!**
じゃあどうすればいいのかというと、`viewDidAppear(_ animated: Bool)`を使用します。
そもそもviewDidLoadとは、“画面の読み込みが完了した後“に呼ばれるメソッドなので、そこで画面遷移をしようとしても遷移する画面が無いのでできないわけです。
そこで、viewDidAppearの登場です!
viewDidAppearとは、“画面が表示された後“に呼ばれるメソッドです。
そのため、以下のようにメソッドを追加して画面遷移の処理を書くことで、既に遷移される画面は存在した状態で処理が走るので遷移可能というわけです!
“`Swift:viewDidAppear追加
override func viewDidLoad() {
super.viewDidLoad()

}
override func viewDidAp

元記事を表示

【翻訳】Everything you need to know about Memory Leaks in iOS

![](https://storage.googleapis.com/zenn-user-upload/c3c77e62a5a9-20230720.png)

ARC と iOS のメモリー・リークについて知っていれば、セクション2から始めることができます。この記事はとても長いので、今回はこのセクションから見ていくことにします

1. iOS のメモリリークとは何か

2. なぜメモリリークが起こるのか

3. ARC がメモリを解放できない仕組み

4. クロージャのメモリリーク

5. 可能な解決策

6. 特殊なシナリオ(シングルトンと静的クラスのメモリリーク)

7. エスケープされないクロージャ

8. weak と unowned の違い

9. メモリグラフデバッガを使ったリークの特定

10. いくつかのルール

Swift は、アプリのメモリ使用量を追跡し、管理するために自動参照カウント(ARC)を使用します。ほとんどの場合、これはメモリ管理が Swift で “単に動作する “ことを意味し、メモリ管理について自分で考える必要はありません。 ARC は、クラスインスタ

元記事を表示

【SwiftUI】Twitterの投稿ボタンを再現する

# はじめに
Twitterの右下にある投稿ボタンを作ってみます。
押すと色は変化せず、大きさが変化するようなボタンのスタイルです。

# サンプルアプリ
![Simulator Screen Recording – iPhone 14 Pro – 2023-07-25 at 21.41.20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a805261b-da68-ed30-c142-2bf544810df0.gif)

# 実装
“`swift
struct TwitterPostButtonStyle: ButtonStyle {
func makeBody(configuration: Configuration) -> some View {
configuration.label
.foregroundStyle(.white)
.frame(width: 60, height: 60)

元記事を表示

OTHERカテゴリの最新記事