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

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

【2020年版】AppStoreへの公開手順(ArchiveからAppStoreCponnectで公開)

## はじめに
iOSって証明書や設定しなければならない部分が結構あって
慣れてしまえばただの作業なんですが、年々UI変わったりツールも変わったりするので

現在のipaファイル作成〜AppStoreConnectでの公開までをまとめました。(2020年3月時点)

参考サイトも載せますが、現在と若干違う部分があるので、
2020年で自分の場合こんな感じっていう例でスクショ入れつつ面倒かった部分を載せていきます。

自分なりに調べてやりましたが、分かりにくいところがあるかもしれません。

いろいろコメントなどで教えていただければ幸いです。

## 手順

### 1. Appleアカウント作成、Apple Developer Programに登録
 iOSアプリ公開やPush通知するためには、有料アカウントにする必要があります。

 税込み1万3000円くらい。

 企業用アカウントでは申請できないので個人アカウント作成で。
 登録して承認されるまで2日くらいかかるらしいんですが、自分は電話したら速攻承認してくれました。

 すぐやりたい方は電話とか問い合わせしてみては。

元記事を表示

[iOS/Swift] カスタムデザインのローカル通知の実装方法

# こんなやつ

**通常のローカル通知ではなく、オリジナルなデザインのローカル通知を出したい!!**

## ステップ
1. バナーを表示する
2. バナーを隠す
3. ジェスチャーを追加する
4. タイマーをセットする
5. 使いやすいように修正

