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

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

エラー処理についてすごく簡単にまとめてみた#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:

元記事を表示

UIImageViewでAspectFitを指定した時の画像サイズを取得する

`imageView.frame.size`でUIImageViewのサイズを取得するみたいに、`imageView.image.frame.size`のように取得したいができない、、、

## 方法
“`
import AVFoundation

gaurd let image = imageView.image else { return }
let frame = AVMakeRect(aspectRatio: image.size, insideRect: imageView.bounds)

print(“x = \(frame.origin.x)”)
print(“y = \(frame.origin.y)”)
print(“height = \(frame.size.height)”)
print(“width = \(frame.size.width)”)
“`

## 参考記事
https://developer.apple.com/documentation/avfoundation/1390116-avmakerect

https://blog.kishik

元記事を表示

[Swift] 配列の使い方

# 目次
– **配列の書き方**
– **空の配列を作成**
– **配列へのアクセス**
– **要素の検索**
– **要素の追加**
– **要素の削除**
– **要素のソート**
– **要素の絞り込み**

## 配列の書き方

配列の宣言には [ ] 記法を使うことができます。

配列を構成する1つ1つの値を「,」で区切って定義します。
“`
let numbers: [Int] = [3, 6, 123, 11, 45] //複数のIntを配列として格納している値
“`

## 空の配列を作成
“`
var emptyString: [String] = [] //String型の空配列
var emptyInt: [Int] = [] //Int型の空配列
“`
## 配列へアクセス
“`
var values = [“A”, “B”, “C”, “D”, “E”]

print(values[0]) // “A” が表示される

print(values[3]) // “D” が表示される

元記事を表示

Responderチェーンを辿る

bitFlyer システム開発本部 フロントエンド開発部 部長の林です。
マネジメント職ですが、気持ちは今もiOSエンジニアです。
この記事は bitFlyer Advent Calendar 2022 の10日目として書かれました。

優秀なiOSアプリエンジニアは画面を平面としてではなく階層として扱う、という持論があります。
ViewやViewControllerの階層が正しく設計され、あるべき層にあるべき情報が保持されていると、複雑な状態を伴うアニメーションにも耐えられる強度を持った美しいアプリが完成します。

さて、階層構造を基本とするUIKitですが、他にもう一つ興味深いデータ構造があります。

タイトルにもなった`Responderチェーン`です。

UIResponderはイベントハンドリングを担当するクラスで、UIViewやUIViewController, UIWindow, UIApplication, UIApplicationDelagateなどUIKitにおける主要なクラスはUIResponderを継承しています。

UIResponderはnextというプロ

元記事を表示

Flutter・webViewで、Webサービスをモバイルアプリ上に実装し、個別通知機能を追加した話

# ? はじめに ?
アドベントカレンダー参加したいなということで・・・
今日は、「Flutter × webView で開発したサービスに個別通知機能を追加」した話をします。
同じような境遇の方がいたら、ぜひ実装方針参考にしてみてください。
また、他の方法がある方はアドバイスお願いします。

# ? 背景 ?
現在、会員制ECサービス Pantrii のバックエンド兼クライアントエンジニアをやっています。
こちらのサービスは「オンライン版コストコ」というキャッチフレーズで活動しています。

https://prtimes.jp/main/html/rd/p/000000005.000084659.html

こちらのECは主にアプリ利用をメインターゲットにしており、開発に Flutter を用いています。
是非、記事を読む際に、下記からアプリをダウンロードして触りながら読んでみてください。
– [iOS](https://apps.apple.com/jp/app/pantrii-%E3%83%91%E3%83%B3%E3%83%88%E3%83%AA%E3%83%BC-%E3%82

元記事を表示

Visual Regression Testingを導入してみた(iOSアプリ)

この記事は[レコチョク Advent Calendar 2022](https://qiita.com/advent-calendar/2022/recochoku)の10日目の記事となります。

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

# はじめに

最近学生時代の友人と会い、昔やっていたギターの熱が再熱してきました村田です。
株式会社レコチョクでiOSアプリ開発をしています。

Visual Regression Testing(以下VRT)をタワーレコード株式会社と弊社が共同で開発してる
TOWER RECORDS MUSICという音楽サブスクリプションサービスのiOSアプリに導入したので、
それを紹介しようと思います。

https://music.tower.jp/

# VRTとは?

特定の時点でのUIのスクリーンショットをピクセル単位で比較し、差分を検知する回帰テストです。

CIと連携してPR毎に自動でテストを実行することでデグレの検知ができるため、非常に高い効果を発揮します。

# 導入検討時の課題は?

元記事を表示

ラクマ夏のインターン2022に参加してみて

# 初めてに

ラクマの iOS Mobile Developer チームで約3ヶ月インターンしました。3ヶ月いろいろ経験させてもらい、本当にあっという間に過ぎてしまいました:sob: 

せっかくなので、このインターンの感想を書いてみました。

# 感想

## きっかけ

このインターンはボスキャリという海外大の留学生用のキャリアサイトで見つけ、応募しました。

応募は英語のレジュメを出すだけでとても楽でした。そのあとは簡単なコーディングテストをし、面接に進むことができました。私は日本の面接はすごくお堅いイメージがあって、すごく緊張していましたが、実際やってみると志望動機なのではなく今まで何をやってきたかというのをメインで聞かれたので話しやすかったです。

今回はインターンのために日本に戻るということで、**楽天側が飛行機などの手続きをしてくれ**て、とても助かりました!人事の人もこまめに連絡を取ってくださり、ありがたかったです。

## インターン

インターンはほぼリモートで家から出ることなく仕事ができたので快適でした。もちろんオフィスも広々としていて、動く机もあり居心地が良

元記事を表示

【SwiftUI】Textに長押しメニューを追加する

# はじめに
iOS15からTextに長押しできる機能が追加されてました。
意外と使えそうなので記録しておきます。

# サンプル
![スクリーンショット 2022-12-09 18.46.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/3a4b28c9-f43c-9540-38e9-c6e637ad1ae2.png)

# 実装
“`diff_swift
import SwiftUI

