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

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

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: RealmOptional has 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 UIKit

func 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/9f

元記事を表示

CoreLocationのauthorizationStatus備忘録

# はじめに
記事にするまでもないけど、よく忘れてしまうのでメモ。

# 環境
– iOS15
– Xcode13.1

# authorizationStatus
– kCLAuthorizationStatusNotDetermined
– 許可していない状態(初回インストール直後等)
– 次回確認でもこのケース
– この状態じゃないとOS標準ダイアログが表示されない
– kCLAuthorizationStatusRestricted
– iPadとかiPod等でGPS機能がついていない端末はこれが返される(らしい)
– kCLAuthorizationStatusDenied
– 設定→各アプリ→位置情報で「なし」を設定した時に返される
– 設定→プライバシー→位置情報サービスをOFFにした場合も返される
– どっちの設定起因で不許可になるか判別ができない
– 余談だがアプリからプライバシーまで一気に飛ぶスキームは無い(はず)
– kCLAuthorizationStatusAuthorizedAlways

元記事を表示

データセット用の顔画像をすぐに用意したい iPhoneの写真から、顔だけを数秒で100枚切り出す

#iPhoneのフォトライブラリから、顔だけを切り出す方法です

#データセットを用意するのは大変

たとえば機械学習などで、データセットとして顔写真や人体の写真が数千枚必要なケースがあります。
しかし、手動で顔写真を切り出すのは大変です。

#手元のiPhoneの写真が使えたら便利
たいていの人のiPhoneには、人の写っている写真が数百〜数千枚はあるでしょう。
それらの写真の顔だけを抽出できれば、迅速なデータセット作成に活かせそうです。

