iOS関連のことを調べてみた2021年08月17日

iOS関連のことを調べてみた2021年08月17日

Building Mobile Apps at Scaleの自動テストの部分で知らなかったところメモ

世界的な会社がどうテストしているのか、ちょっとテスト関連のベストプラクティスを探して読んでみています。

個人的にはrobot pattern testingはちょっとした収穫でした。
またかなりSnapshot testが行われていることが印象的でした。
詳しくは以下

https://www.mobileatscale.com/

(ユニットテストは大事的なのが書いてあるんですが、知らなかったところ中心で書いているので飛ばしています)

### Snapshot test

IntegrationテストやUI/E2Eテストの特別な形。スクショをとって、保存されている画像と比較する。データは通常モックが使われる。違うとテストが失敗する。失敗の理由として画像が使われる

Snapshot testのUberでの事例

* iOSではFacebookからiOSSnapshotTestCaseを引き継いで、多用していた
* デバイスのサイズが多様だったのでAndroidで適切なスナップショットを行うための労力がこのプラットフォームでは高すぎると考えたのでAndroidでは行わないことを

元記事を表示

iOSのユニットテストでSceneDelegateのMockを作成する

# はじめに
前回投稿した記事でユニットテスト実行時の副作用を減らしていくためにテストターゲットではAppDelegateのMockを作成してみました。

今回は、SceneDelegateのMockを作成して、ユニットテスト実行時はそれを使用するようにしてみたいと思います。

# 前回の内容
前回の記事を前提に説明を記載しますので、そちらも併せて確認してみてくださいm(_ _)m

– [iOSのユニットテストでAppDelegateのMockを作成する](https://qiita.com/y-okudera/items/bf91374fdb4acfab927c#appdelegate%E3%81%AEmock%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)

# 前提
今回は、シングルウィンドウのアプリを想定しています。
マルチウィンドウの場合も同様で問題ないかどうかは確認ができていないですm(_ _)m

また、古いOSバージョンをサポートしているとSceneDelegateを使用できるかどうかOSバージョンによる分岐が発生すると思い

元記事を表示

[SwiftUI]トラッキング許可アラートを表示する

## 投稿の経緯
個人開発でトラッキングアラートの表示を実装したので備忘録として。今回は最低限の実装を紹介します。(機能的には充分です)

## 環境
Swift version 5.4.2
Xcode version 12.5.1

## Info.plist
`Privacy – Tracking Usage Description`を`Info .plist`へ追加して値を設定します。今回は`『許可するとユーザーに無関係な広告が表示されにくくなります』`というように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643372/103b2a25-f1c5-ba3f-91e0-8e2d72c21f2f.png)

## ライブラリをインポート

“`swift
import AdSupport
import AppTrackingTransparency
“`
ふたつのライブラリをインポートします

## requestTrackingAuthorizationを書く

元記事を表示

[swift]API通信を利用しているクラスをUnitTestしてみる[stubとmockの使い方]

## はじめに
外部依存のあるコンポーネントはUnitTestが書きづらいです。
今回は書きづらいUnitTestをAPI通信を利用しているクラスを用いて、stubやmockを利用してtestできる状態までを実際に触りながら紹介していきたいと思います。
またUnitTestが分からない方は是非下記の記事をご覧下さい。

https://qiita.com/yuujioka/items/10f889fccb61b27213bc