struct ContentView: View {
var body: some View {
Text(“テキスト”)
+ .textSelection(.enabled)
}
}
“`

# おわり
他にも良さそうな機能があったら記事にします

元記事を表示

SpriteKitで2D横スクロールゲームをつくろう(その5)

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

## はじめに
[前回](https://qiita.com/am10/items/90e3a2f58ae88e4ad6c4)の続きです。

今回はついにゴール作成です:sunglasses:

## 実装
ゴール判定は迷ったのですが指定のブロックに接触したらゴールしたことにします。

横に 50 個ブロックをならべているので最後の3つのブロックを判定に使います。

### クリア画面作成
クリア画面を作成します。

“`swift
final class ClearScene: SKScene {

private let jumpTextures: [SKTexture] = [
.init(imageNamed: “j1”),
.init(imageNamed: “j2”),

元記事を表示

@dynamicCallableのdynamicallyCallはasync/awaitでも使える

# 概要

タイトルそのままですが、Swiftの`@dynamicCallable`を使う上で実装が必要になる`dynamicallyCall`で、async/awaitが使えます。

## dynamicCallableについて

dynamicCallableはSwift 5で追加された機能です。
`@dynamicCallable`がマークされた型のインスタンスは、好きな名前で引数をつけて関数呼び出しが可能です。

`@dynamicCallable`がマークされた型は`dynamicallyCall(withArguments:)`もしくは`dynamicallyCall(withKeywordArguments:)` のfuncを実装します。

dynamicallyCallは、引数の名前によって動作させることができます。dynamicallyCallは好きな返り値を設定することができます。

“`swift
@dynamicCallable
struct Foo {
func dynamicallyCall(withKeywordArguments pairs:

元記事を表示

【Swift】iOSでStableDiffusionを使ってみた

# はじめに
AppleからStableDiffusionのCoreML変換バージョンが公開されました。
StableDiffusionに興味があったので使ってみました。

https://github.com/apple/ml-stable-diffusion

しかし、READMEに記載されている方法だと貧弱メモリのMacBookではできなかったので、貧弱MacBookでもできる方法を紹介します。

# サンプルアプリ
今回のサンプルアプリはこちらです。

以下の設定ができます。
– Prompt
– Image Count
– Step Count
– Seed
![スクリーンショット 2022-12-08 22.03.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/6c20fa77-c559-9656-03ba-3b46c631723a.png)

ちなみに「StepCount」を50にすると生成までに1時間くらいかかります笑

この例では「StepCount」は5で実行して

元記事を表示

SwiftUIとUIKitが共存している環境でカスタムダイアログを作ろうとして踏んだ罠

現状(2022/12現在)のSwiftUIでは`alert`にカスタムViewを設定することができません。
そのため、UIKit時代のようにカスタムダイアログを作ろうとすると力技[^1]になりがちです。
[^1]:https://qiita.com/yyokii/items/ec984833c4d040001fca

しかし、UIKitとSwiftUIを共存させようとしているプロジェクトでカスタムダイアログを作ろうとした際に思わぬ引っ掛かり方をしたので共有します。

# 何が起きたか
## やったこと
StackOverflow[^3]を参考にカスタムViewをセットできるViewModifierを作りました。
[^3]:https://stackoverflow.com/questions/66547657/swiftui-full-screen-view-over-navigationbar-and-tabbar

※だいぶ端折ってますがそれでも長いので畳んでます

CustomDialog.swift

“`s

元記事を表示

PC,モバイル,VRに対応したマルチプラットフォームアプリのリリースフロー

この記事は [クラスター Advent Calendar 2022](https://qiita.com/advent-calendar/2022/cluster) 8日目の記事です。
昨日は @UnlimitedBuildWorks さんの [私とEyePhoneの出会い](https://qiita.com/UnlimitedBuildWorks/items/0952ad190f0052d532bb) でした。
30年前からHMDが存在していたのに驚きですね!!

こんにちは!クラスター株式会社でSoftware Engineerをしているizumiです。
私は現在主にiOS/Unityの開発と、アプリのリリース担当をしています。

# clusterの対応プラットフォーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117503/6a1a6686-e1a9-0030-9a32-c53a5f979c43.png)

「cluster」は、VRからスマホまでどこからでも遊べるメタバー

元記事を表示

SpriteKitで2D横スクロールゲームをつくろう(その4)

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

## はじめに
[前回](https://qiita.com/am10/items/8729f77f3ee512a86052)の続きです。

今回はさみしかった画面に敵キャラを登場させます:smiling_imp:

## 素材準備
敵キャラはマヨネーズにしました(とくに意味はありません)。

| m1 | m2 | m3 |
| — | — | — |
|![m1](https://user-images.githubusercontent.com/34936885/205437544-999592a3-0c88-4230-a93f-0e86305d043a.png)|![m2](https://user-images.githubusercontent.com/34936885/205437608-8a3310

元記事を表示

iOS&AndroidのSDK開発で心がけていること

## はじめに
:::note info
この記事は、[Supershipグループ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/supership) 8日目の記事になります。
:::
## 自己紹介

![logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608850/18517075-7d09-448b-6704-5a9a23b69b94.png)
[Ad Generation](https://supership.jp/business/adgeneration/)というプロダクトで、
iOS/Androidアプリ向けのSDKを開発している、 @napo と申します。

普段は .xcframeworkと.aarを開発して過ごしています。

## なんの記事?

業務で、「モバイルアプリ向けのライブラリを開発する」という、あまり馴染みの少ないポジションについて、
日々、どんなことをやっていて、どんな気付きがあるか、

元記事を表示

OTHERカテゴリの最新記事