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

iOS関連のことを調べてみた2020年10月01日
目次

iOS アプリがバックに移行するイベントをView側で取得

AppDelegateでアプリのフォアグランドやバックへの移動のコールバックを取得できます。
swiftuiなどのviewやViewController側でそのコールバックを取得するためには、NotificationCenterでオブザーバを設定しキャッチします。

didEnterBackgroundNotificationでバックへの移動のコールバックを取得できます
ここら辺の一覧はドキュメントを参考
https://developer.apple.com/documentation/uikit/uiapplication/1623071-didenterbackgroundnotification
その他のコールバックは「Responding to App Life-Cycle Events」を参照

NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: nil, queue: nil) { _ in

元記事を表示

UIKitでもCombineを使いたい。

## はじめに
iOS14がリリースされ、Swft自体のアップデートやSwiftUIのスタンダード化が進む昨今ですが、
iOS12は切れなくて、実務ではCombineを使えていない方も多いのではないでしょうか。

けど新しい技術試してみたいですよね。
SwiftUI+Combineはちょっとハードル高いけど、まずは慣れたUIKitでCombineだけでも試してみたいですよね!!

というわけで今回は以下の内容で記事を書いてみました。

* Combineの基礎概念について
* UIKitで使ってみる

お役にたてば幸いです。:bow:

※ こまけえことはいいからコードだけ見せろや!って場合は以下をご覧いただけると幸いです。:bow:
[kawano108/CombineBookManagerApp](https://github.com/kawano108/CombineBookManagerApp)

## 環境
この記事は以下の動作環境で動作確認しています。

* Xcode12
* Swift5.3

# Combineって何?
一言で表すと`Apple純正の非同期フレームワー

元記事を表示

UnityでFirebase AuthenticationとFireStoreのサンプル

# はじめに

最近、個人でミニゲームを作成していて裏側でFirebaseを使用しています。
それで認証周りとFirestoreの疎通を検証したのでそのサンプルコードを載せておきます。

あと、エラーの遭遇とかも多々あったのでその辺りもまとめて記載していきます。

基本ボタンをポチッとするだけで認証通ってゲームデータにアクセスできる作りを想定して組んでいます。
なのでメール認証とか電話番号認証とかはスルーしています。

Androidも合わせて作るつもりでしたが、iOSが終わって続けてAndroidもやろうとしたらビルドでこけて解消したときには心折れていたので、匿名(ゲストユーザー)の実装しかしていません。
週末あたりに対応して記事更新しておきます。

以下の認証フローで確認しました。

ゲストから他の認証行った場合にユーザーをリンクさせる処理は実装しています。
複数アカウントの結合は今のところ必要な機能ではなかったので実装していません。

* iOS
* 匿名(ゲストユーザー)
* Sign In with Apple
* GameCenter

* A

元記事を表示

protocolを使うと、非同期通信後のUI更新処理がとてもわかりやすかった話

# はじめに

こんにちは、iOSエンジニアの dayossi です。

家族が幸せになれるサービスを提供したいと思って、
[HaloHalo](https://hallo-hallo.sakura.ne.jp/home/)という家族日記アプリをリリースしています。

今回は、非同期通信後の処理について
protocolがとても便利だったという内容を書いています。

(今回の記事の成果物は、最下部に載せています)

# そもそも非同期でUI更新したいと思ったきっかけは?

「非同期通信でデータを取得したあと、CollectionViewに値を反映しようと思ったけど
なんか表示の仕方がうまくいかないなー」

と思ったのがきっかけです。

## 原因は?

今回は非同期通信の処理に絞って、2つの問題に分けて考えてみました。

・1:参照しているデータがおかしい
・2:UI更新が遅い、滑らかにできない

###1:参照しているデータがおかしい

・クラス型で構築したデータモデルに、APIで取得した値を格納すると
格納した値は参照型となります。
変数に置き換えたあとでも、変数内のデー

元記事を表示

SwiftUIのViewModifierを使ってViewをカスタマイズする

## はじめに
SwiftUIには`ViewModifier`というViewへのカスタムModifierを作成することが可能です。
`ViewModifier`を使うことで、SwiftUIのViewを汎用的にカスタマイズすることができます。
今回はそんな`ViewModifierについてまとめていきます。

## ViewModifierについて
Viewに対して適用させることで、Viewをカスタマイズして返却する機能を実装するための`protocol`です。
`ViewModifier protocol`に定義されている関数は下記です。

“`swift
func body(content: Self.Content) -> Self.Body
“`
本関数の中でViewの更新、または変換処理を行い返却を行います。
`content` は修飾する対象のViewのプロキシです。
`Self.Body`は`associatedtype`で定義されており、Viewの変換処理に返すViewの型をここに記述します。

## ViewModifierを使用する
単純なViewをカード型のVi

元記事を表示

Xcode12から追加されたUICollectionViewListCellを使ってみた。

## あと数年したらUITableViewが使えなくなる??

Xcode12から登場したUICollectionViewListCellですが、機能としてはUITableViewの変わりとなるような新しいUIパーツです。
UICollectionViewListCellでUITableViewライクな画面が作成することができるのです。

これってもう、UITableViewには用無しってことですよね…

ということで、今後リスト形式の画面を表示する時に使用するであろう`UICollectionViewListCell`を試しに使って見ようと思います。

## 1.レイアウトの作成(UICollectionViewLayout)
今回は`insetGrouped`形式のリストを表示したかったので以下のように設定しました。

“`swift

override func viewDidLoad() {
super.viewDidLoad()
navigationItem.title = “タイトル”
collectionView.collectionView

元記事を表示

This copy of libswiftCore.dylib requires an OS version prior to 12.2.0.

雑メモ

以下のエラーが起きた

“`
This copy of libswiftCore.dylib requires an OS version prior to 12.2.0.
“`

以下の手順で修正された

– Xcode開く
– BuildSettings開く
– Runpath Search Paths 検索
– 一番上に `/usr/lib/swift` 追加

![Screen Shot 2020-09-30 at 8.50.49 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167299/f4a397ec-6aef-1bbe-ebb0-81c6fe9eb9df.png)

元記事を表示

【iOS】fastlaneを使ってFirebase App Distributionに自動デプロイする

# 概要
## fastlaneとは?
iOSまたはAndroidのタスクを自動化できるツールです。
fastlaneに用意されたアクションを利用すると、ビルド、テスト、スクショの撮影、アプリのリリースなど様々なタスクを自動化できます。
今回はFirebase App Distributionにipaをデプロイする作業を自動化しようと思います。

### Firebase App Distributionとは?
Firebaseに用意されているアプリ配布サービスです。
一つのFirebaseプロジェクトに最大500人までテスターを追加できます。([公式ドキュメント参照](https://firebase.google.com/docs/app-distribution/manage-testers))

# 環境構築

## 前準備
* Firebaseのプロジェクトを作成する
割愛します。[公式ドキュメント](https://firebase.google.com/docs/ios/setup)を参考に作成しましょう。

* プロビジニングプロファイルを作成する
ビルドしてipaを生

元記事を表示

UISplitViewControllerでsegueを使ったprimaryとdetail間の値渡し

近年のStoryboardを利用せずにコードレイアウトを組む流行や、SwiftUIの登場などによって使われなくなってきているStoryboard with segueですが、今回はTipsとしてsegueを使ったprimary>detail間の値渡しの方法について説明します。

# 画面構成
画面構成は、Storyboard上で以下のような形です。primary/detailのどちらにも`UINavigationController`が挟まっています。別にprimaryは遷移をするわけではないのですが、`navigationBar`にアイテムを置くことはあるのでこのようにしています。

primaryからdetailに向かってsegueが伸びていて、`showDetail(e.g. replace)`のタイプになっています。

![スクリーンショット 2020-09-30 16.42.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114709/e97eb344-74b0-469e-ce89-230

元記事を表示

iOS14対応をまとめてみた

# 前書き

今年もiOSアップデートの時期がきました。
iOS13の対応は[こちら](https://qiita.com/OkamotoHaru/items/0f285e399ed3fc44ea99)。
毎年エンジニアを泣かせる変更をさらっと行うAppleさんの今年のメニューをピックアップしていきます。
随時更新していけたらと思います。

# 新機能

### AppClip
参考:[Introducing App Clips](https://developer.apple.com/app-clips/)
参考:[ノンエンジニア向けにiOS14のAppClipsでのユーザー体験と機能を伝えるために考慮したい事まとめ](https://qiita.com/satoshin2071/items/2e310a7fc59b0aa92344)
参考:[はじめての App Clip 【概要編】](https://qiita.com/yum_fishing/items/cd9de34dbac59d598ac2)

### WidgetKit
参考:[Introducing WidgetKit](

元記事を表示

iOS14からテキストフィールドがキーボードに隠れるのを自動調整してくれるようになった

## はじめに

Xcode12、SwiftUIで動作を確認しました。

## iOS14のテキストフィールド

従来のアプリ開発において、キーボード入力のある画面では下記のような挙動が発生してしまうケースが度々発生し、キーボードの高さ分だけ表示位置を調整するといった実装を行うことがよくありました。

1. TextFieldにフォーカスが当たる
2. ソフトウェアキーボードが表示される
3. キーボードが表示されたことでTextFieldが見えなくなってしまう

“`swift
struct ContentView: View {
@State private var text: String = “”

var body: some View {
VStack {

元記事を表示

iOS14のおすすめショートカット3選

iOS 14の[ショートカットアプリ(App Store)](https://apps.apple.com/jp/app/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88/id915249334)をインストールすると、
普段の操作の自動化などが簡単に設定可能です。

今回は特におすすめのレシピを3つご紹介します。

## ① 毎晩のアラームセット、音量調整を自動化 ⏰
アラームの音を大きくするのを忘れており聞こえなかった・・・なんて事態を防ぎます!

#### オートメーション内容
– 毎晩0:00に実行
– アラーム1~3をONに変更
– 音量を55%に設定
– デバイスを振動させる(設定完了の合図)

## ② Kindleを開き、本の読み上げを開始 ?
ランニング・乗車時などに、ワンタップでKindle本の読み上げを開始することが可能です。

#### ショートカット内容
– Kindleで私の本を開く(最後に開いていた本が開く)
– 3秒待機(アプリ起動後、本が開くまでの待ち時間)

元記事を表示

SwiftUIでトグルのカスタムスタイルを適用

SwiftUIでは、`ToggleStyle`を使用してトグル(スイッチ)の外見をデザインすることができます。トグルの色、形、アニメーションの変更を行うことが可能です。

image

## `ToggleStyle` の構造体

始めるにあたり、先ず `ToggleStyle` タイプに対応する構造体を実装する必要があります:

“`swift
struct NewToggleStyle: ToggleStyle {

func makeBody(configuration: Configuration) -> some View {
// トグルのUIコンポーネント
}

}
“`

この形式を適用するには、このコードを利用してください:

“`swift

元記事を表示

UICollectionView must be initialized with a non-nil layout parameter

## なんか落ちる

`UICollectionView`をコードで追加したところ、`UICollectionView must be initialized with a non-nil layout parameter`エラーが。。。

“`Swift
let collectionView = UICollectionView(frame: view.frame)
collectionView.delegate = self
collectionView.dataSource = self
view.addSubview(collectionView)
“`

## 解決方法

コードで`UICollectionView`を追加するときは、`FlowLayout`をinit時に追加しなければならないらしい。

“`Swift
let flowLayout = UICollectionViewFlowLayout()
flowLayout.itemSize = CGSize(width: 100, height: 100)
let collectionView = UICo

元記事を表示

UIViewRepresentableを使ってSwiftUIでちょっとリッチなWebviewを表示してみる

## はじめに
iOS14時点でのSwiftUIでは現在、WKWebViewに相当するViewのサポートを行っておりません。
そのため、UIKitのWKWebViewをSwiftUI用にラップして使用することが必要となります。
今回は基本的な機能(ツールバー、プログレスバー)を搭載したWebViewを表示させることをゴールとし、その中で出てくる`UIViewRepresentable`の使い方についてまとめていきたいと思います。

※ 本記事では汎用性を考え、iOS13まででサポートされている技術を使用してWebViewの表示を行います。

## UIViewRepresentableについて
UIKitのViewをSwiftUIで使用するには`UIViewRepresentable`を使用する必要があります。
`UIViewRepresentable`とはSwiftUIにてUIKitのViewを使用するためのラッパーです。
`UIViewRepresentable`のプロトコルで定義されている各関数について説明します。

“`swift
func makeUIView(contex

元記事を表示

Xcode 12 で自作 framework ビルド時に lipo コマンドがエラーを吐くようになった

# 現象

iOS用に自作の framework を fat でビルドしていました。(おそらく[ここ](https://gist.github.com/cromandini/1a9c4aeab27ca84f5d79)をコピペ。)
Xcode 12 に上げたところ、下記のようなエラーが出るようになってしまいました。

“`
fatal error: lipo:
***/Debug-iphonesimulator/***.framework/***
and
***/Debug-iphoneos/***.framework/***
have the same architectures (arm64) and can’t be in the same fat output file
“`
※ 見やすいように伏字と改行を入れています。

# 原因

Xcode 12 から、iPhoneシミュレーターも arm64 向けにビルドするようになったようで、従来実機にのみ含まれていたのが両方に含まれるようになり、コンフリクトしてしまったようです。

参考: [Stackoverflow:

元記事を表示

FlutterやってみたよPart7(retrofit導入)

# 初めに

ほとんどのアプリがapi通信をすると思います。
なんか楽にクライアント生成できるのないかな〜と調べていたらretrofitというライブラリを見つけました。
今回はそれを導入してみようと思います。

– [retrofit](https://pub.dev/packages/retrofit)
– [retrofit導入YouTube](https://www.youtube.com/watch?v=7VYwtpaZEhg)

# サンプルアプリ

まずはサンプルアプリの仕様をざっくり決めます。

– Qiitaのapiを使用して最新記事を取得する
– 取得した記事を一覧で表示する
– 記事のタイトルをタップしたら記事詳細をwebviewで開く

今回はこんな感じの簡単なアプリにします!

# retforitの仕組み

導入する前にざっくりとどういう仕組みで動くのか理解します。
公式のReadmeやSampleを見ればなんとなくわかると思いますが、
abstractでapiのエンドポイントを定義。
この定義されたファイルを元にクライアントの実体を自動生成する仕組みで

元記事を表示

Firebase AnalyticsをiOSに組み込む

#自分用メモ
Google Analyticsが終了し、FirebaseにAnalyticsが移ったので
そっち経由でアプリに導入する。

##手順
概要をこの記事を読んで同じことする

Firebase Analytics の First Step ! iOSアプリにイベントとユーザプロパティを仕込んでみた

##つまった
Xcode側のコンソールには表示されるのに、なぜかFirebaseのDebug Viewに表示されない

##解決策
Product->Edit Schemaから以下のタグを追加
-FIRAnalyticsDebugEnabled
-FIRAnalyticsDebugEnabled

無事表示される。

元記事を表示

iOS 14からUNNotificationPresentationOptionsの「.alert」が「.banner」と「.list」に分かれた

## はじめに

プッシュ通知の表示オプション( `UNNotificationPresentationOptions` )に `.alert` がありますが、iOS 14までで非推奨になりました。
代わりに `.banner` と `.list` の2つに分かれ、これらの挙動を調べたので紹介します。

## 環境

– Xcode:12.0 (12A7209)
– Swift:5.3
– iOS:14.0

## プッシュ通知の挙動

以下の表の通りです。

`.alert` ではバナーと通知センターの両方に通知が来ましたが、iOS 14からは `.banner` と `.list` を使うことでどちらか片方のみに通知が来るようにできます。

|UNNotificationPresentationOptions|バナー|通知センター|
|:–|:–|:–|
|`.alert`|![Simulator Screen Shot – iPhone SE (2nd generation) – 2020-09-29 at 13.56.50.png](https://qiita-image

元記事を表示

【Swift】WidgetKit使用時に、入力された文字をUserDefaults経由でWidgetに表示する方法

前回こちらの記事[【Swift】iOS14.0から追加されたWidgetKitを簡単に実装する方法](https://qiita.com/yajima_tohshu/items/85e01a19db6cfc16ca92)
で、WidgetKitを使用する方法を記載しましたが、
今回はWidgetKitをExtensionとして追加後、UserDefaults経由で値を共有する方法を記載します。

#環境
– Xcode: 12.0
– Swift5

#下準備
※前提として既にTargetからWidgetKitが追加されていることとします
####1. CapabilityからAppGroupを追加
TargetをWidgetApp(WidgetKitを追加した元となるProject)に選択し、CapabilityからAppGroupをダブルクリックしAppGroupを追加します。
![スクリーンショット 2020-09-29 11.47.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656690

元記事を表示

OTHERカテゴリの最新記事