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

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

[iOS13]DeprecatedになったkeyWindowの取得方法

# 環境
– Xcode 12.1
– Swift 5.3

# 概要
`UIApplication` のプロパティである `KeyWindow` が
iOS13.0でDeprecatedになっていたので取得方法を修正する必要があります。
[Apple公式ドキュメント – keyWindow](https://developer.apple.com/documentation/uikit/uiapplication/1622924-keywindow)

(今更ですが)

# 取得方法
### 修正前
“`swift
UIApplication.shared.keyWindow
“`

### 修正後
“`swift
UIApplication.shared.windows.first { $0.isKeyWindow }
“`

参照: [stack overflow](https://stackoverflow.com/questions/57134259/how-to-resolve-keywindow-was-deprecated-in-ios-13-0)

元記事を表示

CoreMLモデルのサイズを小さくする量子化でモデルの精度はどう変わるのか

モバイルに載せるなら、モデルのサイズは小さいほうがいいと思う。
量子化とは、重みパラメータを、例えばFloat_32からFloat_16にして早めの桁で切り上げるようにすること。

**実際のモデルを量子化して、どれくらいサイズが小さくなるのか、精度はどう変わるのか、をやってみた。**
![スクリーンショット 2020-11-25 23.04.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/e8dd8d36-17b6-cb55-b97d-f093a4f3c5e9.png)

deeplabv3のxeptionバックボーンバージョンでセマンティックセグメンテーションを比較(背景ぼかし)。

xeptionバックボーンのdeeplabv3のmlmodelのサイズは165.1MB。
MobileNetバックボーンだとModelが8.6MBなので、xeptionの方が精度はずっといいとはいえ、さすがにもうちょっと小さくしたいところ。

#CoreMLModelの量子化の方法

“`shell

元記事を表示

2020-11-25時点でMongoDB RealmをiOSで使う場合の注意点

## 経緯
いま、iOS/Android(おそらくWebも)対応予定のアプリをprivateで書いています。
クロスプラットフォームでデータを同期するようなアプリとなる予定なので、記事タイトルにある[MongoDB Realm](https://www.mongodb.com/realm)を利用することにしました。

というような経緯で、MongoDB RealmをiOSアプリで導入しようとしたら、2020-11-25時点でいくつか注意する点があったので、メモがてら残しておきます。

## Be sure to select MongoDB version 4.4
見出しの通りなのですが、MongoDB Realmでは、MongoDB version 4.4(2020-11-25時点)である必要があります。

MongoDBが2019年にRealmを買収したため、2020年頃にRealmとMongoDBを統合したサービスに刷新され、以下の構成でworkするようになっています。
![スクリーンショット 2020-11-25 20.39.07.png](https://qiita-ima

元記事を表示

ProvisioningProfileの有効期限をチェックする

InHouse配布のiOSアプリは、ProvisioningProfileの有効期限が切れるとアプリが起動しなくなる。
アプリが起動しない状況を未然に防ぐため、
ProvisioningProfileの有効期限をチェックする機構を検討した。

# 前提条件
– ProvisioningProfileはFastlane Matchで管理されていること

# 仕組み
主にFastlaneを利用する。
1. Fastlane MatchにてProvisioningProfileを取得する
2. OpenSSLにてProvisioningProfileをデコードし、Plistファイルを得る
3. Plistファイルから有効期限を取得する

# サンプル
Fastlaneにて有効期限をチェックするサンプル

“`Ruby
lane :check_provisioningprofile do
# Fastlane MatchにてProvisioningProfileを取得する
match(
readonly: true,
git_url: #{matc

元記事を表示

[Swift5]containsを使って特定の文字列を検索する方法

## containsメソッドとは
文字列の中にある特定の文字列を検索するメソッドです。

“`
contains(“検索したい文字列”)
“`

## 実用例

“`.swift
var firstText = “2020年日本一はソフトバンク”
var secondText = “2021年は阪神タイガースが優勝”
var thirdText = “baseball”

if firstText.contains(“ソフトバンク”) { //true
print(“含まれているので呼ばれる”)
}

if secondText.contains(“巨人”) { //false
print(“含まれていないので呼ばれない”)
}

//以下、lowercased()で大文字小文字を無視して検索

if thirdText.contains(“BaseBall”.lowercased()) { //true
print(“含まれているので呼ばれる”)
}

if thirdText.contains(“Soccer”.lowercased()) { //false

元記事を表示

iOSアプリのサイズを軽量化したときの話

先週、iOSアプリのプロジェクトを見直し、`35.8 MB` から `17.3 MB` まで 軽量化しました。
その方法とは「参照しなくなったファイルは、すぐプロジェクトから消しましょう」というだけのお話です。

# iOSアプリのサイズを最適化する

Appleは、iOS11の公開にあわせて、モバイルデータ通信時にApp Storeから
アプリをダウンロードするときの容量制限を 100 MB から 150 MB に拡大しました。

[https://developer.apple.com/news/?id=09192017b](https://developer.apple.com/news/?id=09192017b)

さらに、iPhone端末自体の大容量化や、LTEや5G回線により
高速通信が可能になったことで、大きなサイズのアプリも不自由なく利用できるようになりました。
とは言え、アプリのサイズはもちろん今でも小さいほうがいいです!

私自身も、当初からアプリのサイズは小さくするように開発していました。
写真はその都度ダウンロードするため、アプリの中には5枚くらいしか入ってな

元記事を表示

FlutterのImagePickerでapp storeにリジェクトされた件。

#ストアから以下のリジェクトをくらいました。
Guideline 5.1.1 – Legal – Privacy – Data Collection and Storage

We noticed that your app requests the user’s consent to access the camera and photos, but doesn’t sufficiently explain the use of the camera and photos in the purpose string.

To help users make informed decisions about how their data is used, all permission request alerts need to specify how your app will use the requested information.

Next Steps

Please revise the relevant purpose string in your app’s Inf

元記事を表示

公式ドキュメントのAuto Layout記事にあるStackViewの例を作成してみた!

#はじめに
https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/LayoutUsingStackViews.html#//apple_ref/doc/uid/TP40010853-CH11-SW12
この公式ドキュメントの例を元に、画像のようなレイアウト作成しました。
`Stack View`、`Content Hugging Priority`、`Content Compression Resistance Priority`の使い方や機能についてまとめてみようと思います。
![スクリーンショット 2020-11-24 20.47.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/0a61fcdd-1863-fd29-7ae9-1abb0736ee11.png)
# Stack Viewの使い方
いくつかやり方があるが、公式ドキュメントに載ってい

元記事を表示

Swift Classのまとめ

## class
swiftのクラスに関してまとめたのこちらに記事にいたします。

### Class 参照型のデータ構造
– 参照型、継承できる
– 構造体と列挙体と違うは プロパティやメソッドの文法、初期化のフローなどが違う
– 上記は継承を考慮するため
– CocoaフレームワークのほとんどはClassで定義されている

“`swift
class SomeClass {
let id: Int
let name: String

init(id: Int, name: String) {
self.id = id
self.name = name
}

func printName() {
print(name)
}
}

let instane = SomeClass(id: 1, name: “name”)
instane.printName()
“`

### 継承
– 型の構成要素の引き継ぎ
– 継承とは、新たなクラスを定義する時、他のクラスのプロパティ、メソッド、

元記事を表示

Swift 構造体まとめ

## 構造体
Swiftの構造体に関してまとめたので、記事として残しておきます。

### 構造体とは?
– 値型
– ストアドプロパティ の組み合わせによって、一つの値を表す
– 標準ライブラリで提供されている多くは構造体である
– Bool String Int Array Dictionary
– オプショナルは列挙型 タプルは型の組み合わせ Anyはプロトコル

#### 定義
“`swift
struct 構造体名 {
構造体の定義
}

struct Article {
let id: Int
let title: String
let body: String

init(id: Int, title: String, body: String) {
self.id = id
self.title = title
self.body = body
}

func printBody() {
print(body)
}
}

let ar

元記事を表示

【iOS14】CollectionViewのscrollToItemが機能しない場合の対処法

iOS14において、CollectionViewの`scrollToItem`が機能しないバグが報告されています(執筆時、2020年11月25日現在)。AppleのDeveloper Forumsでも話題になっており、iOS14.2でも修正されていないようです。私もOS依存のバグとは気づかず、仕事で10時間くらい時間を溶かしました(ずっとiOS14のシミュレータでなんでスクロールできないんだろうと四苦八苦してた)

https://developer.apple.com/forums/thread/663156

## scrollToItemの説明(読み飛ばし可)

`scrollToItem`は指定した`indexPath`までcellをスクロールさせることができるものです。アプリ初回起動時のウォークスルー、チュートリアル画面などで、スワイプではなくボタンタップでcellをスクロールさせるような場合に使ったりすると思います。

【SwiftUI】Likeボタンタップ時のLike数増減とFirebaseの更新機能の実装

# はじめに
SwiftUIでカード内のLikeボタンを押した場合にLike数を+1し、再度押した場合に-1する機能を実装することと、その場合にFirebaseのデータベースを更新できるようにすることを目的とする。

今回はカード内のLikeボタンの実装を行います。

前回までの記事は以下を参考ください。

**参考記事**
[【SwiftUI】Likeボタンとリスト内セルにボタンを実装する場合の注意点](https://qiita.com/m37335/items/66f59135e98c2b206a36)

# 開発環境
OSX 10.15.7 (Catalina)
Xcode 12.2.0
CocoaPods 1.10.0

## 実装したコード
![ContentRowView_swift.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867981/b0ef64d3-6287-b772-d9c2-3c24be9f755f.png)

**主な変更点**
**・Likeボタン内にif文を設定*

元記事を表示

[iOS]XcodeのInfo.plist

## 概要
iOSアプリの開発したことない状態で、iOSアプリの検証してて、「Info.plistでどうたらすればいいんじゃね?」
みたいなこと言われて、よくわかんなかったので調べて自分の理解を自分の言葉でまとめたもの。

そもそも漠然としていだいていた疑問として以下があった。

– Build Settingsとかとどんな位置づけの違いがあんねん・・・。
– ユーザー自身が定義する定数を記載できるらしい?User-Definedとかいうのも聞いたことあんぞ・・・
– っていうかInfo.plistとかいうファイル、今の案件のプロジェクト内に見当たらないんだが・・・

## Info.plistとは?

ざっくりいうと以下の設定を行うというファイルらしい。

– **実行ファイルを実行するシステムにあらかじめ知らせておくべき情報**
– **ビルド時のユーザー定義定数**(ただし、Configure毎に分けたい場合は、その値はBuild SettingsのUser-Definedに記述)

**Build Settingsとの位置づけの違い**

Build Settingsは、その名

元記事を表示

Swift Decodable(Codable)  色んなJSONデータパターンのまとめ 【備忘録】

自分がAPIから取得したJSONのレスポンスパラメータで、色々な構造パターンがあったので備忘録も兼ねてまとめてみたいと思います。

### そのままプロパティに適用できるパターン

一番手間がない形式でシンプルにデコード用クラスを定義できる

“`Swift
var data = “””
{
“id”: 1,
“name”: “Taro”,
}
“””.data(using: .utf8)!

struct User: Decodable {
let id: Int
let name: String
}

let user: User = try JSONDecoder().decode(User.self, from: data)
print(user)
“`

### キーとプロパティが一致しないパターン

Swiftの変数名の命名規則はローワーキャメルケースなので、CodingKeyを使って揃えることができる

“`Swift
var data = “””
{
“ID”: 1,
“Name”: “Taro”,
}
“””.data(using

元記事を表示

[iOS]XcodeのSchemeとTargetとConfiguration

## Scheme, Target, Configuration

ビルド時の目的に応じて、設定値や処理を分けたいときに使える機能。

– iOSアプリが通信するバックエンドシステムのURLが環境毎に異なる
– アプリのログ出力を開発フェーズ毎に分けたい(開発時、テスト時、本番リリース時)

それぞれの概念がよくわかっていないので調べて、自分がしっくりくる言葉に落とし込んでみる。

## それぞれの関係を表したイメージ図

![IMG_7188.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/220d9549-5f9f-0c02-d4d0-e92aee9b5566.jpeg)

## Schemeとは?
ざっくりいうと、

**ビルドを伴う5つの処理(Run, Test, Profile, Analyze Archive)それぞれにおいて、採用する「Target」とTarget内の「Configuration」を紐付けてまとめてラベル付けしたもの**

Xcode4から登場した機能である。

元記事を表示

【Swift】 TableViewCell に画像を入れる【初心者】

#はじめに
TableViewCellに画像を入れる方法について調べたので、メモとしてまとめる事にしました。

#storyboardにTableViewとTableViewCellを準備
![TableView.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683624/ef4e7c4b-1df6-a1ff-4076-d61f1c7fc39d.png)

#cellにIdentifierを付ける
今回はIdentifierは「cell」にしました。
![cell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683624/ece54239-77d9-f000-395f-2172559836e1.png)

#Assets.xcassetsに画像ファイルを入れる

![animal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6836

元記事を表示

[iOS] [Swift] ローカル通知とアプリのライフサイクルについて

## はじめに

これはiOS アプリでプッシュ通知についての記事です。

## これから学ぶ知識

– 通知
– AppDelegate / SceneDelegate
– UNNotificationContent
– UNNotificationTrigger
– UNNotificationRequest

## 通知

### 概要

スマートフォンを使っていると 1 日に 1 度はみることのある**通知**は、**ユーザーがアプリを開いていなくてもアプリに関する情報を伝えられる**というメリットが強力です。

例えば、アラームアプリはユーザーがアプリを開いていなくてもその時刻が来たことを適切に伝えてくれます。

また、通知にはいくつかの種類がありますが、よく使われるのは以下のものです。

|アラート(リスト)|アラート(バナー)|
|—|—|
|![List](https://github.com/fummicc1-lit/Sample-LocalNotificationApp-iOS/blob/main/%5BiOS%20Swift%5D%20%E3%83%AD%

元記事を表示

[iOS]Xcodeでシミュレーターを使ってアプリを検証する

## 1. シミュレーターの起動とアプリ起動
### 1.1. シミュレーターの起動
1. XCodeウィンドウ上部の「端末設定ボタン」を押下
2. 開かれるリスト内のiOS Simulatorsから、起動したい端末を選択

### 1.2. シミュレーターでアプリを起動
1. XCodeウィンドウ上部の「TARGETボタン」を押下
2. ビルドしたいターゲットを選択

## 2. シミュレーター端末のOSバージョン確認
1. Xcodeの上部メニューにあるWindow > Devices and Simulators を選択
2. Simulatorsタブを選択
3. 端末一覧が表示されるので、OSバージョンを確認したい端末を押下すると確認できる。

## 3. シミュレーター端末のインストール
デフォルトだと、そのXCodeインストール時の最新のiOSでしか各シミュレーター端末が使えない。過去バージョンiOSでシミュレーターを起動したい場合は、自分でダウンロードしてインストールする必要がある。

### 3.1. ダウンロード&インストール
1. XCodeウィンドウ上部の「端末

元記事を表示

[iOS14]ScrollViewReaderを使って簡単なチャットの実装

## 今までのチャットの実装の難しさとiOS14からの手法
UIKitでチャットアプリを実装する際、UITableViewを使うことが多いかと思います。
LINEのようなチャットの場合は特に`高さの計算`、`一番下へスクロール`の実装が難しいですね。
今までの経験により、実装も複雑になりバグも多かったりしました。

`iOS14`になってからは、SwiftUIの`ScrollViewReader`が出てきて、だいぶチャットの実装が楽になりました。

## 環境

– Xcode12.2
– iOS14.2(SwiftUI2)

## ScrollViewReaderとは

プログラム的にスクロールできるようになります。
[ScrollViewReader – Apple公式ドキュメント](https://developer.apple.com/documentation/swiftui/scrollviewreader)

“`swift

ScrollView {
ScrollViewReader { (proxy: ScrollViewProxy) in

元記事を表示

【SwiftUI】Likeボタンとリスト内セルにボタンを実装する場合の注意点

# はじめに
SwiftUIでFirebaseからデータを読み取り、これまで作成したカード内容を更新することを目的とする。

今回はカード内のLikeボタンの実装を行います。

結論を最初に言うと、ListView内でButtonを実装する場合はそれぞれのImageに“`.onTapGesture“`を設定する必要があります。
その点がわかっていなかったため、実装に時間がかかってしまいました。

前回までの記事は以下を参考ください。

**参考記事**
[【SwiftUI】Firebaseからデータを読み取り、ListViewのRowを更新する](https://qiita.com/m37335/items/76673ebe302192711595)

# 開発環境
OSX 10.15.7 (Catalina)
Xcode 12.2.0
CocoaPods 1.10.0

# Like機能の実装
ボタンの設定に時間がかかってしまったため、FirebaseのLike数の更新機能の実装までは至りませんでした。
今回はタップした際にハートの色を変更する機能のみ実装します。
設定のみした

元記事を表示

OTHERカテゴリの最新記事