- 1. HEIC画像をjsで.pngや.jpegに変換する
- 2. [SwiftUI]クラス・構造体とSwiftUIのコンポーネントの命名が被ってしまった場合
- 3. マスクをつけた顔を検出する
- 4. 【続】iOSでAirtestを動かす
- 5. iOS アプリで使っている OSS の情報をいい感じにとる
- 6. Protocol Oriented Programmingを使ってみて思ったこと
- 7. iOSアプリでSPMを用いたマルチモジュール構成を試してみた
- 8. 高齢者見守りアプリ「メディット」を支える技術【帰省のお供に?】
- 9. [swiftUI]せっかくなのでアドベントカレンダーが作りたい(前編)
- 10. Snyk を使って iOS プロジェクトのライブラリ脆弱性を検査する
- 11. TensorFlowLiteのモデルをiOSでつかう【機械学習】
- 12. iOS 15で実現するPiP動画のコメント表示
- 13. SwiftUIを実務で使ってわかったアレコレ
- 14. iOSアプリにSharePlayを追加して、FaceTime通話中に参加者間でデータをやり取り(Group Activities)の完全なガイド
- 15. iOS15メールプライバシー保護機能という闇への防衛術
- 16. YouTube SDKを利用してインライン再生を実装する
- 17. 【Swift】動画と音楽を合成すると動画が横を向くバグについて
- 18. DJI公式アプリ+αなドローン操作アプリ(iOS)を作った話
- 19. iOSのアクセスガイド(Guided Access)下で実行中のアプリが落ちたときの挙動を調べる
- 20. ARをさわる【コンピュータ・ビジョン*AR】
HEIC画像をjsで.pngや.jpegに変換する
# HEIC画像とは
iOSのスマホで撮影した写真の形式で、高画質でありがながら、サイズが軽いという特徴があります。
元々は「JPEG」形式だったのですが、iOS11以降より変わったようです。
拡張子はそのまま「.HIEC」もしくは「.HEIF」です。# 抱えている課題
ブラウザではこのHEIC画像を表示することが出来ないという課題があります。
開発中のスマホアプリの中で、.heicのままURLをDBなどに保存し、そのURLをブラウザで表示したいとなった時に、問題が発生するという状態です。
ただ拡張子を変えても、上手く表示できません。※ちなみに、この「.HEIC」形式の画像はiOSのアプリ内で利用する分には問題ありません。
### 課題を体験
以下URLにアクセスすると、ブラウザで表示されるのではなく、ローカルにダウンロードされてしまうと思います。
https://alexcorvi.github.io/heic2any/demo/1.heic
これを通常の画像と同じようにブラウザに表示したいのに、出来ないという問題に直面した方のための記事になります。# 解決策
[SwiftUI]クラス・構造体とSwiftUIのコンポーネントの命名が被ってしまった場合
クラス名や構造体の命名が、SwiftUIであらかじめ用意されているViewの命名と被ってしまった場合、
SwiftUI.使いたいViewで指定するで解決。“`swift
struct Menu {
let label: String
let icon: Image
}struct MenuView: View {
var body: some View {
VStack{
SwiftUI.Menu { // SwiftUI.Menuを追記
ForEach(0..<5){ index in Button(action: {}) { Text("index: \(index)") } } } label: { Image(systemName: "plus")
マスクをつけた顔を検出する
これまでVisionでは顔の検出はできても、マスクをつけた顔は検知できなかった。【従来はマスクの顔は検出されない】
【続】iOSでAirtestを動かす#はじめに
AirtestIDE でスマホアプリ(ゲーム)のテスト自動化に取り組んでいます。そこで実際に作成したスクリプトを実行する環境をつくるために実施したことを綴っていきたいと思います。:xmas-tree::xmas-wreath1:こちらは、昨年の記事[「iOSでAirtestを動かしてみる」](https://qiita.com/s_noza/items/f2cc1f398270d3572e5b)の続編になります。
前回課題となっていた横向きアプリへの対応が解決しましたので、そちらの情報共有と、当該環境を使用して本格的に取り組みを進めるにあたり、CLI環境からの複数端末での動作確認を行いましたので、いくつかの関連トピックを交えつつ共有できればと考えています。#環境
macOS Big Sur 11.6.1
Xcode 13.1
Airtest IDE 1.2.12(Python)
iPhone XS(iOS 14.7.1)
iPhone 8(iOS 15.1)#セットアップ
##Step1 WebDriverAgent
前回紹介していた iOS-Tagent を
iOS アプリで使っている OSS の情報をいい感じにとる
CocoaPods で OSS を管理している iOS アプリで使っている OSS のリストを “いい感じ” に作ります。
# お題
開発中の iOS アプリ内で使っている OSS を次の情報を含めてリストアップしたい。– OSS 名
– バージョン
– ライセンス
– 公開サイト
– 作者変なのが混入してないかとか、なんやかんやあるんです、はい。
# 解答
[こうする](https://github.com/shinyaishida/podeps)。
# 解法
なんかいい感じのコマンドとかツールとかないか探した結果、スクリプトをちょこっと書くだけで済みそうだったのでそうしました。以下はその辺の説明です。
## LicensePlist
OSS のリストと言えば [LicensePlist](https://github.com/mono0926/LicensePlist) が思い浮かびます。アプリ上で OSS の表示義務を果たすのにとてもありがたいツールです。ただ、出力が、、、
“`xml
Protocol Oriented Programmingを使ってみて思ったこと
# はじめに
Protocol Oriented Programmingというものがあるよと先輩に教えていただいたので、Jon Hoffmanの[Protocol-Oriented Programming with Swift](https://www.packtpub.com/product/swift-protocol-oriented-programming-fourth-edition/9781789349023)を読んでみました。
本を読む前に軽く調べてみたのですが、イメージが全く沸かず、一冊の本としてまとまっているものを読むことで理解してみようとしたのがきっかけです。# そもそもなんなの?
僕の理解ですと、Swiftの**挑戦的な**取り組みの一部なのかなと思っています。むしろそう考えたほうが「OOPとはちょっと雰囲気が違うのか」と一歩引いて考えられるようになる気がしています。
Protocol Oriented Programming(以下POP)を一言で言えば、Protocol Extensionという仕組みを利用してコーディングを進めていくスタイルです。この
iOSアプリでSPMを用いたマルチモジュール構成を試してみた
近年のiOSアプリ開発では、アプリの規模が大きいアプリも増え、複数人による並行開発を安定的に行うべく、マルチモジュール構成を採用するアプリも増えてきたと思います。
特にマルチモジュールの流れはAndroidの方が先行していた印象で、2018年頃からその流れが大きくなってきた印象でした。
iOSDCなどカンファレンスのセッションなどを聞いていると、大規模アプリほどその課題にあたっているチームが多いようです。従来のマルチモジュール構成を行うには、XcodeからFrameworkプロジェクトを作成し、ライブラリとしてメインのアプリプロジェクトに追加していくというものでした。
アプリと、ライブラリ間の依存関係にはXcode上で手動で行う方法や、CocoaPodsなどパッケージ管理ツールを使う方法もあります。そんな中、iOSDC 2021の@d_dateさんのセッションで、Swift Package Managerを用いたマルチモジュール構成の紹介がありました。
https://speakerdeck.com/d_date/swift-package-centered-project-
高齢者見守りアプリ「メディット」を支える技術【帰省のお供に?】
# はじめに
**技術的な内容のみをご覧になりたい方は[こちら](#技術的なポイント)からどうぞ**[](https://apple.co/32PFkVv)
先日、App Storeにて**「メディット」**を正式リリースしました!これは高齢者の見守りを目的としたコミュニケーションアプリです。年に数回しか帰省できない、そんなとき家族の安否を知る手助けになります。今回はその機能とそれを支える技術をご紹介します。
# メディットについて
## 開発のきっかけ
核家族化が進み、一人暮らしのお年寄りが増えています。家族が帰ってくるのは帰省のときだけ。このような状況では、家族間のコミニュケーションは少なくなってしまいます。
見守りサービスなるものは以前から多くありました。しかしどれもお年寄り側の情報を一方的に伝えるだけ。これでは良くも悪くも安
[swiftUI]せっかくなのでアドベントカレンダーが作りたい(前編)
# 今回やりたいこと
せっかくなので、個人で勉強したSwiftUIのおさらいがてらアドベントカレンダーを作ってみます。
作りたいアドベントカレンダーはクリスマスまでに穴を開けていくカレンダーのことです。こんなやつ。
![christmas_tree_advent_calender_eve.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2318046/b006b5b6-34f5-6661-f321-04f4f54f473e.png)# 完成までの手順
1.1日~25日までのボタンを配置する
2.ボタンをタップすることでモーダル表示されるようにする
3.モーダルで何かしらの表示をする
4.もし当日以降の日付がタップされた場合、「まだ開けられないよ!」と表示する
5.思いつくままに書いたコードを読みやすいようにする# 1.1日~25日までのボタンを配置する
とりあえずこんな感じで画面をレイアウトしてみました。
![スクリーンショット 2021-12-04 21.37.46.png](https://q
Snyk を使って iOS プロジェクトのライブラリ脆弱性を検査する
# Snyk(スニーク)とは?
## 1. 概要
![logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/af6f7748-7c48-6d7c-93fd-fbd20406e270.png)
> Snyk(スニーク)はデベロッパーファーストのセキュリティプラットフォームです。Snykは、コードやオープンソースとその依存関係、コンテナやIaC(Infrastructure as a Code) における脆弱性を見つけるだけでなく、優先順位をつけて修正するためのツールです。Gitや統合開発環境(IDE)、CI/CDパイプラインに直接組み込むことができるので、デベロッパーが簡単に使うことができます。
(引用:https://qiita.com/advent-calendar/2021/snyk)
簡単にいうと**脆弱性を見つける**ためのツールです。
## 2. ロゴ
ロゴはマスコット犬で「**Patch(パッチ)**」という名前がついています。
(セキュリティホールを修正するプ
TensorFlowLiteのモデルをiOSでつかう【機械学習】
iOSでtfliteモデルが使えたら便利ですよね。
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/d9551ab2-62a9-ad0d-5fe5-6189d28f6854.png)基本的には、
CocoaPodsでTensorFlowLiteを追加して、
あとはInterpreterがモデルの初期化、画像から入力テンソルの作成、推論、をクラスメソッドでしてくれます。[TensorFlowのexampleプロジェクト](https://github.com/tensorflow/examples/tree/master/lite/examples/image_classification/ios)のモデル推論に必要な部分を抜粋・解説した
iOS 15で実現するPiP動画のコメント表示
こんにちは。[ogukei](https://qiita.com/ogukei)です。社内ではiOS版ニコニコ生放送アプリを開発しています。
先々月にiOS版ニコニコ生放送アプリのリリース5.27.0で、ピクチャ・イン・ピクチャ(PiP)機能で視聴時にコメントが流れるようになりました。本機能はiOS 15で初めて使えるようになった新APIを活用しています。今回はそのリリースの背景についてご紹介します。主にコメントを安定した動作で表示するための最適化について触れています。
https://blog.nicovideo.jp/niconews/159982.html
![ios-pip.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189818/a50f7ba5-e313-8ffc-043e-eab2849bf225.jpeg)
## PiP機能とは
他アプリを使用しながら小窓で動画を再生できる機能です。iOS版ニコニコ生放送アプリでは昨年プレミアム会員の方を対象に本機能をリリースしました[^
SwiftUIを実務で使ってわかったアレコレ
![swiftui_advent_2021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10943/2b756c9b-6a55-c6ea-18bf-8efb54975ea3.png)
この記事はGoodpatchエンジニアアドベントカレンダー5日目の記事です。
こんにちは!iOSエンジニアのとうようです。[2日目の記事](https://goodpatch-tech.hatenablog.com/entry/engineer_communication_elementary)も書いているのですが、あまり技術的な内容は触れなかったのと、まだ空いていたので急遽この枠で技術的な記事も書いていこうということにしました。
多分このアドベントカレンダーはほとんどQiitaに書く人がいないので、一個ぐらいはQiitaに書き残しておこうかなとここで書き進めています。今回書く内容は、自分が実際に参加した案件での実例を通したSwiftUI周りのお話になります。実際どのアプリなのかは伏せさせていただきますが、以下の
iOSアプリにSharePlayを追加して、FaceTime通話中に参加者間でデータをやり取り(Group Activities)の完全なガイド
# はじめに
SharePlayはWWDC 2021でiOS 15に導入された新技術です。
この記事は、SharePlayを使ったデータ共有機能の実装についてご説明します。
手順に従って、SharePlayのセッションを開始し、FaceTime参加者とデータをやり取りするアプリを作ります。
#### プロセスを詳しく説明するため、図をいくつか作成して記事に追加しました。画像をクリックすると拡大できます。
## SharePlayについて
ユーザーの立場で言うと、このフレームワークを使った場合、FaceTimeの参加者がオンラインの活動を一緒にやる(例えば映画の鑑賞など)ことができるようになります。
開発者の視点で言うと、FaceTimeの参加者の間のデータ交換が可能になります。
そのため、一緒に映画を見る場合、FaceTime参加者間では再生時間のみが同期され、映画は各端末からストリーミング再生されることになります。
動画配信: Internet -> ユーザーの端末
再生時間: 他のFaceTimeの参加者 -> SharePlay -> ユーザーの端末## S
iOS15メールプライバシー保護機能という闇への防衛術
# iOSのメールプライバシー保護機能が闇動作なので紹介したい
iOS15(2021/9/21リリース)では、メールプライバシー保護機能(MPP – Mail Privacy Protection)なる機能が導入されました(iPadOSやMacOSも同様に導入)。標準メールアプリが対象で、iOS15で標準メールアプリを起動するとこんな画面が出てきます(画像はiPadOS15ですが)。見たことある方、多いのではないでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314396/2f95b563-6e8a-0e85-7c9f-e5b59773de2f.png)この機能に関するAppleさんの説明は [iPhoneでメールプライバシー保護を使用する](https://support.apple.com/ja-jp/guide/iphone/iphf084865c7/ios) にあり、
1. 送信者に対しIPアドレスが隠されること
1. メールが開かれたかどうか送信者は確認で
YouTube SDKを利用してインライン再生を実装する
##今回実装すること
今回はアプリでもよくあるインライン再生を実装してみたいと思います。
実装する機能は次のとおりです。
・インライン再生
・画面上では一つの動画しか再生できない(一つ再生させればもう一つはポーズする)##完成イメージ
![simulator_screenshot_F236E870-EA2F-45E6-B463-F41475148AAB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552896/bdf2d59a-d495-ac4f-99ea-b8f5708eacdc.png)##画面の構造
![スクリーンショット 2021-12-04 23.23.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552896/78b4dc52-aa97-5e89-281b-371e54dba3d3.png)
![スクリーンショット 2021-12-04 23.19.09.png](https://qi
【Swift】動画と音楽を合成すると動画が横を向くバグについて
#はじめに
※こちらはSwiftVideoGeneratorライブラリについての記事となります。私がSwiftVideoGeneratorにて動画と音楽を合成させる際に解決まで時間を消費したので、
同じ状態で困っている方の助けになればと思います。https://github.com/dev-labs-bg/swift-video-generator
#解決方法
VideoGenerator.swiftファイルに下記のコードを追加するだけです。“`swift
if let aVideoAssetTrack: AVAssetTrack = aVideoAsset.tracks(withMediaType: .video).first, let aAudioAssetTrack: AVAssetTrack = aAudioAsset.tracks(withMediaType: .audio).first {//fixes the orientation issue
mutableCompositionVideoT
DJI公式アプリ+αなドローン操作アプリ(iOS)を作った話
## はじめに
DJI 製のドローンを触れる機会があったので、ドローンを操作できるiOS アプリを作ってみました。
ドローン操作アプリってハードル高そう? と思っていたのですが、DJI が用意しているSDK を利用することで案外簡単に作ることができたので、敷居を下げるきっかけになればと思います。### 書くこと
– 今回使用した DJI 製ドローン (Mavic 2 Enterprise) の基本的な概要
– DJI SDK を使った DJI 公式アプリ +α なアプリ作成の要点
– DJI SDK の辛いポイント
– DJI SDK を使用した写真の扱い方### 書かないこと
– iOS アプリの基本的な作り方
– Onboard SDK / Payload SDK
– 詳細な実装方法、ソースコード## 使用したドローン
ここでは、今回使用したドローン「Mavic 2 Enterprise」について説明します。
今回使用したドローンは、株式会社メディア・リース様から無償で貸していただきました。?### Mavic 2 Enterprise
以下公式サイトより
iOSのアクセスガイド(Guided Access)下で実行中のアプリが落ちたときの挙動を調べる
## 概要
iOSには、[アクセスガイド(Guided Access)](https://support.apple.com/ja-jp/HT202612)の機能があり、動かせるアプリを1つに制限することができます。
このエントリでは、筆者が「アクセスガイドを有効にしているときにアプリが落ちた場合はどのような挙動になるのか」がふと気になり、実験してみた内容を紹介します。
## ご注意
– ご自身でも実験される場合には、アクセスガイドについて[Appleのサイトの説明](https://support.apple.com/ja-jp/HT202612)をよく理解した上で取り組まれてください。特に、アクセスガイドをパスワード付きで設定した上で、パスワードを忘れてしまうと解除ができなくなります。ご注意下さい。
– アクセスガイドを理解しないで使用すると大変なことになる場合があるので注意してください。
– アクセスガイドを理解しないで使用すると大変なことになる場合があるので注意してください。(大切なことなので2回繰り返しました)## 前提
本エントリでは、下記を使用しています。
ARをさわる【コンピュータ・ビジョン*AR】
ARオブジェクトにさわれたらいいと思いませんか?
【ARをさわる】VisionとRealityKitで指が触れたARオブジェクトを反応させられます。
まずはVisionで指先の位置を取得します。
“`swift
import Vision
import RealityKit…
var handPoseRequest = VNDetectHumanHandPoseRequest(completionHandler: handDetectionCompletionHandler)
// 手のポイントを取得してくれるリクエスト
// CompletionHandler内で結果を処理します…
func session(_ session: ARSession, didUpdate frame: ARFrame) {