- 0.0.1. ID を持つエンティティにはIdentifiableを積極的に採用
- 0.0.2. 【Flutter】XcodeでCould not inspect the application package.というエラーと2日戦った話
- 0.0.3. [iOS][SwiftUI]API(クロージャとasync/await)を利用するViewModelクラスをテストする
- 0.0.4. 第3回iPhoneアプリ開発入門
- 0.0.5. 第2回iPhoneアプリ開発入門
- 0.0.6. 第1回iPhoneアプリ開発入門
- 0.0.7. 【Swift】オリジナルのSFSymbolを作成する
- 0.0.8. ARKitの3次元座標を画面上の2次元座標に変換する
- 0.0.9. Xcode13でUser-Difined Settingを使用して、debugとreleaseで値を切り替える
- 0.0.10. UICollectionViewCellのXIBからContentViewが消えた?
- 0.0.11. 【Swift】レビューについて
- 0.0.12. 「Command CompileSwift failed with a nonzero exit code」を乗り越える
- 0.0.13. 【SwiftUI】アラートがなんか使いずらい
- 0.0.14. CloudKitで自動連携されない問題の対策 CloudKit – “Invalid bundle ID for container”
- 0.0.15. iOS13〜のCompositionalLayoutsでバッジを表示する
- 0.0.16. リリース前にAppStoreリンクを知る方法
- 0.0.17. ServiceNowのServicePortalをiPadのWebViewで表示
- 1. WKWebViewでServicePortalを表示する
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の実機ビルドは成功するがインストール時に以下発生“`
DetailsUnable 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
まず、ボタンを装飾します。次のように書き換えます。
Buttonに「.buttonStyle(.borderedProminent)」とつけることで、Buttonの見た目を整えることができました。このような、Viewの見た目を整えるものをModifierといいます。ちなみに、Textについている「.padding()」は余白をつけるModifierです。
# 背景色を変える
次に、背景色を変更します。
# if文
前回は、ボタンを押すと押した回数だけ数字が増えました。では、今度は数字に上限を設けましょう。ソースコードの17行目あたりを下のように書き換えます。
# 必要なもの
– Mac# Xcodeのダウンロード
まず、MacにXcodeというアプリをダウンロードします。このアプリを使ってアプリ開発を進めていきます。
https://apps.apple.com/jp/app/xcode/id497799835?mt=12
上記のリンクをクリックして、App Storeでダウンロードしてください。これには時間がかかります。

今回はTwitterの公式から提供されている「[Twitter logo](https://about.twitter.com/en/who-we-are/brand-toolkit)」をSFSymbol化していこうと思います。# 手順1
初めに「circle」を選択します。
 {
let pointInDisplay = frame.camera.projectPoint(node.simdWorldPosition, orientation: .portrait, viewportSize: view.bound.size)
}
“`?
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.comCore 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」を選択します。
– 「
UICollectionViewCellのXIBからContentViewが消えた?

## はじめに
この前モブプロ?のようなことをやっていると `UICollectionViewCell` の XIB に `contentView` がない!なんでだ?ということがありました。## 現象
どうやら Library(右上の+ボタン)から追加すると `contentView` ありで生成され、クラスファイル作成時に Also create XIB file をチェックして追加すると `contentView` なしで生成されるようです。
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」を乗り越える

# いろいろな原因があるっぽい
https://qiita.com/Hyperbolic_____/items/e6f2f82acd559f6e1c79https://qiita.com/Kyome/items/67da66563fc15d48699e
https://qiita.com/wagatsuma1999pra/items/cdc08e2913d89e62b747
解決策で多かったのは
– Clean Build Folder
– XCodeの再起動
– /Library/Developer/Xcode/DerivedDataの削除
– Simulator再起動
– アプリをアンインストールこんなところでしょうか
# 他のエラーとの違い
エラー文に明確な原因が書かれていない
【SwiftUI】アラートがなんか使いずらい
# 標準アラート
“`Swift
import SwiftUIstruct 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 SwiftUIstruct 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からコンテナの選択を解除できる
③ 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に追加した状態からスタートします。 {
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 を空にする
## Info.plistの編集
`Information Property List > Application Scene Manifest > Scene Configuration > Application Session Role > Item 0`
Storyboard Nameを削除
// 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