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

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

ID を持つエンティティにはIdentifiableを積極的に採用

## before
“`
struct User: Decodable {
let id: Int
}

struct UserDataSource {
// 引数はIntであればなんでも受け入れるように見えてしまう。
func loadUser(for id: Int) -> User {
// 本来はDBなどから取得したものを返すなど
}
}
let user = UserDataSource().loadUser(for: 1)
“`

## after
“`
struct User: Decodable , Identifiable {
let id: Int
}

struct UserDataSource {
func loadUser(for id: User.ID) -> User {
// DBなどから取得したものを返すなど
}
}

元記事を表示

【Flutter】XcodeでCould not inspect the application package.というエラーと2日戦った話

掲題のエラーと戦い続け、とても単純な原因で休日を2日潰しました。
私及び読者が同じ轍を踏まないように戒めとして残しておきます。
※エラー原因が特殊だった可能性もあるので、あくまでも一例としてご理解ください。

## 結論 (原因)

**pubspec.yml**のassetファイルのパス指定ミスが原因。


before: **lib/asset/aaa/image**
after : **asset/aaa/image**

## 事象概要
– 半年ぶりに自分のアプリをアップデートしようと思い、各種プラグイン/Flutter/Gradle/Pod諸々全て最新に更新
– XcodeにてiOSの実機ビルドは成功するがインストール時に以下発生

“`
Details

