- 1. SwiftUIでルビを振るために必要なこと
- 2. ARでメタバース 巨大ロボットを出現させる
- 3. “rvictl”が”FAILED”になったときの解決策
- 4. [Mac]Flutterで保存したドキュメントのpath
- 5. [iOS]SwiftでLocalizable.stringsを動的に差し替える
- 6. SwiftUIでのプレビューをより便利にする
- 7. 【Combine】dropFirst(_:) オペレータを理解する
- 8. リモートでiOS開発(Xcode)をTeamsの遠隔操作を使ってペアプロする
- 9. Xcode でテストにタイムアウトを設定する
- 10. 別のFirebaseプロジェクトにアクセスしたい場合
- 11. 【iOS】新型コロナ(COVID19)についてのアプリは作ってはいけないって話
- 12. 【iOS × アーキテクチャ】iOSにおける、GUI/システムアーキテクチャとは?
- 13. SwiftUIで画面遷移を実装する
- 14. 【iPhone】一定秒数で切り替わる壁紙スライドショーをつくる【ショートカット】
- 15. 【RealityKit2】Object Captureを試してみよう!
- 16. SwiftUIアプリにダークモード設定を追加する
- 17. iPhoneのカメラでリアルタイム物体検出 CoreMLモデルをつかえばかんたん
- 18. RealmSwift の deprecated warning に対応した
- 19. Swift, iOSでGraphQLクライアントを導入する
- 20. SwiftUI内でUIViewControllerを使おう
SwiftUIでルビを振るために必要なこと
# 概要
ルビを振ったUILabelをSwiftUIから利用する実装についてまとめました。【参考】
https://qiita.com/mlmlykt/items/c8a09d6801b5aac7f24e
https://qiita.com/negi0205/items/6c73128ff2cf680df47c
https://qiita.com/woxtu/items/284369fd2654edac2248# ルビを振ったNSAttributedStringの生成
“`swift
extension String {
func createRuby(color: UIColor = .black) -> NSAttributedString {
let textWithRuby = replacingOccurrences(of: “(|.+?《.+?》)”, with: “,$1,”, options: .regularExpression)
.components(separatedBy: “,”)
ARでメタバース 巨大ロボットを出現させる
#大迫力の3Dオブジェクトを操作する方法
#コンピュータのパワーでよりパワフルなコンテンツを
ARってなんだか難しそうな印象ありますか?
#ARKitを使ってスマホでかんたん表示
実はかんたんだったりします。
AppleがARをかんたんに扱えるフレームワークを出してくれています。#手順
アップルのサイトからUSDZモデルを手に入れます。
https://developer.apple.com/jp/augmented-reality/quick-look/ロボットという名前のUSDZファイルを読み込んでシーンに追加します。
“`swift
guard let robot = try? Entity.load(named: “robot”) else { return }
let anchor = AnchorEntity(plane: .hor
“rvictl”が”FAILED”になったときの解決策
# はじめに
「rvictl」はiPhone(実機)の通信ログ(パケットのキャプチャ)を取得する際に使用されるコマンドです。
iPhoneをMacにライトニングケーブルに繋いだ後、Macから以下のコマンドを実行することで仮想的なネットワークカードが作成され、WiresharkなどからiPhoneの通信を参照することが可能となります。“`text:
$ rvictl -s “iPhoneのUDID”
“`iPhone(実機)から通信ログ(パケットのキャプチャ)を参照する方法については、他の記事を参照すると良いでしょう。
参考記事
– [iPhone(実機)の通信ログ(パケットのキャプチャ)を簡単に取得する方法](https://qiita.com/shirochan/items/cdb244b12cf5d08d4766)
– [MAC OS CatalinaでiPhoneの通信をキャプチャする方法](https://qiita.com/U_Sukeee/items/82348c82af0242c37d3d)# “rvictl”が”FAILED”になった
“`text
[Mac]Flutterで保存したドキュメントのpath
# iPhone
“`dart:sample.dart
void _saveFile() async {
final documents = await getApplicationDocumentsDirectory();
new Directory(‘${documents.path}/log’).create().then((Directory directory) {
print(directory.path);//ここでpath取得
final file = File(‘${directory.path}/test.log’);
file.writeAsString(‘test’);
});
}
“`
普通に保存したパスをコンソール出力して
FInde上でcmd + shft + Gにて貼り付ければ飛べます# Android
Androidの場合、上述のIPhoneの方法では出来ません[View] > [Tool Windows] > [Device File Explorer]
data/d
[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