#[SemanticImage](https://github.com/john-rocky/SemanticImage)でiPhoneの写真を高速処理できる
[**SemanticImage**](https://github.com/john-rocky/SemanticImage)というラ

元記事を表示

[Swift]MKLocalSearchCompleterをPOIフィルタリングして改善してみる!

#はじめに
唐突ですが、あなたはパン屋を検索できるアプリを作っているとします。
オートコンプリートで簡単に検索できる機能を実装しようとしますが、関係のないお店が出てきてしまうかもしれません。
今回はパン屋のみを検索できるように改善してみようと思います。

**参考:WWDC19 What’s New in MapKit and MapKit JS**
https://developer.apple.com/videos/play/wwdc2019/236/

#開発環境
Xcode 13.0
Swift 5.5

#オートコンプリートとは
文字を途中まで入力すると、候補を出してくれる機能のことです。
Mapkitの[MKLocalSearchCompleter](https://developer.apple.com/documentation/mapkit/mklocalsearchcompleter)で簡単に実装できます。
#POIとは
Point Of Interestの略で、学校や動物園などの場所のことを示します。
![スクリーンショット 2022-01-11 23.27.45

元記事を表示

SwiftUI ScrollView でスナップ動作を実装

## 背景と宣伝

諸般の事情でカルーセルやスライドショー的なパーツを SwiftUI で実装する必要があったのですが、思ったより手軽に実装できなかったので、対応内容をまとめてみました。

今回の対応をベースに ScrollView + スナップ動作を簡単に実現するためのライブラリも作成しているので、とりあえずお試しといった場合は、こちらをどうぞ。

https://github.com/hugehoge/Snappable

## ゴール

![goal.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178830/37883ca3-1b0c-c22a-3132-9abdb0419abf.gif)

のようなスナップ動作を SwiftUI の ScrollView で実現します。

動作環境については、 iOS 15.0 以上の想定で進めます。

## 前準備

スナップ動作を実装する前に、横方向にスクロール可能な View 実装を用意します。

“`swift:前準備
struct Carousel

元記事を表示

最短で画像判別アプリを作成する(Swift)

#雲を判別したい

素人が見た目から何の雲かを判別するのは難しい。
雲が分かれば現在の天気や今後の天気がわかる。
気象学的に雲は10種類に分けることができます。これを十種雲形と言います。

今回最小限の労力・最短での画像判別アプリ作成を目標とします。

>![スクリーンショット 2022-01-11 18.24.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261100/cf79623b-2ae7-09fc-3a4a-095e9b487332.png)
日本気協会HPより

#CoreMLで雲画像の機械学習モデルを作成

CoreMLの詳細は下記の記事を参照。
>https://qiita.com/PearlEarringMinion/items/a703eb3525e4aec6c46d

以下の分類でモデルを作成しました。
googleや気象研究者のtwitterから画像を収集し、1分類につき画像は15〜20枚学習させました。
![スクリーンショット 2022-01-11 18.27.34.

元記事を表示

超解像をとりあえず使ってみるなら、画像ドロップで使えるCoreMLモデルで

#画像を鮮明に大きくしてくれる超解像を手軽につかう方法です

オリジナル(左)と超解像結果(右)

#鮮明なコンテンツ提供に使える超解像モデル、使うのは難しい?

超解像を使えれば、より鮮明に、リッチなサイズで、
ユーザーに提供するコンテンツのクオリティをあげられる可能性がある。

しかし、超解像技術はどうやって使えばいいのだろうか?
複雑な計算が必要なんじゃないの?

#CoreMLなら画像ドロップでとりあえず使える

CoreMLモデルなら、画像ドロップでとりあえず超解像モデルが試せる。

#アプリへ

元記事を表示

モバイルシステム技術検定(MCPC)2級の対策

皆様

お久しぶりです。satolabです。
最終更新から1年以上の月日が流れました。現在私は某IT企業でモバイル系のインフラエンジニアをしております。

この1年は慌ただしく、qiitaをはじめ情報発信や趣味の開発に中々時間を割けておりませんでした。

現在も四苦八苦の日々ですが、少しずつ情報発信の方も再開出来ればと思っております。

前置きが長くなりましたが、今回はちょっとニッチな資格である”MCPC2級”の対策について紹介したいと思います。

私は11月に受験し、無事合格出来ました。

##概要

モバイルシステム技術検定(通称:MCPC)は、モバイルシステムの提案、構築、運用のために必要となる知識とそのレベルを明示することによって、IT関連技術者の学習意欲の喚起を行い、その学習成果を検定(試験)により測定することが可能となります。
(引用: https://www.mcpc-jp.org/kentei/gaiyou.html)
試験は年に二回あり、後半の回はCBT方式で受けることができます。私は最寄りのテストセンターで受験しました。
なおボーダーは公開されていません。

##対

元記事を表示

【SwiftUI】TabViewを使用した簡単なタブの実装方法

## コード

“`swift
struct ContentView: View {
var body: some View {
TabView {
FirstView()
.tabItem {
Image(systemName: “1.square.fill”)
Text(“First”)
}

SecondView()
.tabItem {
Image(systemName: “2.square.fill”)
Text(“Second”)
}

ThirdView()
.badge(5)
.t

元記事を表示

Realm accessed from incorrect thread.

#はじめに
去年からずっと悩んでいたRealmSwiftのエラーが最近、解決しました。

#原因
タイトルにもあるように`不正なスレッドからレルムにアクセスしたこと`が原因です。

Realmのデータベース(以下、DB)では、異なるスレッド間でのアクセスは保証されていますが、スレッドを跨いでアクセスするのは禁止されています。

“`swift
let realm = Realm() // メインスレッドで生成

DispatchQueue.global().async {
// メインスレッドとは異なるスレッド

realm.write {} // Realm accessed from incorrect thread.
}
“`

#沼った部分
自分はずっとRealmインスタンスだけが、スレッド間を跨いでアクセスしなければOKだと思っていて、その思い込みのせいで沼にハマってしまいました。

解決の糸口は、[Realm入門](https://www.amazon.co.jp/%E8%BB%BD%E9%87%8F%E3%83%BB%E9%AB%98%E9%80%9F%E3%

元記事を表示

SwiftUI の NavigationLink(destination:,isActive:) を活用する

## はじめに

SwiftUI において画面遷移を行うための簡単な方法は `NavigationView` と `NavigationLink(destination:)` を使うものです。
なんらかの条件を満たしたときに強制的に画面遷移を行うなど、より細かい制御を行いたい場合は、`NavigationLink(destination:, isActive:)` を使います。

オリジナルアプリを個人開発している中で、この `NavigationLink(destination:, isActive:)` の使い方に関してかなりハマった経験があったので、備忘録がわりに記事としました。

## 開発環境等
– MacBook Air (M1 2020)
– macOS Monterey Version 12.1
– Xcode Version 13.2.1 (13C100)
– iOS 15.0

## 基本的な使い方

`NavigationLink(destination: ,isActive:)` の典型的な使い方は次のとおりです。

“`swift:ContentView.s

元記事を表示

スマホでリアルタイムで物体を認識したいなら、CoreMLモデルにカメラフィードを食わせるだけでOK

#iPhoneのカメラでリアルタイムで物体認識をする方法です
![Jan-10-2022 13-44-52.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/59552d75-749b-820e-4e79-d605d9573c12.gif)

#スマホのカメラで物体認識をするのはかんたんなのか?
スマホのカメラにうつるものがリアルタイムで判別できれば、色々なアプリに応用できそう。
しかし、物体認識は機械学習でおこなうが、ちょっとややこしそうな気もする。
しかも、1枚の画像ならまだしも、リアルタイムでカメラの映像を認識するのは設定が多そう。

#CoreMLモデルにCaptureOutputを食わせるだけ
実は、それほどたくさんコードが必要なわけではない。
CoreMLモデルさえあれば、AVFoundationで取得したフレームをモデルに与えるだけで、リアルタイム物体認識ができる。

#手法

まずはCoreMLの画像認識モデルを入手する。
ネット上から入手できるので、好みのものを使おう。
[*

元記事を表示

Missing Purpose String in Info.plist File.

#はじめに
本業のアプリをAppStoreConnectにアップロードした際にリジェクトを喰らいました。

>Missing Purpose String in Info.plist File. Your app’s code references one or more APIs that access sensitive user data. The app’s Info.plist file should contain a NSLocationWhenInUseUsageDescription key with a user-facing purpose string explaining clearly and completely why your app needs the data.

簡単に訳すと、`Info.plistにNSLocationWhenInUseUsageDescription keyを追加してくれ!`と書いてます。

[NSLocationWhenInUseUsageDescription](https://developer.apple.com/do

元記事を表示

OTHERカテゴリの最新記事