Unable to install “Runner”
Domain: com.apple.dt.MobileDeviceErrorDomain
Code: -402653103
User Info: {
DVTErrorCreationDateKey = “2022-05-05 04:09:24 +0000

元記事を表示

[iOS][SwiftUI]API(クロージャとasync/await)を利用するViewModelクラスをテストする

## アプリ
SwiftUIにて、任意のユーザー名のGitHubリポジトリを取得し、スターの数が50以上のものをリスト表示します

## SwiftUIのターゲット構成
GitHubリポジトリを取得するAPIメソッドをクロージャとasync/awaitの2つ用意しました
また、APIを利用するViewModelクラス(GitHubRepositoryManager)をXCTestによる単体テストします

| クラス | 説明 |
|:-|:-|
| GitHubRepository | GitHubリポジトリのEntityクラス |
| GithubAPIClient | APIクライアント |
| GitHubRepositoryManager | リポジトリ一覧を取得するViewModelクラス |
| GitHubRepositoriesView | リポジトリ一覧を表示するViewクラス |

## GitHubリポジトリのEntityクラス
“`swift:GitHubRepository.swift
struct GitHubRepository: Co

元記事を表示

第3回iPhoneアプリ開発入門

# はじめに
今回は、カウンターアプリを装飾していきます。まず、前回のプロジェクトを開いてください。

# Modifier
まず、ボタンを装飾します。次のように書き換えます。

![スクリーンショット 2022-05-05 12.30.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366249/ccdff0db-36c1-c1fb-f0f2-3f3af50a7e8c.png)

Buttonに「.buttonStyle(.borderedProminent)」とつけることで、Buttonの見た目を整えることができました。このような、Viewの見た目を整えるものをModifierといいます。ちなみに、Textについている「.padding()」は余白をつけるModifierです。

# 背景色を変える
次に、背景色を変更します。
![スクリーンショット 2022-05-05 12.47.54.png](https://qiita-image-store.s3.ap-northeast-1.ama

元記事を表示

第2回iPhoneアプリ開発入門

# はじめに
今回は、前回作ったカウンターアプリを改良しながらプログラミングについて学びます。

# 前回作ったプロジェクトを開く
まず、前回作ったプロジェクトを開きます。Xcodeを起動すると表示されるこの画面の右側から、最近使ったプロジェクトを開けます。この画面が表示されない場合は、Xcodeを選択した状態で、「コマンド+シフト+1」キーを押します。
![スクリーンショット 2022-05-03 19.13.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366249/31d2e475-0bba-7285-4f1a-320267dfde2a.png)

# if文
前回は、ボタンを押すと押した回数だけ数字が増えました。では、今度は数字に上限を設けましょう。ソースコードの17行目あたりを下のように書き換えます。
![スクリーンショット 2022-05-03 19.57.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.co

元記事を表示

第1回iPhoneアプリ開発入門

# はじめに
この記事では簡単なカウンターアプリを作成して、プログラミング初心者向けにiPhoneアプリの作り方を解説します。
![スクリーンショット 2022-05-01 20.13.57.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366249/17c8ef26-816a-cf94-9014-2579f6b0c038.jpeg)

# 必要なもの
– Mac

# Xcodeのダウンロード
まず、MacにXcodeというアプリをダウンロードします。このアプリを使ってアプリ開発を進めていきます。
https://apps.apple.com/jp/app/xcode/id497799835?mt=12
上記のリンクをクリックして、App Storeでダウンロードしてください。これには時間がかかります。
![スクリーンショット 2022-04-22 18.54.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/

元記事を表示

【Swift】オリジナルのSFSymbolを作成する

# 素材
![スクリーンショット 2022-05-05 0.18.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/5a400211-3a69-4471-0893-ffc7179d0f0e.png)
今回はTwitterの公式から提供されている「[Twitter logo](https://about.twitter.com/en/who-we-are/brand-toolkit)」をSFSymbol化していこうと思います。

# 手順1
![スクリーンショット 2022-05-05 0.18.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/7d12d4bc-eba0-e8a7-e763-dc20a0af5b55.png)

初めに「circle」を選択します。

![スクリーンショット 2022-05-05 0.19.02.png](https://qiita-image-stor

元記事を表示

ARKitの3次元座標を画面上の2次元座標に変換する

# AR3次元座標が画面上の2次元座標のどのポイントに当たるのか

# ARKitで一発で取得

“`swift
func session(_ session: ARSession, didUpdate frame: ARFrame) {
let pointInDisplay = frame.camera.projectPoint(node.simdWorldPosition, orientation: .portrait, viewportSize: view.bound.size)
}
“`

?
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習/AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)

元記事を表示

Xcode13でUser-Difined Settingを使用して、debugとreleaseで値を切り替える

# 目次
– [はじめに](#はじめに)
– [環境](#環境)
– [実装方法](#実装方法)
– [さいごに](#さいごに)

# はじめに
個人開発したiOSアプリに「Google AdMob」を導入した際に、テスト環境と本番環境で値を切り替えたい場面がありました。
その際にXcodeで用意されている「User-Difined Setting」という機能が便利に活用できたので、今回記事にしてみました。

# 環境
– Xcode13.2.1
– Swift5

# 実装方法
実装方法は非常にシンプルです。

– XcodeのPROJECTを選択した状態で、「Build Settings」タブを選択し、「+」ボタンから「Add User-Defined Setting」を選択します。
![スクリーンショット 2022-05-04 18.58.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793562/62b11a42-6052-b919-144f-f3971931a58c.png)

– 「

元記事を表示

UICollectionViewCellのXIBからContentViewが消えた?

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

## はじめに
この前モブプロ?のようなことをやっていると `UICollectionViewCell` の XIB に `contentView` がない!なんでだ?ということがありました。

## 現象
どうやら Library(右上の+ボタン)から追加すると `contentView` ありで生成され、クラスファイル作成時に Also create XIB file をチェックして追加すると `contentView` なしで生成されるようです。

cell

Interface Builder の上のセルが XIB チェックで作成したセル、下のセルが Library から追加したセル

元記事を表示

【Swift】レビューについて

# やり方1
アプリ内でレビュー依頼を行う
“`Swift
import StoreKit // 必須

if let windowScene = UIApplication.shared.windows.first?.windowScene {
SKStoreReviewController.requestReview(in: windowScene)
}
“`

# やり方2
AppStoreのレビュー欄に遷移する
“`Swift
guard let url = URL(string: “https://itunes.apple.com/app/id{アプリID}?action=write-review”) else { return }
UIApplication.shared.open(url)

元記事を表示

「Command CompileSwift failed with a nonzero exit code」を乗り越える

![スクリーンショット 2022-05-03 0.20.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/7b36a943-fecc-924d-5032-26bdf164c45c.png)
# いろいろな原因があるっぽい
https://qiita.com/Hyperbolic_____/items/e6f2f82acd559f6e1c79

https://qiita.com/Kyome/items/67da66563fc15d48699e

https://qiita.com/wagatsuma1999pra/items/cdc08e2913d89e62b747

解決策で多かったのは
– Clean Build Folder
– XCodeの再起動
– /Library/Developer/Xcode/DerivedDataの削除
– Simulator再起動
– アプリをアンインストール

こんなところでしょうか

# 他のエラーとの違い
エラー文に明確な原因が書かれていない

元記事を表示

【SwiftUI】アラートがなんか使いずらい

# 標準アラート
“`Swift
import SwiftUI

struct ContentView: View {
@State var ShowAlert: Bool = false
var body: some View {
VStack {
Button(“アラート表示”) {
ShowAlert.toggle()
}
}
.alert(isPresented: $ShowAlert) {
Alert(title: Text(“アラート”), message: Text(“アラートが表示されました。”), dismissButton: .default(Text(“OK”)))
}
}
}
“`

# カスタムアラート
“`Swift
import SwiftUI

struct ContentView: View {
@State var ShowAlert: Bool

元記事を表示

CloudKitで自動連携されない問題の対策 CloudKit – “Invalid bundle ID for container”

CloudKitを用いてCoreDataをクラウドに自動バックアップしようとしたができない場合があった。

デバッグ画面を眺めていたら、「Invalid bundle ID for container」とあったのでこのエラーが出た場合の対策をメモしておく。

内部で紐付けがうまくいってないのか分からないけどこれで上手くいった!

## 対策
① Xcodeでコンテナの選択を解除する
② developer.apple.comでコンテナの選択を解除し、保存する

Certificates, Identifiers & Profiles→Identifiersから対象のアプリを選択すれば以下のような画面が現れる。
Editからコンテナの選択を解除できる

![Screen Shot 2022-05-02 at 15.35.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426420/76c7c1ba-d32f-e25e-6739-6a5834dc1a3f.png)

③ 2で選択を解除したコンテナを再度

元記事を表示

iOS13〜のCompositionalLayoutsでバッジを表示する

# はじめに
最近、AppStoreに公開されているアプリで「iOS13〜のサポート」というアプリが増えてきた印象です。
ってわけで、そろそろこの辺を今更ながらキャッチアップしていこうということで勉強したので、CollectionViewにバッジを表示する方法をまとめてみました。

# WWDC2019の動画で紹介されている
https://developer.apple.com/videos/play/wwdc2019/215

こちらのセッションの30分くらいからバッジに関する説明がされています。
この説明は、`iOS13〜のCompositionalLayouts`を使ってバッジを表示するという説明であり、実際にはこちらのコードだけでは動かないため、今回は、バッジを表示するために必要なすべてのコードをこちらの記事にまとめさせていただきました。

# 今回作る画面
リリース前にAppStoreリンクを知る方法

# はじめに
「アプリにシェア機能を付けたいけどまだリリースしてないからURLがわからない…」
「1回リリースしてから追加でシェア機能つけよう!」

今までこう思ってました。

しかし、リリース前にAppStoreのリンクを知る方法を見つけたので紹介します。

もしかしたら、自分だけが知らなかった可能性も…笑

# AppStoreのURL
AppStoreのURLはこのようになっています
https://apps.apple.com/jp/app/{アプリ名}/id{アプリID}

**必要な情報**
– アプリ名
– アプリID

上記2つをリリース前に知ることができればAppStoreURLをゲットです

# やっていく
### アプリID
App Store Connectに追加した状態からスタートします。

![スクリーンショット 2022-04-30 19.46.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1dbfdbe6-21c0-7dfa-bd39-d

元記事を表示

ServiceNowのServicePortalをiPadのWebViewで表示

WKWebViewでServicePortalを表示する

結論

公式ドキュメントに則って、URLにServicePortalのURLを貼り付ければWebViewでServicePortalを表示することが可能。

環境

Xcode : 13.2/iPad Air 5th/iOS : 15.3

実装方法

公式Docs : https://developer.apple.com/documentation/webkit/wkwebview

以下、コード。

“`
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {

var webView: WKWebView!

override func loadView() {
let webConfiguration = WKWebViewConfiguration()
webView = WKW

元記事を表示

Xcode Capabilities Background Modesのまとめ

# はじめに
iOSアプリのバックグラウンド動作は管理された配下で動作します。
そこで、CapabilitiesのBackground Modesの選択肢についてまとめてみます。

# 詳細
[Configuring Background Execution Modes](https://developer.apple.com/documentation/xcode/configuring-background-execution-modes)に概要は記載されています。
各項目は下記のように記載されています。

| 項目 | 詳細 |
| :——

元記事を表示

Storyboardを無効化する

## やること

– main.storybordの削除
– .xcodeprojの編集
– Info.plistの編集
– SceneDelegate.swiftの編集

## main.storybordの削除

main.storybordを削除するだけ

## .xcodeprojの編集

`General > Deployment Info`

Main Interface を空にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648522/c9145eb2-8271-4fb2-b8e7-e42be7b1802f.png)

## Info.plistの編集

`Information Property List > Application Scene Manifest > Scene Configuration > Application Session Role > Item 0`

Storyboard Nameを削除
![image.png](https://qi

元記事を表示

for/for in/forEach/enumeratedの処理速度について

enumeratedも含めての処理速度についての記事が見当たらなかったので、実験を兼ねての投稿。

## 確認に使用するコード
“`swift
let array: [Int] = Array(0…10000)

// for
var start = Date()
for i in 0 ..< array.count { print(i) } var elapsed = Date().timeIntervalSince(start) print("for : \(elapsed)") // for in start = Date() for i in array { print(i) } elapsed = Date().timeIntervalSince(start) print("for i

元記事を表示

OTHERカテゴリの最新記事