- 1. mac スクショ方法(忘備録)
- 2. サブする iOS で取り組んでいる DI(Dependency Injection)可能な実装について
- 3. 【アプリ開発】こども向けアプリのペアレンタルゲートの設置
- 4. iOS標準のショートカットアプリで、色々なアクションを効率化してみよう
- 5. 実務未経験からiOSエンジニアへ
- 6. iOSアプリ開発でぶち当たるエラー処世術〜Xcode編〜
- 7. CoreImageフレームワークを使ってSwiftでしみ消し、くま消し機能を実装した話
- 8. [iPhone12まで]ステータスバー・セーフエリアトップ・ナビゲーションバーのサイズ一覧
- 9. iOS: SFTPでファイルアップロード
- 10. Swift CombineにてFutureで実行している非同期処理をsinkしているのに途中でキャンセルされる
- 11. iOSショートカットアプリを作って鍵をNFCで素早く開ける
- 12. DateFormatter(short, medium, long)
- 13. ARKit 4のLiDAR Depth API
- 14. アイディアのタネになる面白い技術の活用法【iOS】【ハッカソン】
- 15. CAGradientLayerでグラデーションを描画する
- 16. iOSアプリのCI(CircleCI)を改善してみた話
- 17. iOSで効果音を鳴らす
- 18. 3年以上放置していた個人で公開中のiOSアプリを再度申請した話
- 19. CocoaPodsでiOSのライブラリーを作ってみる
- 20. UICollectionViewにLongPressGestureRecognizerで長押しをつける
mac スクショ方法(忘備録)
#Macでのスクショ方法
一定の期間が空くと「どうやってやるんだっけ〜」となってるのでここに記します。###全画面のキャプチャ
“`php
command + shift + 3
“`
###選択部分のキャプチャ
“`php
command + shift + 4
“`
#最後に
よし。
サブする iOS で取り組んでいる DI(Dependency Injection)可能な実装について
iXIT で iOSエンジニアをしています、 @branch10480 です。今回は私が担当しているプロダクト [サブする](https://sabusuru.jp/) で対応している 「**DI(Dependency Injection)**可能な実装」について書いていきたいと思います。
# 依存性注入:DI(Dependency Injection)って何?
この DI (Dependency Injection) については Wikipedia ではこのように記載されています。
> DIを利用したプログラムを作成する場合、コンポーネント間の関係はインタフェースを用いて記述し、具体的なコンポーネントを指定しない。具体的にどのコンポーネントを利用するかは別のコンポーネントや外部ファイル等を利用することで、コンポーネント間の依存関係を薄くすることができる。
最初、「具体的なコンポーネントを記載しない」、「コンポーネント間の依存関係を薄くすることができる」などがあまりピンと来ず、どういうケースで役に立つのかがイメージできませんでした。
ですのでその時の自分に説明するつもりで書い
【アプリ開発】こども向けアプリのペアレンタルゲートの設置
個人開発で、こども向けアプリ内にAppStoreのレビュー画面に遷移する機能を追加しいた際に、ペアレンタルゲートの存在を初めて知り、色々苦労したため、残しておきます。
#経緯
私は、甥っ子のために計算練習と復習ができる計算アプリの開発をし、iOSアプリでリリースをしておりました。
軽微な修正を行っている中、せっかくならユーザにレビューをいただけるよう、AppStoreのレビュー画面に遷移する機能を構築しました。#審査
却下。。
こども向けアプリ(リリースする際に設定)では、外部リンクへ遷移する際は、子供だけの判断で遷移できないよう、ペアレンタルゲートを設ける必要があると。なにそれ?
Google先生に聞いてみると、Appleの公式でも普通に書いてありました。勉強不足。。+ 子ども向けのAppを開発する
https://developer.apple.com/jp/app-store/kids-apps/#修正
初回リリース時も、子供向けアプリで広告は入れちゃダメとリジェクトされていたため、実は、今回のリリースでは子供向けのチェックを外していたのですが、もうダウンロー
iOS標準のショートカットアプリで、色々なアクションを効率化してみよう
# この記事について
この記事は、[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html)の開発チーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu)」にて行っているアウトプット企画である
「[チーム「オキザリス」Advent Calendar](https://qiita.com/advent-calendar/2020/oxalis)」の24日目の記事です。# あるハッカソンでのできごと
先日、同期と一緒にあるハッカソンに出ました。
開発テーマはなんでもOK!の自由度高いハッカソンだったので
「食欲旺盛な同期 Pくん が彼女の外出中に冷蔵庫を開けると、その場で彼女のお叱りの音声が響き渡り、
彼女に『あいつ冷蔵庫開けてんぞ!』と告げ口LINEが飛ぶ **つまみぐい防止のための冷蔵庫監視シス
実務未経験からiOSエンジニアへ
2020年10月からフラー株式会社に入社して約3ヶ月になります。
念願だったiOSアプリ開発に携わっています。iOS開発に関するチャレンジングな知見はまだ持ち合わせていないこともあり、
今回は、個人開発と時を振り返ってみて、iOS開発に興味を持っている方や、iOSアプリを仕事としてやっていきたいという方向けに意識して書きました。**本記事は技術的観点というより、就業するまでどんな行動をしたのかという点に重きを置いています。**
最初は身の上話が続くので、アプリ開発については「[取り組んだこと](#取り組んだこと)」に飛んでいただければと思います。#わたし
情報系専門学校卒
約10年、COBOLやJavaで業務システムを開発・保守とか、医療システムの保守をしたり。#きっかけ
4,5年前に、Swift、モダン。お、かっこよさそう。アプリ作れたら楽しいだろうな。
きっかけはこんな感じでした。
ずっとAndroidユーザーでしたが、Appleの統合された美しさによろめいていた時期でした。何事も形から入りたかったので、
まずは、無印Macbook(スペック盛り盛り)を購入しま
iOSアプリ開発でぶち当たるエラー処世術〜Xcode編〜
# エラー処世術
アプリケーション開発を行なっていると必ずぶち当たるエラー.検索しても解決策が得られない.開発が滞ってしまい,やる気が削がれる.といったことは誰しもが経験することだと思います.
私自身もその一人で,毎日技術力不足を痛感させられます.この記事では,Xcodeで開発する際に効率よくエラーの解明を行い,圧倒的成長を遂げるための処世術を少し紹介したいと思います.# この記事の対象者
– iOSアプリ開発を始めたての方(Xcodeでの)
– LLDBって何?デバッガって?という方
– 追加したUI部品(button, viwe…)が表示されない!どこいったの?という方# 処世術1 〜LLDBとは〜
LLDBとはXcodeのデフォルトデバッガです.皆さんお馴染みの画面の下の方にいます.デバッガとは不具合の原因を探すお手伝いをしてくれる機能やソフトを指します.基本的にはプログラムを一時停止させたりしてエラーを見つけます.CoreImageフレームワークを使ってSwiftでしみ消し、くま消し機能を実装した話
バイトル履歴書アプリに画像の補正機能を追加するエンハンスを担当したのでやったことまとめておきます。
今回のエンハンス内容としましては画像補正機能として撮影した写真全体に対して独自で定義したフィルター処理を行うのと、目の下のくまの部分や頬のあたりのしみの部分を部分的に画像補正処理を行う機能をCoreImageフレームワークのみを使い実装しました。
写真全体に対してフィルター処理を行うケースはそんなに難しくないのでサンプルコードだけ載せておきます。
“`Swift
import CoreImage
…// フィルター処理をかけたいSampleイメージを準備
var image = UIImage(named: “sample.jpg”)// UIImageからCIImageへの変換
let ciImage: CIImage? = CIImage(image: image)// Sepiaフィルターの準備
var filter = CIFilter(name: “CISepiaTone”)// フィルターに画像を渡す
filter.setValue(ciImage
[iPhone12まで]ステータスバー・セーフエリアトップ・ナビゲーションバーのサイズ一覧
| | ナビゲーションバー高さ | ステータスバー高さ | safeareaInsets.top |
| —— | —— |—— |—— |
| iPhone12mini | 44 | 44 | 50 |
| iPhone12 | 44 | 47 | 47 |
| iPhone12Pro | 44 | 47 | 47 |
| iPhone12ProMAX | 44 | 47 | 47 |
| iPhone11 | 44 | 48 | 48 |
| iPhone11 Pro | 44 | 44 | 44 |
| iPhone11 Pro Max | 44 | 44 | 44 |
| iPhoneX | 44 | 44 | 44 |
| iPhoneXR | 44 | 44 | 44 |
| iPhoneXS | 44 | 44 | 44 |
| iPhoneXS Max | 44 | 44 | 44 |
| iPhoneSE | 44 | 20 | 20 |
| iPhone8 | 44 | 20 | 20 |
| iPhone8 Plus | 44
iOS: SFTPでファイルアップロード
– Swift 5
– Xcode Version 12.3
– NMSSHiOSアプリ開発にて、SFTPでサーバーにファイルをアップロードする仕様でした。
今回使用したライブラリは[NMSSH](https://github.com/NMSSH/NMSSH)。これ以外、見つけられませんでした。
– https://github.com/NMSSH/NMSSH## CocoaPodのインストール
まずはここでつまづきました。
参照)https://qiita.com/spring_i/items/181bc3c05142d1f80d93“`bash
$ sudo gem install -v1.8.4 cocoapods -n /usr/local/bin
$ pod setup
“`## MNSSHのインストール
Xcodeのプロジェクトは作成済みとしています。
“`
$ cd [プロジェクト名]
$ pod init
“`Podfileが生成されますので、それを編集。
“`bash:Podfile
# Uncomment the next l
Swift CombineにてFutureで実行している非同期処理をsinkしているのに途中でキャンセルされる
Combineを使用する際にハマってしまったので、備忘録として残します。
# 問題
[Future](https://developer.apple.com/documentation/combine/future)のインスタンスに[sink](https://developer.apple.com/documentation/combine/future/sink(receivecompletion:receivevalue:))してクロージャ(サブスクライバ)を設定し、非同期処理が完了した際にsinkにて設定したクロージャの処理を行いたいのだが、完了する前にSubscribeがキャンセルされてしまう。
“`swift
func start() {
Future{ promise in
DispatchQueue.main.asyncAfter(deadline: .now() + 5.0){
promise(.success(()))
}
iOSショートカットアプリを作って鍵をNFCで素早く開ける
スマートロックをもっとスマートに解錠したい。
玄関の前まで帰ってきたときに
“`
携帯を取り出す → (マスクを外す) → 顔認証を解除 → アプリを探す → アプリを開く → 鍵を開ける
“`というプロセスを踏む必要があるのですが、「アプリを探す → アプリを開く」の2工程をNFCタグを使って削減するアプリを作ります。
特にこのマスク環境下では1工程でも減らしたい。
スマートロックにはGPSで近づくと自動で鍵を開ける設定などもあるのですが、常にGPSをチェックするため電池を激しく消耗し、チェック間隔より手動で開けた方が早いことも多く、
そもそも内廊下のマンションでは電波なんて届かないので使えません。公式アプリではiOSショートカットに対応していないので、自分で対応するアプリを作り、
そこから公式アプリへリダイレクトさせてしまいます。DateFormatter(short, medium, long)
DateFormatter
.dateStyle
.timeStyleそれぞれの出力結果
“`short.swift
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .short
dateFormatter.timeStyle = .short
print(dateFormatter.string(from: Date()))// 12/23/20, 1:42 PM
“`
“`medium.swift
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .medium
print(dateFormatter.string(from: Date()))// Dec 23, 2020 at 1:42:57 PM
“`“`short.swift
dateFormatter.dateStyle = .short
dateFormatter.timeStyle = .short
print(dateFormatt
ARKit 4のLiDAR Depth API
iOSデバイスで初めてLiDARスキャナを搭載したiPad Proの発売と同時にリリースされたARKit 3.5では、LiDARを利用してreconstractionした3Dメッシュは得られたが、その計算に用いられているはずの**デプス(深度)データにはアクセスできなかった**。
![rectangle_large_type_2_8e10a807ae6bf848e5d9f98228be7602.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3180/db1dff55-a184-98b2-085f-7fe73ca535e8.png)
その後発表された**ARKit 4 / iOS 14(/ iPadOS 14)でようやく、LiDARで計測したデプスを取得できるように**なった。従来のデプスと区別するため、「シーンデプス(Scene Depth)」とも呼ばれているようだ。
## LiDARデプスの取得方法
LiDAR由来のデプスデータは、`ARWorldTrackingConfiguration`利
アイディアのタネになる面白い技術の活用法【iOS】【ハッカソン】
# はじめに
はじめまして、じんむです。DeNAでiOSエンジニアをしております。
プライベートでは**個人開発**や**ハッカソン**が好きで、楽しいを届ける系ものづくりをしています。プロダクトのアイディアを出す時、需要のあることや実現したいことから考える人間ですが、**技術の引き出し**があると、**技術の意外な組み合わせ・使い道**でアイディアがドンドンふくらんだり、**実現できるかの判断**が即座にできたりします。
私事ですが、4年連続、通算8回出場しているアイディア当日型のハッカソン[SPAJAM](https://spajam.jp/final-result)の本戦で優勝しました、わあい。そこで、これまで触れてきた**面白い技術**を、約24時間ノーアイディアからチームメンバーと共に実装した**プロダクトでの活用例と共に紹介**し、技術の引き出しをざざざッと整理して共有したいと思います?
*この記事は技術の楽しい活用例メインで紹介するため、プロダクトの目的や内容の説明はあまりしません。気になる方はリンク先の動画や[じんむのLP](https://koooootake
CAGradientLayerでグラデーションを描画する
CAGradientLayerを使用してUIViewにグラデーションを描画する機会があったので
実装方法を軽くまとめてみました。# 前提知識
startPoint・・・グラデーションの開始地点
endPoint・・・グラデーションの終了地点# startPoint, endPointを指定しない場合
“`
import UIKitclass ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.setGradation()
}private func setGradation() {
let gradientLayer = CAGradientLayer()
// グラデーションさせる範囲をUIViewControllerのviewのサ
iOSアプリのCI(CircleCI)を改善してみた話
この記事は、Classi Advent Calendar 2020 12/21担当の記事です。
Classi プロダクト開発部 iOSエンジニアの@yokoyanです。
モバイルアプリチームでは、CIの運用が、初期に構築したメンバーが退職していることもあり、ブラックボックスになりかけていたので、整備をおこなったところ、あまり事例がなさそうな方法で改善してみたので、iOSエンジニアにも役に立ちそうなネタが出来たかなと思ったので、それを紹介したいと思います。
# なぜ、改善することになったか
きっかけは、Carthageのセグメンタルエラーが発生する事象への対応です。
[Carthage crashes with Segmentation Fault: 11 · Issue #2760 · Carthage/Carthage](https://github.com/Carthage/Carthage/issues/2760)このエラーは、Carthageのバージョンを0.35.0以上にあげれば、解消されます。
CircleCIは、Carthageがデフォルトでインストールされて
iOSで効果音を鳴らす
現在公開中のシューティングゲーム制作にあたり、効果音で苦労したのでここに記録を残します。
# 評価の流れ
– AVAudioPlayer(BGMで採用、効果音では却下)
– 動作が重い
– シューティングゲームのような短時間で様々な効果音を鳴らすような用途には向いていない
– SystemSoundID(却下)
– 動作は軽い
– 再生するとBGM(AvAudioPlayer)がフェードアウトするケースがある
– OpenAL(採用)
– 純正Musicアプリと交互に利用すると効果音が再生されなくなるケースがあった
– 再現性は不明# BGM再生
AVAudioPlayerの利用方法は色々な方が分かりやすい記事を残しているので本記事では割愛します。
# 効果音再生
以下の流れで素材の準備と実装を行いました。
## mp3をcafに変換
mp3のままでは利用できないので下記コマンドでファイル変換します。
afconvert -f caff -d ima4 input.mp3 output.caf
3年以上放置していた個人で公開中のiOSアプリを再度申請した話
ある日のこと、Appleから1通の通知が・・・
![スクリーンショット 2020-12-22 20.47.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29418/87277e4e-9785-77e9-970c-d2418b42de67.png)DeepL翻訳
>2016年9月1日、意図した通りに機能しなくなったアプリ、現在のレビューガイドラインに従っていないアプリ、または時代遅れのアプリを評価して削除する継続的なプロセスを実施することを発表しました。
お使いのアプリがかなりの期間更新されていないことに気付きました。[ハッシュタグの管理アプリ](https://apps.apple.com/jp/app/ハッシュタグ-メモ-lite/id1153380973)を公開中なのですが、気がついたら前回リリースから3年経過・・・
このまま削除されるのは悲しいので対応を行いました。# ダークモード対応
ストーリーボードで各種パーツのプロパティを確認したところ、WhiteとかBlackとか固定のカ
CocoaPodsでiOSのライブラリーを作ってみる
## はじめに
僕は本業ではWebアプリ開発を中心として、主にバックエンド側やインフラ(少し)をやっています。フロントエンド側はjs(Vue.js)やCSS(少し)にちょっと触ったことがありますが、ネイティブアプリの開発は全く経験がありませんでした。最近、会社のサービスの共有認証システムという担当しているシステムはFacebookといったソーシャルログインを導入しようとした時に、Facebookの規約によると、ネイティブでFacebookの専用SDKを利用しなければならないので、ネイティブ側の実装が必要になります。また、共有のシステムで現在複数のサービスに提供していて、それぞれのサービスに対するネイティブアプリがあり、別々に実装したら、効率が悪くて、メンテナンスの面も大変だと思うので、共有のライブラリー(SDK)を作ることにしました。
iOSネイティブアプリの開発は全く経験がなかったけど、学びながらチャンレンジしてみました。(もちろん、ネイティブアプリの経験者の方にサポート、フローしていただきました。)
今回はその経験について書きたいと思います。
## 準備
### 使って
UICollectionViewにLongPressGestureRecognizerで長押しをつける
長押ししたセルに任意の操作ができます。
こちらの記事を元にしています。
```swift
let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(onLongPressAction))
longPressRecognizer.allowableMovement = 10
longPressRecognizer.minimumPressDuration = 1
self.collectionView.addGestureRecognizer(longPressRecognizer)
``````swift
@objc func onLongPressAction(sender: UILongPressGestureRecognizer) {
let point: CGPoint = send