ソースだけ見たい人は[こちら](https://github.com/HiromiSakurai/InAppNotification)

## 1. バナーを表示する

### **下準備**

今回の主役`InAppNotificationView`を用意する

“`swift
class InAppNotificationView: UIView {
// 1
lazy var containerView: UIView = {
let v

元記事を表示

Swift で map, compactMap, flatMap を使いこなそう

今回は初学者向けに、Swift からプログラミング言語を学び始めた人が必ずいだく `map`・`compactMap`・`flatMap` の違いについて簡単に解説をしていきたいと思います。また、これらの関数は積極的に使っていくことで状況に応じた使い分けなどがうまくできるようになっていくので積極的に使っていきましょう!

### map

`map` は主に配列のデータを別の配列データに変換したい時などに使用する関数です。たとえば、整数の配列を文字列の配列として変換する時のサンプルコードは下記のようになります。`$0` でクロージャでの引数を参照することができます。クロージャーが分からない方は[こちら](https://techacademy.jp/magazine/14499)の記事を見ていただければ把握できるかと思います。

“`swift
let numberList: [Int] = [1, 2, 3, 4, 5, 6]

let numberStringList: [String] = numberList.map { “\($0)” }

print(numberStri

元記事を表示

ファイルを保存するだけで動的にプログラムを更新できるInjectionIIIについて、macOSでもできるようにしてみた

以前、ファイルを保存するだけで動的にプログラムを更新できるInjectionIIIについての解説記事を投稿した。
その際は、対象がiOSだけだった。macOSでもできると書いてあったが、方法がわからず、ようやく少し進展した(まだ道半ば)。
https://qiita.com/KoichiroEto/items/5cb149a6e5d74bbdd66c

# 3. macOSのプログラムからインジェクションしてみる
これまでは、iOS用アプリをインジェクションしていた。iOSアプリはシミュレーター上で動作しており、macOSアプリはそうではないという違いがある。そのため、いくつか追加の手順が必要となる。

## 3.1. なにかアプリを作る
まず、さきほどと同様に、なにかシンプルなアプリを開発する。
Xcodeを起動→Create a new Xcode Project→macOS→「App」→Next→Product Name:「MacTest」、User Interface: Storyboard→Next→「~/dev」を指定→Create
ViewController.swift

元記事を表示

Flutterアプリのスクショを極力自動で撮る(Riverpod使用・メソッドの濫用あり)

以前こんな記事を書きました。

[Flutterアプリのスクショを(極力)自動で撮る on AndroidStudio](https://qiita.com/agajo/items/2d2d57561b5880618966)

これでスクショ撮影はだいぶ簡単になった!!と思っていたのですが、

今回新たにゲーム要素のあるアプリを作成しまして、スクショ用の画面を作るためにその**ゲームを攻略する**必要が生じてしまいました。

ストア申請のために言語や端末を切り替えながら毎回ゲームを攻略するなんてとてもやってられません。

アプリコードに手を入れて数値を指定すればどうとでもなりますが、スクショを撮るためだけにあまりアプリを改造したくありません。

ということで、アプリコードを極力改造せず、必要な画面を自動的に生成しながら次々にスクショを撮る方法を確立しました。

アプリコード・スクショ撮るコードどちらも、break pointを打ってデバッグすることができます。

# 基本的な考え方

アプリの画面はアプリの状態の関数です。状態が決まれば画面が決まる。

![ui-equals-f

元記事を表示

Python(Kivy)で作るオセロアプリ(iOSアプリ)

# はじめに
Pythonでマルチタップアプリを開発するためのオープンソースライブラリkivyを使ってオセロアプリを作成してみました。
また、最終的にiOSのSimulatorで(xcode)でビルドしました。
# 環境
python: 3.7.7
kivy: 1.11.1
xcode: 11.7
# 作成物
完成形
![Sep-06-2020 20-30-30.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680074/a5c14098-6adb-4f49-a261-4ca9ecd6843f.gif)

# ソースコード解説
今回作成したオセロアプリを開発した順番を追いながら説明します。

## 1. オセロ盤面と初期石を配置
下記の状態まで作成
スクリーンショット 2020-09-06 20.44.30.pngApp Store Connect でアプロードした時 Too many symbol files のかべにぶち当たったときの対処方法

– dSYM ファイルがいっぱいあることが原因っぽい (この辺は曖昧)
– 調べると dSYM ファイルをどうにかするっていう対処法ばっかりだったからそう思ってる

調べた感じ2つ

### 1つ目

プロジェクトファイルの debug information format を `DWARF` にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522374/08b4a579-666c-c237-3a97-f9148d7a0d43.png)

dSYMファイルを生成しないという設定らしい (多分)
でも Firebase Crashlytics で dSYM ファイルを使用してどうのこうのするっぽいから生成しないのはちょっとなと思う

### 2つ目

Podfile に `config.build_settings[‘VALID_ARCHS’] = ‘arm64’` を追加する

これで余分な architecture のdSYMファイルを生成しないでよいっぽい

アーカイブ

元記事を表示

[SwiftUI]NavigationViewのnavigationBarTitle位置に画像とテキストを両方入れる方法

#実装するもの
SwiftUIにおける[SwiftUI NavigationViewでListからNavigationLinkで遷移する方法](navigationBarTitleについてはhttps://qiita.com/yuujioka/items/54e0c83e533447a1137e)ではnavigationBarTitleの使い方についても触れましたが、ここでは以下の実装をする為に必要な方法をご紹介したいと思います。

![スクリーンショット 2020-09-06 22.08.11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517666/6bdc4c61-b29d-6910-27dd-1145051e902c.jpeg)

#Code
“`swift:ContentView
struct ContentView: View {

var body: some View {

VStack {
Titl

元記事を表示

[Swift]Eurekaライブラリの応用カスタマイズ集

#はじめに
###Eurekaライブラリとは
Eurekaライブラリとは、iOSの入力フォームなどを、高速かつ簡単に作成するためのライブラリである。
https://github.com/xmartlabs/Eureka

###背景
このライブラリの基本的な使い方は様々な記事で紹介されている。しかし、応用的な使い方や、マイナーなカスタマイズは中々載っていなかったため、私自身カスタマイズに苦労した。
私この経験を記事にすることで、皆様のお役に立てるのではないかと思い投稿させて頂いた。

###この記事の主なターゲット

– Eurekaライブラリの基本的な使用方法を知っている方
– Swift初心者の方
– Eurekaを使用して間も無く、もっと活用できるようになりたいと感じている方

##編集履歴
– 2020年9月6日(日):本記事を投稿

#カスタマイズ集
###LabelRowにDisclosure Indicatorを表示

“`swift:EurekaSample.swift
class EurekaSample: FormViewController {

元記事を表示

[SwiftUI]NavigationViewでListからNavigationLinkで遷移する方法

#今回の記事で実装できるもの
SwiftUIでNavigationViewを使えば本当に簡単に以下の様なものが作れます。

![スクリーンショット 2020-09-05 22.03.56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517666/1e71599f-2e49-370e-7eda-77c52514f231.jpeg)

以下ではこの実装の解説をしていきます。

#Code

“`swift
struct ContentView: View {
var body: some View {
NavigationView {
List(1..<100) { num in NavigationLink(destination: Text("Lesson\(num)")) { Text("Lesson\(num)") } }.n

元記事を表示

[Swift] 実務的Tips: Tupleのswitchで条件マトリックスをもれなく分岐させる

今日からでもすぐに取り入れられて、

– コードをよりクリーンにできる、とか
– 工数を削減できる、とか

そんなTipsを紹介していく記事シリーズです。
「知らなかった」「気づかなかった」「忘れていた」そんな誰かの役に立てば幸いです。

# 前提環境

– Xcode 11.3.1
– Swift 5.1.3

# Tupleのswitch

“`swift
var isWeekday = false
var isChildlen = false
var isSenior = false

switch (isWeekday, isChildlen, isSenior) {
case (true, true, _):
print(“平日・子ども料金”)
case (true, _, true):
print(“平日・シルバー料金”)
case (true, _, _):
print(“平日・大人料金”)
case (false, true, _):
print(“休日・子ども料金”)
case (false, _, true):
print(

元記事を表示

[SwiftUI]EnvironmentObjectをあるViewに入れるとPreviewができない

SwiftUIでPreviewを使っていたところ、
このようなエラーに遭遇しました。

“`
Thread 1: Fatal error: No observable object of type DataManager found.
A View.environmentObject(_:)
“`

現時点の最新のXcode11.6では、ビルドできるのにプレビューに失敗している時、以下の画像のように表示されます。Diagnosticsを押しても、よくわからないエラーが書かれています。

![スクリーンショット 2020-09-06 18.40.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297014/518beb24-11ee-a321-ac52-7705fc71e64d.png)

## クラッシュログの場所を探す

正確なクラッシュログは

“`
~/Library/Logs/DiagnosticReports
“`

にあります。このディレクトリの中から該当するアプリのクラッシュロ

元記事を表示

Firebase Cloud Messagingを使ってアプリに通知機能を実装する

# はじめに
本記事はFirebaseのプロジェクトが作成済みでアプリにすでにFirebaseを導入していることを前提とした内容となっています。また、iOSアプリを対象にしています。
Firebase Cloud Messaging(以降FCM)とは[公式ドキュメント](https://firebase.google.com/docs/cloud-messaging)によると

> Firebase Cloud Messaging(FCM)は、メッセージを無料で確実に送信するためのクロスプラットフォーム メッセージング ソリューションです。

ということです。通常アプリにプッシュ通知を送るにはアプリの設定以外にもAPNs(GCM)に通知送信をするためのアプリケーションサーバーを用意しないといけません。(Pusherなどのアプリで代用も可能)FCMであればAPNsに通知を送るための設定をFirebaseのコンソールから簡単に行うことができます。

# プロジェクトの設定
## Cloud Messagingに必要なライブラリのインストール

“`
// Podfile
pod ‘Fi

元記事を表示

XCTContextを使ったお手軽Parameterized Test

# はじめに

iOSのテストフレームワークはParameterized Testをサポートしていません。その制約を回避するために世の中にはいろいろな手法が提示されていますが、そのほとんどは設定や実装が面倒です。
そこで、私が実務を実践している、XCTContextを使ってお手軽に行う方法を披露したいと思います。

# 実現方法。

たったこんだけ。テスト結果にはちゃんとパラメータ毎のテスト結果がレポートされます。

“`swift
func test_hogehoge() {
for (name, expectedResult) in [“テスト1”: 1, “テスト2”: 2, “テスト3”: 3] {
XCTContext.runActivity(named: name) { activity in

XCTAssertEqual(result, expectedResult)
}
}
}
“`

# さらに

パラメー

元記事を表示

背景に動画を流す方法

#背景に動画を置く方法

画面の背景に動画をリピートで再生させ続けたい場合

“`ruby:viewController.swift

import UIKit
import AVFoundation

class PopupDetailViewController: UIViewController {

var player = AVPlayer()
let path = Bundle.main.path(forResource: “Sample”, ofType: “mov”)

override func viewDidLoad() {
super.viewDidLoad()
player = AVPlayer(url: URL(fileURLWithPath: path!))
player.play()

let playerLayer = AVPlayerLayer(player: player)
// フレームの大きさを決める
playe

元記事を表示

SwiftUIをジェネリクスでプレビューしやすくする

SwiftUIでアプリを構築していてプレビュー機能をフル活用しないことにはSwiftUI使ってる旨味を最大限に引き出せませんよね。

この[WWDC動画](https://developer.apple.com/videos/play/wwdc2020/10149/)でのプレビュー機能の活用方法がとってもわかりやすく実用的だったので、要点だけまとめて記事にします。

## シンプルデータとリッチデータ
動画で語られているのが、アプリで取り扱うデータは主に2つに分類できると言及されています。

– リッチデータ … CoreData, RealmやCloudKitなどの情報やサーバ側にしか無いデータなど
– シンプルデータ … Stringなどのプリミティブなデータ型、構造体など

シンプルデータは生成や取得が容易でリッチデータは生成や取得へのレイヤーが深かったり手続きが面倒なものといったところでしょうか。

動画ではSwiftUIのView層は極力シンプルデータで構築しましょうと言っています。

仮にRealmやCloudKitのデータをViewで表示する場合であったとして

元記事を表示

オプショナルへの予想を上回る気遣い

#オプショナルの学習メモ
iOSアプリ開発において、オプショナルについて予想を上回る気遣いをしなければならないので、学習したことをメモしていきます。**オプショナルについての内容を網羅している記事ではないのでご注意ください。**

##オプショナルとは?
マイページ設定の画面などには、入力すべき「必須項目」とそうでない「オプション項目」がある。学習している「オプショナル」とはここで言う「オプション項目」のことを指す。
何も値が入らない項目なので、値として「何もない = **nil**」をもてる変数に設定する。
※nilは空文字ではない。空文字は**” “**このスペース半角のように値が入っていることを表す。空文字はメモリに値を格納している。

**注意すべきは、何もない(= nil)をもてることが*許される*ということ**
言い換えれば、普通は許されない。Swiftならではの設計。

##オプショナル変数の宣言方法

ポイントは型の後の**?**マーク!

“`swift:変数にnilを代入
var hoge: String? // = nilが代入できる
“`

※**?**だけ

元記事を表示

Xcode 12 でのアプリ内購入のテスト

この記事では、Xcode 12 (beta) で提供されているツールを使用してアプリ内購入のテストを行うことについて説明します。

## ヘルパークラスとスタートプロジェクト

私は、あなたがアプリ内購入を処理するのに役立つヘルパークラスを作成しました。[そのファイルはここにあります。](https://github.com/mszmagic/StoreKitTesting/blob/master/StoreKitTesting/StorePurchaseHelper.swift)

[こちら Github で完了したプロジェクトを見ることができます。](https://github.com/mszmagic/StoreKitTesting)このプロジェクトを実行するには、Xcode 12(iOS 14用です)を入手する必要があります。

このスタータープロジェクトでは、ユーザーが購入できる以下のアイテムを用意致します:

| 商品ID | 商品名 | 商品タイプ |
—-|—-|—-
| virtualCatFood | バーチャルキャットフード | 消耗品 (Cons

元記事を表示

スマホアプリにおける署名について

# Code Signing
iOS/Androidいずれの場合もアプリが改ざんされることを確認できる安全性を確保するために、ビルドしたアプリケーションに電子署名します。これがCode Signingとよばれます。
概念的には同じですが、ストアとの関係やツールの操作方法などがそれぞれ異なるため、混乱しそうです。
(これにビルドサイト(CircleCI/Bitrise等)を利用するとさらにサインするための情報を設定する必要があり、さらに複雑になります)

## 電子署名のざっくりした説明

### 電子署名する
電子署名は改ざんを防止や否認防止などで利用され、PKI(公開鍵インフラストラクチャ)の技術です。あるバイナリ(テキストデータもバイナリ化したうえで)を符号化した情報に対して秘密鍵で暗号化します。その値(A)と符号化、暗号化アルゴリズムを署名のメタデータとして含めます。

### 署名の検証
検証する場合は同様にバイナリを署名のメタデータである符号化アルゴリズムで符号化します。また含まれている暗号化された値(A)を公開鍵で複号化して一致しているかを確認します。
ここで元のバイナリが

元記事を表示

はじめての ReactorKit【実践編】

前回の概要編に続き、今回は実際に ReactorKit を使ったサンプル実装をしていきたいと思います。

### 作るアプリ

今回は [Google Books API](https://developers.google.com/books) を使用したアプリを想定して実装していきたいと思います。仕様は下記の通りです。
※ 基本的には、ReactorKit 周りの実装が中心なので細かい API 処理などの実装部分などは省いていきます。

– 画面が開いたら、API からデータを取得して TableView に反映する
– `refreshButton` がタップされたら、データを更新する
– API からデータを取得している最中は `activityIndicator` を表示し、取得が完了したら非表示にする

### 作業開始?‍?

まずは View のロジックを担う Reactor にそれぞれのイベントとデータを定義していきます。

“`swift
import ReactorKit
import RxSwift
import RxCocoa // 後々 concat

元記事を表示

OTHERカテゴリの最新記事