- 1. iOSのユニットテストでAppDelegateのMockを作成する
- 2. KMMを触ってみて思ったこと
- 3. protocolの基本と種類(swift)
- 4. 【iOS14】UITableViewをUICollectionViewに書き換える練習
- 5. Info.plistからバージョン情報を取得する
- 6. Apple Silicon (M1) の pod install エラーの直し方
- 7. 【Swift】SPAで作られたwebページをWebViewで扱う
- 8. Develop in Swift Fundamentalsについて
- 9. 【iOS15】タブバーの背景を有効にしたい
- 10. 【Swift】Pusherを使ってリアルタイム双方向通信を実現する
- 11. [Swift5] FireStoreでカスタムオブジェクトを扱う
- 12. [Swift5] セルの選択状態をカスタムする
- 13. because it has an invalid code signature, inadequate entitlements or its profile has not been explicitly trusted by the user.と出た時の解決法
- 14. [iOS] Firebase Crashlyticsを設定して使用してみる
- 15. Xcodeで”private key is not installed”と表示されたら
- 16. 【Tips】SidebarのAppearanceを動的に切り替える
- 17. UISheetPresentationController を使ってみた
- 18. Darkモード, Lightモードを切り替えた時の挙動
- 19. Apple純正メールアプリのようなロングプレスによる複数選択を実装する
- 20. [iOS]AVAssetWriter+swifterでHLS配信
iOSのユニットテストでAppDelegateのMockを作成する
# はじめに
ユニットテストをするときに、可能な限り**副作用**を減らしていく必要があるかと思います。ここでいう「副作用」とは、**他の機能の結果が影響して、テスト対象の機能の結果が変わってしまうこと**です。また、正確なカバレッジが取れないこと・サーバーへ負荷をかけてしまうことも副作用であると考えます(`・ω・´)
今回は、iOSアプリ開発のAppDelegateの副作用をどうやって無くすか考えていきます。
# 前提
– 本記事では、SceneDelegateを使用していないプロジェクトを想定しています。
– SceneDelegateのMockについても記事を執筆しましたら、リンクを貼ろうと思いますm(_ _)m
– Test Doubleでいうと、Fake Object的なものを作りますが、命名はxxxMockにしています。テストカバレッジの確認から順を追って説明していきますので、
本題のAppDelegateのMock作成だけ確認したい方は
飛ばして[こちら](https://qiita.com/y-okudera/items/bf91374fdb4acfab9
KMMを触ってみて思ったこと
##はじめに
KMM(Kotlin Multiplatform Mobile)とは、Kotlin/NativeというKotlinのコードをさまざまなOSのネイティブコード(マシン語)に変換する技術を使って、モバイル(iOSとAndroid)に特化したクロスプラットフォーム開発をできるようにするSDKです。僕は~~KMMってなんか響きがかっこ良いんで~~KotlinでiOSアプリが作れるっていうところが凄いなと思って勉強を始めてみました。勉強を始めて一番最初に浮かんだ疑問として、Kotlinで開発するのであればただのAndroid開発と何が違うのかというのがありました。その疑問について色々調べてみました。
##仕組みの違い
そもそもAndroidのネイティブ開発ではKotlinやJavaを使うことができます。それぞれのコードがART(Android RunTime)という実行環境でAndroidOS上で動くようなネイティブコードにコンパイルされることで動いています。対してKMMはKotlin/NativeがKotlinを各OSのネイティブコードに変換するための諸々をやってくれて
protocolの基本と種類(swift)
#protocolとは
直訳すると議定書・手順。swiftでは、クラス・構造体などに対してプロパティとメソッドを定義する機能。
プロトコルを適用したクラス・構造体は、プロトコルに定義されているプロパティ・メソッドを必ず定義しなければならない。つまり、「クラス作成のルールを定めて、それを守らせる」という認識であっているでしょうか。
#protocolを定義する
“`swift:sample
protocol プロトコル名 {
var プロパティ名 : 型 {set get}
func メソッド名(引数名 : 型) -> 戻り値の型
}
“`プロパティ名の横には{set get}もしくは{get}
を記入する。
`{set get}` 読み書き可能
`{get}` 読み込み専用#代表的なプロトコルの種類
###CustomStringConvertible
インスタンスの文字表現を自由にカスタマイズできるプロトコル。“`swift:CustomStringConvertible
class Shoe: CustomStringConve
【iOS14】UITableViewをUICollectionViewに書き換える練習
UITableViewが非推奨の方向らしい?
「UITableViewを使っているなら、UICollectionViewへ移行することを強くお勧めします」と言っていたので、少なくともiPadOSアプリではUITableViewはもう使わない方向にいくんだろうな。https://t.co/44k0XBJOTB
— たかしんぐ (@takashings) June 25, 2020
資料を参考にすれど、む・・・むずかしい。
https://qiita.com/shiz/items/4227accc7d13ae439d1d
こういうときは、簡単なサンプルを書いてみようと思い
そういう事をされている方の記事を見つけました。https://qiita.com/hiiragi252/items/70b02bf22bec51f3b97a
こちらの記事を参考させて頂き、今回はセクションを使わない
UICollectionLayoutListConfiguration.Appearance.plain
なものを作りたかったので、改変した結果がこちらです。自分の分かる範囲では、Sectionは完全に消せなかったのでIntにして
layoutConfig.headerMode = .none としてみました。【新しい疑問点】
dataSourceは新しくなったけどdelegateはそのまま?
=>
Info.plistからバージョン情報を取得する
バージョン情報の取得方法
# VersionNameの場合(1.2.3.4的なやつ)
“`
VERSION_NAME=(`/usr/libexec/PlistBuddy -c “Print CFBundleShortVersionString” hoge.app/Contents/Info.plist`)
echo $VERSION_NAME
“`
VersionCodeの場合は、CFBundleShortVersionStringをCFBundleVersionに置き換える。
Apple Silicon (M1) の pod install エラーの直し方
## 概要
話題のM1チップ搭載のMacを購入したので、早速Xcodeで開発をしようとしたところ Pods が動かない問題があり結構ハマったので記録として残します。将来的にはCocoapods 側で改善されることを願います。## 環境
– 動作確認日は `2021/08/14`
– M1チップのMacBook Air
– ターミナルは基本的にrosettaを利用しないiTerms2
– homebrewをインストールして、anyenv経由でrbenvをインストール
– rbenvで2.6.8をインストールしてglobalに設定
– rbenvで入れたrubyにcocoapodsをインストール## 問題
Mac (M1) で `pod install` がエラーで失敗する。“`console
(下記はイメージ。ログ残してなかったので他所から拝借)
LoadError – dlsym(0x7f8926035eb0, Init_ffi_c): symbol not found – /Library/Ruby/Gems/2.6.0/gems/ffi-1.13.1/lib/ffi_
【Swift】SPAで作られたwebページをWebViewで扱う
#何が問題か?
WebView内のコンテンツがSPA(Single Page Application)で作られていると、ページ遷移しても期待したように`WKWebView`の`delegate`が呼ばれない場合があります。SPAは最初にhtmlを取得したらJavaScriptによって画面の書き換えを行うので、webページの読み込みが初回のみしか発生しないためです。
例えばwebコンテンツがページ遷移するたび、htmlの`title`タグの情報を取得し`navigationItem.title`にセットする場合を考えます。
普通のwebページなら読み込み完了のタイミングで以下のように`title`をセットするので問題ありませんが、SPAだとこの`delegate`は初回のみしか呼ばれません。そのため最初にセットされた`title`が`navigationItem`に残り続け、遷移先の`title`は`navigationItem`に反映されません。
“`swift
func webView(_ webView: WKWebView, didFinish navigation:
Develop in Swift Fundamentalsについて
#swiftの資格
転職のために少しでも技術を証明するものを探していたところ、iosアプリ開発の言語であるswiftには
App Development With Swiftというapple主催の民間資格があること知り、取得を予定していました。
qittaでも1記事しか見つからなかったのでかなりマイナーな資格なのでしょう。###App Development With Swift 概要
試験名:App Development with Swift
科目名:App Development with Swift Level.1
試験の言語:英語
所要時間:50分
受験料:一般¥10,780(税込)/学割¥8,580(税込)
試験実施方式:CBT試験>[試験案内公式](https://www.odyssey-com.co.jp/app-dev-with-swift/)
所要時間50分で10780円の民間試験って高く感じます。
去年受けた気象予報士試験は試験時間6時間くらいで11140円の国家資格でした。(まあ落ちてますが)#App Development With Swi
【iOS15】タブバーの背景を有効にしたい
### 注意
執筆時点でベータ版を扱っているため、正式版と挙動が異なる可能性があります。# UITabBarAppearanceを使う
“`Sample.swift
…
let appearance = UITabBarAppearance()
appearance.backgroundColor = UIColor.gray
tabBar.standardAppearance = appearance
tabBar.scrollEdgeAppearance = appearance
…
“`# 環境
– Xcode 13.0 beta 5
– iOS 15.0# 背景
`iOS 15`から`UITabBar`の背景が取り除かれたため、明示的に背景色を指定する必要があった。– UITabBarについて
– WWDC2021のビデオ 5:40〜 https://developer.apple.com/videos/play/wwdc2021/10059/# 実装にあたり
`UITabBar`クラスの`standardAppearance (iOS
【Swift】Pusherを使ってリアルタイム双方向通信を実現する
## Pusherとは
[公式Webサイト](https://pusher.com/channels/pricing)
– WebSocketを用いてリアルタイムの双方向通信機能をWebやモバイルアプリに組み込むサービス※今回はモバイル側の実装のみ書いています
## PusherをiOSに組み込む
### ライブラリの導入
[PusherSwift](https://github.com/pusher/pusher-websocket-swift) を使用する。– PodfileにPusherSwiftを追加する
“`Podfile
pod ‘PusherSwift’
“`## Swift側での受け取りを実装する
– Pusherのdataはjsonで定義して、フロントでは構造体にマッピングすると使いやすいです“`swift
private func setObservePusher() {
pusher = Pusher(key: “APP_KEY”)
let channelName: String = “CHANNEL_NAME”
[Swift5] FireStoreでカスタムオブジェクトを扱う
# はじめに
[Cloud Firestore](https://firebase.google.com/docs/firestore?hl=ja)にデータを追加する際に、`Codable`を使用したいと思ったところ、サポートされているようなので確認してみました。備忘録です。>Map または Dictionary オブジェクトを使うとドキュメントを表しにくいことが多いため、Cloud Firestore では、カスタムクラスを使ったドキュメント作成をサポートしています。Cloud Firestore は、オブジェクトをサポートされているデータ型に変換します。
参考: [Cloud Firestore にデータを追加する](https://firebase.google.com/docs/firestore/manage-data/add-data?hl=ja)
# 実装方法
以下、[公式ドキュメント](https://firebase.google.com/docs/firestore/manage-data/add-data?hl=ja)のコードを引用しています。“`s
[Swift5] セルの選択状態をカスタムする
# はじめに
UITableViewCellを使用しているときなどに、選択状態によって背景色やセル上のviewの表示/非表示を切り替えたいときがあると思います。
便利なメソッドがあるのでご参考までに。
内容が間違っていたり、もっと便利なやり方があればぜひ教えていただけると幸いです。#実装方法
結論、[setSelected(_:animated:)](https://developer.apple.com/documentation/uikit/uitableviewcell/1623255-setselected)を使用するだけです。
以下のコードは、カスタムなUITableViewCellの選択状態によって背景色とラベルの表示/非表示を切り替えています。
selectedプロパティがセルの選択状態を持っているので、簡単に処理を切り替えられます。“`swift
import UIKitclass CustomCell: UITableViewCell {
@IBOutlet private weak var titleLabel: UILabel!
@
because it has an invalid code signature, inadequate entitlements or its profile has not been explicitly trusted by the user.と出た時の解決法
#はじめに
Apple Developerで証明書を作成しただけでは実機でRunできずド忘れして詰まったので、その解決法。#起きた現象
![Screen Shot 2021-08-12 at 11.52.41 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300780/6d73a028-3004-1636-5210-8fc017654be1.png)
このようなエラーが起きてRunできない
#解決法
実機の設定Appから
一般 → プロファイルとデバイス管理で「Trust “Apple Development: XXXXX”」を押す。
そうすることでRunできるようになる
[iOS] Firebase Crashlyticsを設定して使用してみる
# はじめに
[Firebase Crashlytics](https://firebase.google.com/docs/crashlytics?hl=ja)は、リアルタイムのクラッシュレポートツールであり、アプリの品質を保つための問題特定に役立ちます。
簡単に導入できるためアプリに導入してみたので手順をまとめました。
内容が間違っていたり、良い使用ケースなどを知っている方がいれば、ぜひ教えていただけると幸いです。# 導入手順
####1. Firebaseをプロジェクトに追加する。
ここでは説明は省きます。
まだ追加していない方は[こちら](https://firebase.google.com/docs/crashlytics/get-started?hl=ja&platform=ios)をご参考。####2. Googleアナリティクスを有効にする (推奨)。
クラッシュに遭遇していないユーザー数の表示、パンくずリストのログ、ベロシティ アラートなどの機能を利用するには、Firebase プロジェクトで Google アナリティクスを有効にする必要があります。
既存の
Xcodeで”private key is not installed”と表示されたら
Xcode で Archive するときなどに private key is not installed と表示されたら
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33704/1e81acfd-a643-d02c-2be3-6f3e14344a29.jpeg)
Manage Certificates… から
![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33704/ebfc7b62-e9fe-ec85-af0c-af1ab13a4118.jpeg)
Apple Distribution を追加します。
【Tips】SidebarのAppearanceを動的に切り替える
traitCollection.horizontalSizeClassのcompactとregularで別々のappearanceをサイドバーに適応させたいようなケースがあります。FinderやMusicなど、Apple純正Appではよく見られます。
![IMG_E4281229A214-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114709/82426e41-aed2-4e91-1f8c-72a91b2e2f63.jpeg)
(筆者のファイルアプリスクリーンショット)このようなインターフェースは[iOS HIG](https://developer.apple.com/design/human-interface-guidelines/ios/bars/sidebars/)でもSidebarパターンとして言及されています。
> Apply the correct appearance to a sidebar. To create a sidebar, use the sidebar
UISheetPresentationController を使ってみた
# はじめに
WWDC2021 で発表のあったハーフモーダルを実装することができる [UISheetPresentationController](https://developer.apple.com/documentation/uikit/uisheetpresentationcontroller?changes=_2_1) を使ってみたので、
使用方法と使ってみた感想などを綴っておきたいと思います。これまでは [PanModal](https://github.com/slackhq/PanModal) や [FloatingPanel](https://github.com/scenee/FloatingPanel) 等のライブラリを使って実装していましたが、
公式でもサポートされたようなので使い勝手を調べてみました。## 環境
Xcode: 13.0 beta 4 (13A5201i)
Swift: Swift5
iOS: iOS15(public beta 4)# 使用方法
以下のようにするだけで簡単にモーダル画面を実装することができます。
“`sw
Darkモード, Lightモードを切り替えた時の挙動
# Darkモード, Lightモードを切り替えた時の挙動
Darkモード、Lightモードを切り替えた時のViewの更新処理をコードで行いたい時ってどうしたらいいのかな、と思い調べたのでメモ。
## 再描画メソッドをオーバーライドする
Darkモードを切り替えると自動的にiOSからViewへ再描画するよう指示がいく。
その時実行されるメソッドと順序は以下のとおり。– NSView
– updateLayer()
– draw(_:)
– layout()
– updateConstraints()– UIView
– traitCollectionDidChange(_:)
– layoutSubviews()
– draw(_:)
– updateConstraints()
– tintColorDidChange()
– UIViewController
– traitCollectionDidChange(_:)
– updateViewConstraints()
– viewWillLayoutSubviews()
Apple純正メールアプリのようなロングプレスによる複数選択を実装する
## やりたいこと
標準メールアプリのような長押しでドラッグすると
複数選択ができるUIを実現したい## アプローチ① 提供されているAPIを使う
### 方針
iOS13以降ではTableView、CollectionViewに2本指タップを検出し複数選択を実現するためのAPIが提供されています。
[Selecting Multiple Items with a Two-Finger Pan Gesture](https://developer.apple.com/documentation/uikit/uitableviewdelegate/selecting_multiple_items_with_a_two-finger_pan_gesture)上記に書いてある方法で簡単に
– 複数選択のUI
– 選択されたセルの管理
– 画面の端までスクロールしたときの自動スクロールを実現できます。
なお、このアプローチの場合2本指タップをトリガーに複数選択が始まります。### 実装
“`swift:DefaultSmoothSelectableViewContro
[iOS]AVAssetWriter+swifterでHLS配信
# iOS で AVAssetWriter + swifter で HLS 配信
* iOS14 から AVAssetWriter に fragmented MPEG-4 ファイルを出力する機能が追加されました!!!https://developer.apple.com/documentation/avfoundation/avfiletypeprofile/3563936-mpeg4applehls?changes=_6
* [swifter](https://github.com/httpswift/swifter) を使って httpサーバを起動し、 AVAssetWriter で作成した fragmented MPEG-4 ファイルを配布することで、iPhone から HLS で映像配信する事が可能です
# 関連リンク
* リポジトリはこちらhttps://github.com/fuziki/VideoCreator
* Apple のゲームアプリのテンプレートの画面を配信する事が可能です