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

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

[iOS] [UIKit] async/awaitとCombineを利用したMVVMアーキテクチャのサンプル

# 前書き

私が最近参画したプロジェクトにおいて、MVVMアーキテクチャを採用しました。
その構造をイメージしたサンプルコードを共有します。

特に、
**async/awaitとCombineを利用することで、MVVMをiOS12以前よりもシンプルに実現できるようになった**
という点を共有したいです。

前提環境:
・Xcode 14.0.1
・Swift 5.7
・iOS 13以降

# Cocoa MVCとMVVMの違い(責務分割のイメージ)

## Cocoa MVC

![スクリーンショット 2021-02-06 8.50.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/ad32b5f2-84fe-8088-722d-58ddcb54c18e.png)

## MVVM

![スクリーンショット 2021-02-06 8.50.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12291

元記事を表示

【Swift】チュートリアルライブラリ使ってみた

# はじめに
チュートリアルを作成できるライブラリを使ってみたので基本的な使い方を紹介できたらと思います。

↓↓リポジトリはこちら↓↓

https://github.com/ephread/Instructions

# どんなライブラリ?
![Simulator Screen Recording – iPhone 12 – 2022-10-23 at 20.24.57.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/47bc24dd-03da-7b8a-cf8f-5c16bf1ac7c7.gif)

[こちら](https://apps.apple.com/jp/app/swipe-counter/id6443832677)のアプリで使用しているので是非インストールして実際に触ってみてください!

# 基本実装
“`swift
import UIKit
import SnapKit
// Instructionsをインポート
import Instructions

// Coac

元記事を表示

モバイルアプリの自動テストツールShiratesを使ってみよう(その2)

本記事はOSSの自動テストツール **Shirates(シラテス)** の紹介記事です。
[前回](https://qiita.com/wave1008/items/13e0c854002f6a58f354)の記事ではOSSの自動テストツールである**Shirates**を使うための環境構築とテストコードの実行方法について説明しました。

今回はAppiumと**Shirates**でどのような違いがあるのかをサンプルコードを使用して確認します。
**Shirates**はAppiumをドライバーとして使用していますが、Appiumの使いにくさを解消するための工夫が多数盛り込まれていることがわかります。

## サンプルコードの入手
まずはGitHubからサンプルコードを入手してください。

https://github.com/wave1008/shirates-samples-introduce1

ダウンロードしたプロジェクトのディレクトリ下に複数のサブプロジェクトがあります。
![image.png](https://qiita-image-store.s3.ap-northe

元記事を表示

【Swift】CaseIterableを使って列挙型の配列を取得する

# 実装
“`swift
enum WeatherCondition: String, CaseIterable {
case sunny
case cloudy
case rainy
}

print(WeatherCondition.allCases)

// [プロジェクト名.WeatherCondition.sunny, プロジェクト名.WeatherCondition.cloudy, プロジェクト名.WeatherCondition.rainy]
“`

# おわり
今回のサンプルは数が少ないのであんまり意味がないように思えますが、[TwitterAPIのエラーコード](https://qiita.com/SNQ-2001/items/604559ee38227cc134a3)のように大量にある場合は今回の方法が有効です。

元記事を表示

【Swift】端末の傾きを取得する

# はじめに
https://apps.apple.com/jp/app/%E6%B0%B4%E6%BA%96%E5%99%A8/id1621303604

以前、水準器を作成した際に使用した`CoreMotion`を使ってサンプルアプリを作ってみます。
簡単に端末の傾きが取得できるので是非試してみてください!

# 実装
“`swift
import SwiftUI
import CoreMotion

struct ContentView: View {
private let motionManager = CMMotionManager()
@State private var x: Double = 0.0
@State private var y: Double = 0.0
@State private var z: Double = 0.0
var body: some View {
VStack(spacing: 50) {
Text(“x: \(x)”)
Text

元記事を表示

iOS App Dev Tutorialsを読んで実際にやってみた。その2

## 前回の記事
 [iOS App Dev Tutorialsを読んでみた。その1](https://qiita.com/shomiya181210/items/5b6d261938f650509255) 前回の記事を読んだ後、この記事をごらんください。
## 今回の範囲
 [Using stacks to arrange views ](https://developer.apple.com/tutorials/app-dev-training/using-stacks-to-arrange-views)
 第2回目は実際にXcodeを使って会議タイマーの画面を作成してみる。
## 内容の要約
### 1. プロジェクトを新規作成する
####  Xcodeを開き新しいテンプレートを作る。
    SUI_010-010-020@2x.png[Swift] クロージャについて理解する

Qiita初めての投稿になります。Swift初学者Yasuと申します。
Swift学習歴5ヶ月ほどの初学者ですが、
自身の学習アウトプット、整理も含め投稿始めました。
今回はクロージャについてまとめました。

## クロージャとは
#### 処理を定義しつつ、周りのデータを取り込んで、後から実行できるもの。
みたいなイメージです。

初めはあまりピンとこないかと思いますが、
この記事を読み終える頃にイメージが湧いてると嬉しいです。

# クロージャの定義方法
“`closure.swift
{ (仮引数: 型,…) -> 型 in
文…
}

//関数の場合と比較
func 関数名(仮引数: 型,…) -> 型 {
文…
}
“`
こうして見て見ると、クロージャと関数の共通点がいくつかあるのが分かりますね。
クロージャと関数を見極めるポイントとしては、
– funcキーワードの有無
– 関数名の有無
– inの有無
– {}の位置

# クロージャを実行してみる
“`
//cにクロージャのイ

元記事を表示

【Swift】ループ内を並列処理する

# はじめに
DispatchQueueを使用しての並列処理の例はいくつも出てきますが、Swift Concurrencyでの並列処理の例はなかなか見つからなかったので記事にしておきます。

# DispatchQueue
“`swift
func sample1() {
let dispatchGroup = DispatchGroup()
let dispatchQueue = DispatchQueue(label: “sample”, attributes: .concurrent)
for i in 0..<10 { dispatchQueue.async(group: dispatchGroup) { Thread.sleep(forTimeInterval: TimeInterval(Int.random(in: 1...10))) print(i) } Thread.sleep(forTimeInterval: 1.0) } } ``` #

元記事を表示

Luma AIのスキャンシーン和訳

# はじめに
この記事は現在(2022/10/20)TestFlightで配信されている、ベータ版Lumaの記事になります。

https://lumalabs.ai/

ホームページの`waitlist`より、ベータテスターの申し込みができるので、興味のある方はぜひ応募してみてください。

# 内容

> Align the crosshair to the object you wish to scan and tap on screen.

スキャンしたい対象物に十字を合わせ、画面上をタップします。

【Flutter】iOSでバックグラウンドオーディオがうまく機能しない

audioplayers0.20.1 を使ってオーディオをバックグランドで再生しようとすると、iOSでうまく機能しない。
解決策が見つかったので書き残します。
“`info.plist
UIBackgroundModes

audio

“`
info.plistに上記を追加します。

“`Swift:AppDelegate.swift
import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRe

元記事を表示

iOS App Dev Tutorialsを読んでみた。その1

## この記事を始めた理由
AppleがiOSのチュートリアルを出していたので、これを全部やってアプリが作れるか試してみた。

## 今回の範囲
[Getting started with Scrumdinger ](https://developer.apple.com/tutorials/app-dev-training/getting-started-with-scrumdinger)
第1回目は今回やっていくチュートリアル、Develop apps for iosの概要を理解するための概要を読んでまとめてみる。

## 内容の要約
### 1. このモジュールについて
*  このチュートリアルではSwiftUIを使用する。
*  このチューとリアルでSwiftUIの基礎を学ぶ。

### 2. SwiftUIの概要
*  SwiftUIはあらゆるAppleのアプリ基礎を構築するための言語。
*  SwiftUIを使えばより早くより正確にエラーを少なくアプリを
作成することができる。
*  宣言的な構文でシンプルなSwiftを使用して画面に映される内容
を決定する。
*  構成的

元記事を表示

iOSアプリ配信時の流れ

## 前書き
2年前くらいにiOSアプリ開発した際にアプリ配信するまでの流れをすんなり理解できず、
いろいろ調査してまとめた資料を公開してみようと思い立ちました。

## 本題
資料といっても1枚絵にまとめた俯瞰図です。
個人で調べてまとめたものなので誤りがあるかもしれません。
また、配信方法に関してはよく変更されるようなので正確な情報は公式ページを参考にしてください。

![iOSアプリ配信方法俯瞰図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488612/a62af872-5b79-476d-3694-20951ce38aa0.png)

#### 用語補足
* Apple Developer Program(ADP):個人または企業が登録可能なメンバーシップ

* Apple Developer Enterprise Program(ADEP):企業のみが登録可能なメンバーシップ

* Apple Developer:アプリ開発に必要な機能を提供する無料Webサービス(ADP/ADEP必須)

元記事を表示

【Swift】Alamofireでasync/awaitを使う

# はじめに
「alamofire async」で検索すると`withCheckedThrowingContinuation`を使ってasyncを使用している記事が多く出てきますが、実は標準でasync/awaitを使えるみたいです。
今回はそのやり方を紹介できたらと思います。

# やりかた
### String
“`swift
let response = await AF.request(url, method: .get, headers: headers).serializingString().response
switch response.result {
case .success(let data):
print(type(of: data)) // String
case .failure(let error):
print(type(of: error)) // AFError
}
“`

### Data
“`swift
let response = await AF.request(url, method: .get, headers:

元記事を表示

dSYM Uploadが失敗する | dSYMが不足している

# Problem(s)
– 最新のXcodeではビットコードが非推奨になりビットコードをアップロードしなくなったアプリはApp StoreからdSYMファイルをダウンロードできなくなりました。CIでfastlaneの`download_dsyms`を使っている場合や手動でdSYMがダウンロードできなくなるとFirebase Consoleで「dSYMが不足している」とエラーが出てクラッシュログが見にくくなります。
– Firebase SDKに内包されているスクリプト`run`を使ってdSYMを直接Firebase Consoleにアップロードする方法がありますがこの方法には現時点でバグがありdSYMを探し出せない場合があります。

実際に多くのプロジェクトでdSYMの運用が一時的にXcodeから手動アップロードになっているのではないでしょうか?

# Solution

以下のURLが参考になります。

https://minidev.dev/blog/2022/09/30/upload-dsym-to-firebase-crashlytics-with-xcode-14/

元記事を表示

【Swift】Alamofireでカスタムレスポンスを作成する

# はじめに
AlamofireでAPIを叩いて`responseDecodable(of: StatusesShow.self)`でデコードされた結果を受け取る。
今までこの方法で使っていました。
この時返ってくる値は`Result`です。

例えばTwitterのAPIを叩いたとしましょう。
[TwitterError](https://qiita.com/SNQ-2001/items/604559ee38227cc134a3)を使いたいと思うとこのように美しくない実装になります。
“`swift
AF.request(url, method: .get, headers: headers).responseDecodable(of: StatusesShow.self) { response in
switch response.result {
case .success(let data):
print(data)
case .failure(_):
guard let d

元記事を表示

SwiftUIの赤は赤じゃない件

# はじめに
“`Swift
import SwiftUI
Color(.red) //…(1)
Color.red //…(2)
“`
(1)と(2)の違い、分かりますか?

## 答え
表示してみるとこうなります。
![red1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/c7cb3321-df91-be5d-e169-55eac3ae9bfb.png)
アプリを動かしてみたら、なんだか色が違う気がする…:thinking:
そんな時に思い出していただければ幸いです。:blush:

# 解説
“`Swift
Color(UIColor.red) //…(1)
Color.red //…(2) == UIcolor.systemRed
“`
書き下すとこうなります。
(1)は“`UIColor“`の“`red“`(Fixed colors)をColorに変換したものです。
(2)は“`red“`という名前ですが、“`UIColor`

元記事を表示

iOSでOSの文字サイズ設定を変更しても、ブラウザで文字の大きさが変わらない

iOSでは、設定の「画面表示とテキストサイズ」にある文字サイズ設定を変更したとき、iOSアプリで表示されている文字サイズを変更することができます。
しかしブラウザで表示しているwebサイトの文字サイズは(多くの場合)変わりません。

iOSのアプリケーション開発の文脈では、この文字サイズ可変について「Dynamic Type」と呼んでおり、予め用意されているtext styleを選択することで有効になります。
https://developer.apple.com/documentation/uikit/uifont/scaling_fonts_automatically

iOSのブラウザ上で、このDynamic Typeを有効にするためには`font:-apple-system-body;` の指定が必要になります。

### font:-apple-system-bodyで何が起きるか
* 文字サイズが、OSの設定値で上書きされる
* iOSでOSの設定がデフォルトの場合、16px > 17px
* 字体が-apple-systemと同様に変更される
* 英数

元記事を表示

SwiftUI のモディファイアの順序による結果の相違

# はじめに
SwiftUI は、ビューに対してモディファイアをメソッドチェーン形式で追加していくという統一的な操作ができるので、とてもわかりやすいですよね。
時にはモディファイアが多すぎて、見通しが悪くなることはありますが…。

簡単に扱えるモディファイアですが、順序には注意する必要があります。

# 検証環境
– macOS Monterey 12.6
– Xcode 14.0.0

# 実験
“Text“ に、“frame()“, “padding()“, “border()“ の 3 つのモディファイアを設定してみます。
設定順序の組み合わせは 3! 通りあります。

## サンプルコード
それぞれ、枠線を付けた同じサイズの “VStack“ 内に上記 3 つのモディファイアの順序を変えた “Text“ を配置しています。

“`swift
import SwiftUI

struct ContentView: View {
var body: some View {
VStack {
Text(“モディ

元記事を表示

【Swift】プロトコルを拡張して実装を任意化する

# 通常
“`swift
import UIKit

class ViewController: UIViewController, SampleDelegate {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .red
}
func sample() {
print(“サンプル”)
}
}

protocol SampleDelegate {
func sample()
}
“`
`sample()`を実装しないと下の画像のようにXcodeに怒られます
![スクリーンショット 2022-10-16 18.28.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/31381ebc-6278-3057-e43b-c52970ab2757.png)

# デフォルト実装
“`swift
import

元記事を表示

[Flutter] MacOSで_ClientSocketException: Connection faild が出たときの対応

## 経緯
Flutterアプリを作る際に、
[サンプル](https://docs.flutter.dev/cookbook/networking/fetch-data “Fetch data from the internet”)を参考にしながら
APIからJSONの値を取得して、その値をそのまま表示するサンプルを作るときに躓きました。

## 内容
`package:http/http.dart` を使って get をすると以下のようなエラーが出ました。

“`
_ClientSocketException (Connection failed)
“`

Exceptionの内容は以下の通り。(xxx.comは仮)

“`
Exception has occurred.
SocketException (SocketException: Connection failed (OS Error: Operation not permitted, errno = 1), address = xxxx.com, port = 443)
“`

## 対応
Flutterの[Ma

元記事を表示

OTHERカテゴリの最新記事