## 環境
・Xcode : 12.5
・macOS : Big Sur
## 内容
今回はAPI通信を行なっているクラスを対象にUnitTestを行います。
クラス内で完結しているテストは非常に書きやすい事は前回の[試して学ぶUnitTest](https://qiita.com/yuujioka/items/10f889fccb61b27213bc)に記述していますが、外部に依存しているコンポーネントは非常に書きづらいです。そこで今回は依存コンポーネントを差し替え(DI)を行い、stubやmockを利用したUnitTestをサンプルを交えながら解説していきま

元記事を表示

[iOSショートカット] ログインユーザー名・パスワードを入力

:::note info
クリップボードが「ユーザー名 → パスワード」に切り替わるので、ペーストするだけでログインできる
キーボード入力から開放されるので、タイピングミスによるエラーはなくなる
:::

## 事前準備

[iPhone、iPad、iPod touch で共有ショートカットを有効にする](https://support.apple.com/ja-jp/HT210628)

## 共有ショートカット

https://www.icloud.com/shortcuts/457ef554498f475b8fe77b64e2b076e3

:::note warn
マイショートカットに追加されるので、ユーザー名とパスワードを編集してください
:::

## 導入後のログイン操作

“`
メニュー「クリップボードにユーザー名にします」をタップ

IDにペースト

パスワードがコピーされたメッセージが表示されたら、
パスワードにペースト

“`

:::note info
オートメーションで、アプリ起動時に上記の共有ショートカットを実行させることで、
起動時にログインユ

元記事を表示

UIKitのUIViewController/UIViewをSwiftUIで利用する場合の利用方法とその詳細

# はじめに

UIKitのUIViewController/UIViewをSwiftUIで使う場合の方法とその詳細について書いておきます。

大抵コード書いてるときに検索してから要点が見つかるまで時間がかかるため先に結論をテンプレートとして示します。

# 結論: このテンプレートを埋める

UIViewControllerを利用したい場合は、下記コードを加筆修正しいけば最低限動くレベルになるはずです。

“`swift
import SwiftUI
import UIKit

struct SampleViewController: UIViewControllerRepresentable {
// 1. 利用したいViewControllerにエイリアスをつける(もちろんつけずに下記コードで都度書いてもいい)
typealias UIViewControllerType = UINavigationController

// 2. 必須のメソッド。作成したいViewControllerを返すメソッドを実装する
func makeUIViewC

元記事を表示

iOS12以下でSign in with Appleを実装する

# 概要
アプリが、サードパーティのログインサービスを利用してログインを実装する場合、Appleでサインイン(Sign in with Apple)の実装が必須になりました。

通常はAuthenticationServicesに含まれているAPIでSign in with Appleの処理が可能ですが、Sign in with Apple関連のAPIはiOS 13以上の対応になるので、iOS 12では別な手段を講じなければいけません。
その手段について説明します。
他プラットフォームでも一部は共通する手段になるかと思います。

# 必要なもの
以下の実装はUniversal Links対応されていることを想定しています。

# App Developer Programで必要な作業を行う

## Service IDの追加
以下の手順を参考に、Services IDsの追加を行います。
App Developer Programの構成は更新される可能性があるので参考程度にしてください。

– identifierを選択し、+ボタンを選択
– Services IDsをチェックし、co

元記事を表示

IPAファイルを再署名する方法(Mac)

## はじめに

Xcode 12.4以下で署名したIPAファイルは、どうやらApp StoreやTestFlight以外からではiOS 15の端末にインストールできないようです。

そのため、IPAファイルを再署名することにします。

## 環境

– OS:macOS Big Sur 11.5.2

## IPAファイルの再署名

IPAファイルの再署名は、コマンドの実行のみで完結します。

“`bash
# IPAファイルを展開する
# `Payload` というフォルダが作成される
$ unzip ○○.ipa

# アプリの署名を確認する
$ codesign -dvvvvv ./Payload/××.app

# アプリを再署名する
$ codesign -s “{キーチェーンアクセスに表示されている証明書の名前}” -f –preserve-metadata –generate-entitlement-der ./Payload/××.app

元記事を表示

iOSのユニットテストでAppDelegateのMockを作成する

# はじめに
ユニットテストをするときに、可能な限り**副作用**を減らしていく必要があるかと思います。

ここでいう「副作用」とは、**他の機能の結果が影響して、テスト対象の機能の結果が変わってしまうこと**です。また、正確なカバレッジが取れないこと・サーバーへ負荷をかけてしまうことも副作用であると考えます(`・ω・´)

今回は、iOSアプリ開発のAppDelegateの副作用をどうやって無くすか考えていきます。

# 前提
– 本記事では、SceneDelegateを使用していないプロジェクトを想定しています。
– Test Doubleでいうと、Fake Object的なものを作りますが、命名はxxxMockにしています。

テストカバレッジの確認から順を追って説明していきますので、
本題のAppDelegateのMock作成だけ確認したい方は
飛ばして[こちら](https://qiita.com/y-okudera/items/bf91374fdb4acfab927c#appdelegate%E3%81%AEmock%E3%82%92%E4%BD%9C%E6%88%90%E

元記事を表示

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が非推奨の方向らしい?

資料を参考にすれど、む・・・むずかしい。

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 UIKit

class CustomCell: UITableViewCell {

@IBOutlet private weak var titleLabel: UILabel!
@

元記事を表示

OTHERカテゴリの最新記事