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

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

【Swift】CoreBluetoothの使い方 その2:セントラルの実装例

#はじめに
Corebluetoothのセントラル側の実装例について記載していきます。

[①その1:BLEにおける役割](https://qiita.com/JunNonaka/items/348eeecc63cbce4cfed0)
②その2:セントラルの実装 ← 今回はここ

#処理の順番
・必要な機能の初期化
・スキャン処理
・接続処理
・ペリフェラルの情報を取得して通信を行う。
・切断
上記順番に処理を行いますので、順番に記載していきます。

#必要な機能の初期化
・BLE関連の設定の追記
info.plistに「Privacy – Bluetooth Always Usage Description」を追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671830/ab5e3db4-7d3b-1685-bc15-14d6f4c2b60c.png)

試すだけであれば上記だけで問題ありませんが、実際にアプリに組み込み、Appstoreconnectに上げる場合はペリフェラル側

元記事を表示

【Swift】CoreBluetoothの使い方 その1:BLEにおける役割

#はじめに
2022年はOutPutしていくぞ!!ということで、
初めてQiitaに投稿しますが、iOSでのBLEの使い方、CoreBluetooth周りの投稿をしていきます。

①その1:BLEにおける役割 ← 今回はここ
[②その2:セントラルの実装例](https://qiita.com/JunNonaka/items/cde2f4f3934a3d452770)

#CoreBluetoothとは?

>Core Bluetoothフレームワークは、アプリがBluetooth搭載の低エネルギー(LE)および基本レート/拡張データレート(BR/EDR)ワイヤレステクノロジーと通信するために必要なクラスを提供します。
Apple Developerより
https://developer.apple.com/documentation/corebluetooth

iOSでBLE(Bluetooth Low Energy)を使う時に使用するフレームワークです。
iOSでBLEを使う時は基本的にCoreBluetoothを使うことになります。

#BLEにおける役割とは?
CoreBl

元記事を表示

iOS & iPadOS 15 リリースノート日本語訳

# iOS & iPadOS 15 リリースノート

新機能を利用し、APIの変更をテストするためにアプリをアップデートしてください。

## 概要

iOS & iPadOS 15 SDKは、iOS & iPadOS 15を実行するiPhone、iPad、及びiPod touchデバイス用のアプリを開発するためのサポートを提供します。
SDKはMac AppStoreから入手できるXcode 13にバンドルされています。
Xcode 13の互換性要件についてはXcode 13[リリースノート](https://developer.apple.com/documentation/Xcode-Release-Notes/xcode-13-release-notes)を参照して下さい。

## App Store

### 新機能

– [StoreKit](https://developer.apple.com/documentation/storekit) 2はSwiftの同時実行性などの新しい言語機能を利用する最新のSwiftベースのAPIを導入しています。このAPIを使用

元記事を表示

ios申請

## 概要
flutterで作成したアプリをapp storeに申請

## やり方
基本は[こちら](https://qiita.com/Labi/items/3b71b8f5ef065904c1de)のサイトを参考にさせていただきました
## ポイント
archiveする前にビルドする必要があるが、dbの設定をしてあげた
提出したら、appleチームが確認するので、専用のログインIDやパスワードも作成しておいてあげるとよい![スクリーンショット 2022-01-19 15.32.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417196/1571b5af-098b-69b0-58da-1d322bdbe3f2.png)

1 ビルドする
本番環境でアプリをビルドする

`flutter run –flavor prod -t lib/main-prod.dart`

2 archvieする
ターゲットをany ios device(arm64)に設定する
xcodeの上のメニューバーから

元記事を表示

【iOS × MVC】MVC アーキテクチャとは【コードあり コピペでOK】

# 目的
iOS開発における、MVCアーキテクチャを理解すること
筆者の備忘録

# 流れ
1. MVCの誕生
2. MVCの目的
3. 各レイヤーの役割
4. MVCの課題
5. (補足)Presentation Modelパターン
6. 画像表示アプリでMVCの実装 ← コードつき, コピペでOK

# 1. MVCの誕生
ここではMVCが誕生するまでの流れを説明していきます。

コード(:ViewControllerのようなもの) を ウィジェット(:ボタンやテーブル等のUIコンポーネント) に全て記載していた

`メンタルモデル`と違うものになってしまう

1979年にUIの表示をEditor、メンタルモデルをModelと名付けて、責務を分けた。

その後、Editorを「入力に属するもの(Controller)」「出力に属するもの(View)」に分けた。

View-Controller-Model:`MVC`の誕生

#### 補足
`メンタルモデル`とは
**人間が無自覚のうちに持っている、思い込みや価値観**
(例:画面は画面のプログラム、処理は処理のプログ

元記事を表示

ARの使い道が思いつかない人へ ARとはセンシングであるという考え方と、具体例 ARで紙を切り取る

#ARの使い道の考え方と、その具体例です。
具体例では、画像を登録して、現実の紙からその部分を切り取ります。

#ARってなかなか使い道がわからない
ARって楽しそうなものの、イマイチどういうアプリケーションに使えばいいかわからない。

#現実のものとどうインタラクトするかが鍵
リアリティを拡張するもの、ということは、ベースとなるリアルの理解が鍵となります。

#ARはセンシングである

現実を拡張するためには、現実を理解する必要があります。

ARとは、コンテンツを表示するもの、というのに加えて、
「センシングである」
というところから考えてみます。

ARコンテンツの配置は、あくまで現実を拡張する手段の一つであって、
コンテンツを現実のどこに配置するか、それによって何の現実を拡張しているか、がARの目的を形作るのではないでしょうか。

となると、**まずは現実を

元記事を表示

[RxCocoa]プログラムからテキストを変更した場合, textField.rx.textにイベントが流れない

`textField.text = “hogehoge”`とプログラムから`text`を変更しただけでは`textField.rx.text`にイベントが流れてくれない。

RxCocoaのソースを見ると`.valueChanged`イベントが流れた時に`rx.text`が更新されるようである。そのため、`textField.sendActions(for: .valueChanged)`として、明示的にイベントを流せば良い。

“`swift:UIControl+Rx.swift
/// This is a separate method to better communicate to public consumers that
/// an `editingEvent` needs to fire for control property to be updated.
internal func controlPropertyWithDefaultEvents(
editingEvents: UIControl.Event = [.

元記事を表示

UITextFieldの入力値を通貨に自動変換

Combineを使うと割とスッキリ実装できる。
今回のサンプルは日本円のみにしてますが、応用して通貨以外にも色々な単位に自動変換するUITextFieldを作れると思います。

“`swift

class SampleViewController: UIViewController {

let numberFormatter: NumberFormatter = {
let nf = NumberFormatter()
nf.numberStyle = .currency
nf.locale = Locale(identifier: “ja_JP”)
return nf
}()

let textField: UITextField = {
let tf = UITextField()
tf.keyboardType = .numberPad
return tf
}()

private var cancellable = Se

元記事を表示

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 )` を分けて考えましょうね。 というもの。
※ プレゼンテー

元記事を表示

OTHERカテゴリの最新記事