- 1. [iOS]SwiftでLocalizable.stringsを動的に差し替える
- 2. SwiftUIでのプレビューをより便利にする
- 3. 【Combine】dropFirst(_:) オペレータを理解する
- 4. リモートでiOS開発(Xcode)をTeamsの遠隔操作を使ってペアプロする
- 5. Xcode でテストにタイムアウトを設定する
- 6. 別のFirebaseプロジェクトにアクセスしたい場合
- 7. 【iOS】新型コロナ(COVID19)についてのアプリは作ってはいけないって話
- 8. 【iOS × アーキテクチャ】iOSにおける、GUI/システムアーキテクチャとは?
- 9. SwiftUIで画面遷移を実装する
- 10. 【iPhone】一定秒数で切り替わる壁紙スライドショーをつくる【ショートカット】
- 11. 【RealityKit2】Object Captureを試してみよう!
- 12. SwiftUIアプリにダークモード設定を追加する
- 13. iPhoneのカメラでリアルタイム物体検出 CoreMLモデルをつかえばかんたん
- 14. RealmSwift の deprecated warning に対応した
- 15. Swift, iOSでGraphQLクライアントを導入する
- 16. SwiftUI内でUIViewControllerを使おう
- 17. Firebase Remote Configで強制アップデート
- 18. Mac + iOS で Charles を使う
- 19. DispatchGroupを使っていたら、「Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)」が発生
- 20. 視覚拡張だけがARじゃない! -音のAR-
[iOS]SwiftでLocalizable.stringsを動的に差し替える
# Swift で Localizable.strings を動的に差し替える
* 特に多言語対応しているiOSアプリでは、`Localizable.strings` を使ってアプリ内の文字列を管理している場合が多いと思います
* 私が作っているアプリでは、SwiftPM で作ったリソース用のモジュールがあり、`Bundle.module.localizedString` を使ってバンドルした文字列を取り出しています
* この方法では、翻訳データを更新するためには、アプリを再度ビルドする必要があります
* そこで、**動的に `Localizable.strings` を差し替える**仕組みを作ってみました# うまくいったやり方
* 実際に作成したコードはこちらです
* 文字列データは、`DynamicLocalize.localizedString` を使って取り出します“`swift
public class DynamicLocalize {
internal static func localizedString(_ key: String, _ table:
SwiftUIでのプレビューをより便利にする
# 概要
よく使うSwiftUIのプレビュー機能は実装を共通化しておくと便利です。
本記事では一例として以下の実装例を紹介します。– BoolPreview|Bool値のプレビュー
– ColorSchemePreview|外観モードのプレビュー
– LocalizedPreview|ローカライズ言語のプレビュー## BoolPreview
**利用例**
ViewのもつBool値の状態を切り替えてプレビューします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113553/ac65eb77-3c39-fe2c-52a0-26b7af0820be.png)
こんなふうに入れ子にして利用するのも便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113553/41138ab0-f715-d23e-23a0-0ef3f5f4fd46.png)
**実装**
【Combine】dropFirst(_:) オペレータを理解する
Combineを真面目に勉強しようと思い立った今年です。
というわけで、早速1つ目の記事を書こうと思います。Combine自体への興味はもちろん大きいのですが、
これを学習することでリアクティブプログラミングへの理解を深めたいという目的もあります。早速ですが、本題に入るにあたり少し前置きをさせてください。:pray:
学習する上で、「Combineをはじめよう」という宇佐美さんが書かれた本をよく読ませていただいています。
その本の中にこんな文章があります。> プログラマであれば、言葉であれこれ説明する前に、実際にコードを書いて動かしてみるのが理解が早いだろうと考えています。
私はその考えに則ったこの本の構成が非常に好みで、頭にすっと入ってきました。
なので、この記事でもそれを真似させていただきながら書いていこうと思います。Combineについて書く初めての記事なので、多少前置きが多いですが、
次回からは省略します。## 環境
【Xcode】13.1
【Swift】5.5
【macOS】Big Sur バージョン 11.4## 公式ドキュメントから理解する
リモートでiOS開発(Xcode)をTeamsの遠隔操作を使ってペアプロする
リモート作業でiOSアプリ開発のペアプログラミングをする環境をご紹介します。
# 環境
リモート作業, iOSアプリ開発, Mac, Xcode, Teams# 手順
1. (ドライバが)Teamsで画面共有をしておく
1. (ドライバが)Xcodeで実装を進める
1. (お互い)同じ画面を見ながらペアプログラミングをする
1. (ナビゲータが画面操作したい時は)Teams画面上部の「制御を要求する」をクリックし、ドライバの画面操作権限を要求する
1. (ドライバが)画面上部の「許可」をクリックすれば、ナビゲータが遠隔操作可能となる
1. (ナビゲータが)ドライバの画面を直接操作するTeamsの使い方は以下の記事がわかりやすいです。
[Teamsの画面共有の使い方と、共有画面を遠隔操作する方法を解説 | WEB会議DEどうでしょう](https://webmtg-dodesho.com/teams-screen-sharing/)# 役割
## ナビゲータの役割
以下の解説がとてもわかりやすいので転記させていただきます。
[ペアプログラミングのやり方 – Qiit
Xcode でテストにタイムアウトを設定する
## 概要
Swift 5.5 で入った Concurrency を使ったテストで、`await` 時に想定外のことが起きて結果が返ってこずテストが永遠に終わらないということが起こったので、テストにタイムアウトを設定する方法を調べてまとめました。
動作検証はすべて Xcode 13.2.1 で行いました。
## TestPlan を設定する
まず、タイムアウトを設定するために TestPlan を有効にします。タイムアウトの設定のみであればビルド時に特定のコマンドラインオプションを渡すことでも可能なようですが、細かく設定しようと思うと TestPlan を作ってしまった方が便利なのでそちらの方法をとることにします。
Xcode の window 上部の Scheme をクリックして `Edit Scheme…` から `Test` の `Info` タブを開きます。右下の方に `Convert to use Test Plans…` というボタンがあるのでこれをクリックします。
![image.png](https://qiita-image-store.s3.ap
別のFirebaseプロジェクトにアクセスしたい場合
# この記事を書いた理由
大体のアプリではクラッシュログとかを拾うためにFirebaseを組み込んでいるアプリが多いと思います。その場合は通常アプリ=Firebaseプロジェクトとなっていますが、例えば他のアプリとデータを共有したいとか別のFirebaseのプロジェクトにアクセスしたい場合が発生したので、共有のために貼っておきます。
ニーズが少ないのかあまり情報がなかったので、ちょっと苦労しました。と言っても数時間ではありますが。
# やり方
今回は事情があってObjective-Cのコードですが、Swiftの人は置き換えてみてください。
流れとしては、別のプロジェクトを指定するためには、GoogleService-Info.plistをまるっと使います。「OtherApp.plist」とでもリネームしてプロジェクトに取り込んでください。
そして、「OtherApp.plist」へのファイルパスを指定して、FIRAppのインスタンスを作成します。
こんな感じです。“`objectivec
@property (nonatomic, retain) FIRAuth *a
【iOS】新型コロナ(COVID19)についてのアプリは作ってはいけないって話
今年の年末年始にアプリを作ってAppStoreに公開しようとしたら見事に玉砕したので供養として、またiOSアプリ開発ビギナーが同じ目にあって欲しくないと思い、投稿します。
# はじめに
今年の年末年始に新型コロナウイルスについての簡単なアプリを作りました。どのようなアプリかというと、累計感染者数と重症者数、死亡者数等を画面に表示。体調管理や都道府県ごとの感染者数を調べてみることができるというアプリでした。
作成後、AppStoreに提出。次の日にAppStoreConnectで確認するとリジェクトされていました。
![スクリーンショット 2022-01-15 17.16.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707293/4f09951a-7da1-5a5f-3f32-67f3a0417100.png)# リジェクトとその内容
リジェクトされるのは、よくあること(?)なので特に驚きはしませんでした。なんなら、「お!やっぱ来たか」くらい。問題はその内容
>We found in
【iOS × アーキテクチャ】iOSにおける、GUI/システムアーキテクチャとは?
# 目的
`GUIアーキテクチャ` `システムアーキテクチャ` についてまとめること# 流れ
0. そもそも、アーキテクチャ とは?
1. GUIアーキテクチャ の例
2. GUIアーキテクチャ とは?
3. システムアーキテクチャ の例
4. システムアーキテクチャ とは?
5. モバイルアプリ開発における問題点
6. 5を解決するアーキテクチャ# 0. そもそも、アーキテクチャ とは?
**アプリケーションを開発する上で、開発者同士の共通認識を行うためのもの**開発者同士の共通認識とは?
→ 3つある① : クラスなどの要素の関係性整理
② : 伝達順序の整理
③ : 開発の規則性
**根幹にあるものは?**
`Presentation Domain Separation : プレゼンテーション領域の分離 ` という考え。
「システム本来の関心領域(ドメイン)を、UI(プレゼンテーション)から引き離す」 ということ。
`プレゼンテーション( =View )`, `ドメイン( =Model )` を分けて考えましょうね。 というもの。
※ プレゼンテー
SwiftUIで画面遷移を実装する
## 環境
Xcode13.2.1
Swift 5.5.2##基本的な画面遷移方法
**1. NavigationLink**
**2. sheet**
**3. フラグによるViewの切り替え**#1. NavigationLink
NavigationLinkはiOSの基本的なpush遷移になります。
以下のように実装します。“`swift
NavigationLink(destination: 遷移先のView) {
任意のView(このViewをタップすると遷移先に指定したViewに遷移する)
}
“`##実装例
### Viewのタップで遷移する方法
NavigationLinkの末尾のクロージャに追加したViewをタップすることで遷移するやり方です。
追加したViewは最初からタップ可能になっています。“`swift
struct ContentView: View {
var body: some View {
NavigationView {
NavigationLink(destina
【iPhone】一定秒数で切り替わる壁紙スライドショーをつくる【ショートカット】
# 本当に普通の壁紙スライドショー
この記事は**普通の壁紙スライドショー**を探していた**iPhoneユーザ**に向けられたものです。_iPhone 壁紙 スライドショー_ とググったときに散見される、オートメーションを利用した擬似的な仕組みではありません。タイムアウトと再帰処理を利用しただけの**本当に普通の壁紙スライドショー**です。![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2167550/87675bd0-9254-6247-1ba0-a159a8f6967f.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2167550/04b9844c-21ac-bbff-afe2-92674fccb760.png)
SwiftUIアプリにダークモード設定を追加する
SwiftUIアプリに、ユーザーがダークモードの設定を選ぶことができるプリファレンス設定を加えることができます:システムのスタイルに従うか、常にダークモードを使用するか、常にライトモードを使用するかを選択できます。
## ユーザーデフォルトへのユーザーの環境設定の保存(`@AppStorage`を使用)
ユーザーは、iOSシステムに追従するダークモード、常にダークモード、または常にライトモードを設定できます。
“`swift
enum DarkModeSetting: Int {
case followSystem = 0
case darkMode = 1
case lightMode = 2
}
“`ユーザーのプリファレンス設定を確定したり取得したりするには、`appearanceM
iPhoneのカメラでリアルタイム物体検出 CoreMLモデルをつかえばかんたん
#iPhoneのカメラで機械学習モデルによる物体検出をします
![Jan-14-2022 11-20-28.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/b394c085-e990-7db4-686d-3baed4acce06.gif)
#スマホで物体検出できれば、色々つかえそう。でも、難しいそう
機械学習ってむずかしいのでは?#手軽に使えるCoreMLモデルで今すぐやってみれる
アップルはiPhoneでかんたんに使えるCoreMLという形式を用意してくれています。
#手順
[アップルの公式モデルズー](https://developer.apple.com/jp/machine-learning/models/)や[CoreML-Models](https://github.com/john-rocky/CoreML-Models)などから物体検出モデルをダウンロード。
https://developer.apple.com/jp/machine-learning/mo
RealmSwift の deprecated warning に対応した
## 事象
先日、久しぶりに RealmSwift のバージョンアップをしたところ、下記のような警告が出るようになってしまいました。
“`swift
‘RealmOptional’ is deprecated: RealmOptionalhas been deprecated, use RealmProperty instead.
Use ‘RealmProperty’ instead
“`上記の警告を見て、`RealmProperty` の使い方を覚える必要があるかと思いましたが、実際はもっと良い解決方法が実装されていました。
## 解決方法
次のようなクラスがあったとした場合、
“`swift
class Sample {
let index = RealmOptional() // ここで警告が出る
}
“`下記のように直します。
“`swift
class Sample {
@Persisted var index: Int?
}
“`また、主キーにしたい場合や インデックスをつけたい場合は下記のように宣言で
Swift, iOSでGraphQLクライアントを導入する
# この記事について
iOSアプリでGraphQLサーバにアクセスするためのクライアントを実装するための導入を書きます。サーバ機能ではなく、クライアント機能の説明です。
– Swift
– iOS15
– Xcode13なお、サーバ側の実装については[【Go言語】はじめてのGraphQLサーバ実装 | gqlgen](https://qiita.com/hiroyky/items/4d7764172e73ff54f18b)も記述したのでご覧下さい。
# 手順
## Apollo-iosパッケージのインストールGraphQLのライブラリではおなじみのapolloを利用します。
XcodeのFile -> Add Packages を開き、apollo-iosを検索してインストールします。## スキーマ定義のダウンロード
### apolloコマンドのインストール
`apollo`コマンドがインストールされていなければインストールします。インストールにはnode.jsやJavaScriptでの開発でパッケージ管理でおなじみの`npm`を使います。(npmコマンドのインス
SwiftUI内でUIViewControllerを使おう
# 概要
SwiftUIがだんだんと使われてきている印象を受けますが、まだまだ世間ではUIViewControllerが使われているのも事実です。
ただ単にUIKitベースの画面を表示したいのであれば `UIViewControllerRepresentable` などを使えばいいのですが、
特にサードパーティがリリースしている広告SDKなどはUIViewControllerが必要な実装が行われているので、SwiftUI内で広告を出そうとする場合、工夫が必要になります。# SwiftUI内でUIViewControllerを取得
なるべくSwiftUIっぽくViewControllerを使おうと考え、以下のような形になりました。
ContainerViewがViewControllerを返してくれて、それを使って広告など、ViewControllerが必要なビューを表示していきます。“`swift
struct SwiftUIView: View {
var body: some View {
ContainerView { viewControl
Firebase Remote Configで強制アップデート
FirebaseのRemote Configを使用して強制アップデートを実装したので記事にします。
# 強制アップデートとは
アプリの新しいバージョンをリリースした時に、ユーザに必ずアップデートをして欲しい場合があります。
例えば、以下のような場合です。– 既存の機能に大幅な変更が加わった場合
– 致命的なバグを修正した場合この時、ユーザがアプリを立ち上げた際、ユーザにアップデートを促しアップデートを完了させるまでアプリの使用を事実上不可能にする処理が強制アップデートです。
アプリの使用を不可能にする処理としては、以下のようなアラートを出し、アプリストアへの遷移以外できなくすることなどが挙げられます。(ストアからアップデートせずに戻ってきても再度表示される)
![スクリーンショット 2022-01-12 20.12.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383380/72fa482a-180c-9e5c-f1ee-d85ad176d3ef.png)
また、強制アップデート
Mac + iOS で Charles を使う
## 概要
AdMobが表示されない原因調査のために、Charlesを使ったので手順を残しておきます。
## [Mac] Charlesをダウンロード&インストール
https://www.charlesproxy.com/latest-release/download.do
## [Mac: Charles] Proxy Settings
Proxy – Proxy Settings の HTTP Proxy を確認する。必要に応じて変える。
## [Mac: Charles] SSL Settings
SSL – SSL Proxy Settings の SSL Proxying の include に `*:*` を追加する。
## [Mac: Charles] Local IP Address
Help – Local IP Address の IP Address を控えておく。
## [iOS: Safari] 証明書ダウンロード
以下へアクセスし証明書をダウンロードする。
http://chls.pro/ssl
## [iOS: 設定] 証明書イ
DispatchGroupを使っていたら、「Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)」が発生
SwiftのDispatchなんちゃらで毎回詰まっていますが、今回もまた詰まったので
記録に残しておきます。多分記事にしておくくらいの苦労をしないと、また数ヶ月後にまた同じことで詰まる気がとてもしているからです!
(って自信持っていうことじゃないが笑)原因は単純ミスです。
# 発生していたこと
DispatchGroupを使用していたところ、
`Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)`
というエラーが発生・・・実際にプロジェクトで詰まったコードに似たサンプルを作りました。
Playgroundで実行できます。`Thread.sleep(forTimeInterval: 0.5)`の部分は実際はAPIがリクエストされている箇所でしたが、
今回はsleepに差し替えています。“`swift
import UIKitfunc getItems(
itemIds: [String],
completionHandler: @escaping ([String]
視覚拡張だけがARじゃない! -音のAR-
音をAR表現してみました。
昨年末に作ったコンテンツですが、せっかくなので共有します。# 音のAR
最近AirPodsProを使い始めたのですが、**ヘッドトラッキング機能**に驚きました。
右側を向くと正面から聞こえていた音が左側から聞こえます。映画を観ている時、どんなに頭を動かしてもディスプレイから音が聞こえてきます。**音の定位がずっと固定されているので、”その場にいる感”があり臨場感が高まります。**
(加速度センサーから頭の動きをトラッキングしているのですが、あの小ささの中に加速度センサーが載っているなんて驚きです…)頭の回転運動を検出して音の定位を固定できますが、**歩き回った時にも音の定位を固定できたら面白そう**だと思い、音のARを作りました。
ちょうどショッピングモールで、クリスマスツリーのイルミネーションやライトアップがされていたのでここに仮想音源を配置し、音のARを作りました。
![5.1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006690/9f4