- 1. #SwiftUIを使って学習がてらタイマーアプリを作ってみよう FIN
- 2. クロージャ(無名関数)について
- 3. UserDefaultsの場所
- 4. UITableViewCellがdeinitされるタイミング
- 5. iOSクラッシュログ(.ipsファイル)のシンボル化チュートリアル
- 6. AdHocアプリのクラッシュログ解析
- 7. クラッシュログ解析
- 8. SwiftUIを使って学習がてらタイマーアプリを作ってみよう8
- 9. 【iOS】Metal Best Practicesの解説(5) バッファバインディング
- 10. 【iOS】Universal Links実装時にハマったこと
- 11. MBProgressHUD使用中にユーザー操作できるようにする
- 12. adbコマンドまとめメモ
- 13. 【Swift】CleanArchitectureの要点をまとめる
- 14. サーバーサイド初心者がiOSアプリ(SwiftUI)×サーバーサイド(PHP)やってみた
- 15. 横スクロールするCollectionViewに縦横比率を維持した画像を表示する
- 16. App Store で iOS アプリ公開に必要な「Certificates Identifiers & Profiles」について情報整理する
- 17. iOS アプリを公開するまでに必要だったこと/忘れがちなこと、まとめ
- 18. Safari 14.1.1(macOS 及び iOS 14.6)で初回 indexedDB.openが正常に動作しない問題
- 19. Expo(ReactNative)でiOSアプリ配信
- 20. 【SwiftUI】この世でいちばんわかりやすいビューのアニメーション
#SwiftUIを使って学習がてらタイマーアプリを作ってみよう FIN
#SwiftUIを使って学習がてらタイマーアプリを作ってみよう Finish
###前置き
前回投稿した[Part8](https://qiita.com/scream_episode/items/fb928f114de7a857b480)の続きです。
今回のゴールとしては
1.前回実装したPageViewContorllerに対応したインジゲータの実装
です。今回の投稿で「SwiftUIを使って学習がてらタイマーアプリを作ってみよう」シリーズはひとまず完結とします。
###開発環境
Mac (OS Big Sur version:11.3.1)
Xcode (version:12.5)
Swift (version: 5.4)
対象IOS(version:14.5以上)## 今回の作業
### UIを決める
普通のページインジゲータ(PageContorl)は[チュートリアル](https://developer.apple.com/tutorials/swiftui/interfacing-with-uikit)で
やっているが、それじゃつまんないので他に探してたら
クロージャ(無名関数)について
#・クロージャ(無名関数)とは
Swift実践入門(p.136)によれば、クロージャとは、再利用可能なひとまとまりの処理を指す。また、関数はクロージャの一種であるため、共通の仕様が数多くある。しかし、クロージャにはクロージャ式という定義方法によって名前が不要であったり、型推論によって型の記述が省略可能であったりと関数よりも手軽に定義することができる。#・主な使用用途
主な使用用途としては、非同期通信がある。APIにリクエストを飛ばし、帰ってきたレスポンスを処理する際に利用することが多い。#・定義方法
“`swift
{ (引数名1: 型, 引数名: 型…) -> 戻り値の型 in
クロージャの実行時に実行される文
必要に応じてreturn文で戻り値を返却する
}
“`#・実行方法
“`swift
let some = { (num : Int) -> Int in
return num * 10
}some(10) // 100
“`#・引数の型としてのクロージャ
クロージャ:名前のない関数を変数や定数に代入する。
関数:変
UserDefaultsの場所
# 概要
以下のように`UserDefaults.standard`に値を設定したとします。この値がちゃんとファイルに保存されているのを確認する方法です。
“`
if UserDefaults.standard.string( forKey: “theString” ) == nil {
UserDefaults.standard.set( “0123456789”, forKey: “theString” )
}
print( UserDefaults.standard.string( forKey: “theString” )! )
“`# 検証環境
* Xcode 12.5.1
# Simulator の場合
以下にあります。
“`
~/Library/Developer/CoreSimulator/Devices//data/Containers/Data/Application/ /Library/Preferences/ .plist
“`
UITableViewCellがdeinitされるタイミング
## 検証
以下のようなコードでUITableViewCellのカスタムセルを作成し、
UITableViewのインスタンスメソッドである
・[register(_:forCellReuseIdentifier:)](https://developer.apple.com/documentation/uikit/uitableview/1614937-register)
・[dequeueReusableCell(withIdentifier:)](https://developer.apple.com/documentation/uikit/uitableview/1614891-dequeuereusablecell/)
の2つを使用してカスタムセルを表示させ、インスタンスが解放されるタイミングを検証してみた。“`SampleTableViewCell.swift
final class SampleTableViewCell: UITableViewCell {@IBOutlet private weak var titleLabel: UILab
iOSクラッシュログ(.ipsファイル)のシンボル化チュートリアル
# 環境
– Xcode 12.5.1
– iOS 14.6
– iPhone 8# 事前準備
– ipsファイルを取得するための実機を用意
– エラー発生用testアプリを作成
– 今回は画面にUIButtonを配置し、押すと`fatalError()`を実行するようにした“`swift:ViewController.swift
import UIKitclass ViewController: UIViewController {
@IBAction func didTapErrorButton(_ sender: UIButton) {
fatalError(“an error occurs”)
}
}
“`– testアプリをアーカイブ、AdHoc配信のipaを作成し、実機にインストール
– 今回は[Apple Configurator 2](https://apps.apple.com/jp/app/apple-configurator-2/id1037126344?mt=12)を使用し、インストールした# 手
AdHocアプリのクラッシュログ解析
# 概要
この記事では、AdHoc配布されたアプリ上で発生したクラッシュログを解析する方法について記載しています。# AdHoc配布
AdHoc環境でのアプリ配布は、以下の様な方法があります。1. [TestFlight](https://help.apple.com/app-store-connect/?lang=ja-jp#/devdc42b26b8)
2. [Firebaseテスト配布](https://firebase.google.com/docs/app-distribution/ios/distribute-console?hl=ja)
3. [DeployGate](https://deploygate.com/)いずれの方法で配布した場合でも、以降で記載するクラッシュログ解析方法は適用可能です。
# クラッシュログを取得
この項目では、AdHoc環境で配布されたアプリのクラッシュファイルを実機端末から取得する方法を解説しています。## ipsファイルの取得
アプリのクラッシュログは、`.ips`という拡張子ファイルに暗号化された情報が記載されているた
クラッシュログ解析
# 概要
この記事では、iPhoneやiPadの実機端末からクラッシュログファイル(`xxx.ips`)を取得し、それをdSYMファイルで復号した中身の見方について記載しています。
なお、実機端末からクラッシュログを取得する方法については[AdHocアプリのクラッシュログ解析](https://qiita.com/yamataku29/items/7d529ee49c28cddbd89e)を確認してください。# クラッシュログの見方
## 基本情報
– `Exception Type`: クラッシュの種別を示す文字列が表示される
– `Exception Codes`: クラッシュの種別に応じたコードが表示される
– `Exception Note`: クラッシュ種別に関する補足説明の文字列が表示される
– `Termination Reason`: クラッシュの原因が表示される
– `Termination Description`: クラッシュ原因の詳細情報が表示される## バックトレース
– クラッシュスレッド: `Thread 0 Crashed:`といった様に`Cra
SwiftUIを使って学習がてらタイマーアプリを作ってみよう8
#SwiftUIを使って学習がてらタイマーアプリを作ってみよう Part8
###前置き
前回投稿した[Part7](https://qiita.com/scream_episode/items/abb2168fe66b90836443)の続きです。
今回のゴールとしては
1.UIKitのPageViewControllerを利用して設定画面を時間設定と音楽設定で分けて
表示する
です。次回は[ページインジゲータをちょっとカスタムして実装です](https://qiita.com/scream_episode/items/7950d45a17f8f53b4094)
###開発環境
Mac (OS Big Sur version:11.3.1)
Xcode (version:12.5)
Swift (version: 5.4)
対象IOS(version:14.5以上)## 今回の作業
### UIPageViewController(UIKit)をSwiftUIでも使えるように実装
基本はAppleが公開している[チュートリアル](https://developer.a
【iOS】Metal Best Practicesの解説(5) バッファバインディング
[Metal Best Practices](https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/MTLBestPracticesGuide/index.html#//apple_ref/doc/uid/TP40016642-CH27-SW1)は、iOS/MacOS/tvOSのAPIであるMetalを用いた設計のベストプラクティスガイドです。
本稿では、何回かに分けてこのガイドを読み解き、コード上での実験を交えて解説していきます。
読んでそのまま理解できそうなところは飛ばしますので、原文を読みながら原文のガイドとしてご利用下さい。
また、iOSの記事なので他のOS(MacOS, tvOS)についての記載は割愛します。他の記事の一覧は、初回記事よりご覧下さい。
https://qiita.com/TokyoYoshida/items/521619d6d8dd8d8ef9e4
### [Buffer Bindings (バッファバインディング)](https://develo
【iOS】Universal Links実装時にハマったこと
Universal Linksを実装した際にいくつかハマったことがあったので、覚書として残しておきます。
# 【おさらい】 Universal Linksとは
* iOS9〜利用可能
* 通常のWeb URL経由でアプリを起動できる
* アプリがインストール済み →アプリが起動する
* アプリが未インストール →Webページが開く
* Custom URL Schemeとは違って、`test-app://`のような起動用URLは不要
* 「アプリを開きますか?」などのポップアップは表示されず、シームレスにアプリに遷移する参考: [URLスキーム・独自ディープリンク実装に代わる、Universal Links(iOS 9で導入)でより良いUXを実現 – Qiita](https://qiita.com/mono0926/items/2bf651246714f20df626)
参考: [iOS ディープリンク(Custom URL Scheme)でアプリを起動する | DevelopersIO](https://dev.classmethod.jp/articles/
MBProgressHUD使用中にユーザー操作できるようにする
`isUserInteractionEnabled = false`にすることで、インジケーターやトーストを表示中にボタンタップなどの操作ができるようになる。
“` Swift
let toast = MBProgressHUD.showAdded(to: view, animated: true)
toast.isUserInteractionEnabled = false
“`
adbコマンドまとめメモ
## adbとは
Googleの[Android開発者ページ](https://developer.android.com/studio/command-line/adb?hl=ja)によると、以下のように説明されています。> Android Debug Bridge(adb)は、デバイスと通信するための多用途のコマンドライン ツールです。
Android開発者はもちろん、テスターやFlutter開発者にも使えるテクニックです。「こういったツールが用意されているから、iOSも好きだけどAndroidも良いよね」と感じます。
## 環境設定(adb: command not foundとなる場合)
adbコマンドが使えない場合は、以下の記事を参考にパスを通すこと
## 目的
最近adbコマンドを使う機会が増えてきたので個人的なまとめをQiita上に置いて置きたい。自分が使うものだけまとめたい。
最近、Qiitaがどこからでも参照出来て便利なことに気
【Swift】CleanArchitectureの要点をまとめる
#はじめに
今回は、CleanArchitectureのそれぞれの要点をまとめていきたいと思います。#概要
クリーンアーキテクチャでは以下の画像がすごく有名ですね。
この画像からわかるように、クリーンアーキテクチャの本質は中心に向かう矢印の方向(依存方向)です。
![ScreenShot 2021-07-09 23.14.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/7a918ba1-03bd-9856-9c71-1632e7ec7a17.png)例えば、赤色のUseCasesは緑色のGateways(Repository)を具体として知っていてはいけません。
また、この画像の右下の図も重要です。必ずUseCasesを経由して全ての制御を行うべきなので、どうしてもUseCasesから緑の領域に向かいたい場合もあります。そういった時にはインターフェース(iOSでのprotocol)と依存関係逆転の原則を使い回避します。
#全体図
以下の例ではMVVMのModelをクリーンア
サーバーサイド初心者がiOSアプリ(SwiftUI)×サーバーサイド(PHP)やってみた
#1.はじめに
####きっかけ
Swift/SwiftUIでiOSアプリをリリースし始めて半年以上。
ゲーム系、ツール系と複数作ってきて、そろそろサーバーと通信できるようにしないとなと思い、試してみることにしました。####なぜPHP
とりあえず、”サーバーサイド フレームワーク”とか”サーバーサイド 言語”とかでググってみたところ、Pythonに色々とフレームワークがあることがわかり、最近流行だし機械学習とは関係ないけどPythonやったことあるって言ったら有利かなーとか思って、まずPythonで調べ始めました… が、 わ か ら な い…
諦めて、今度はPHPでも出来ることがわかったのでPHPに決めました。
(HTML, CSS, JavaScriptは触ったことがあり、馴染みがありそうだったので)####事前知識
そもそもサーバーサイド ド素人の私が事前知識として持っていたのは下記くらい。
・クライアント⇄AP(API)サーバー⇄DBサーバー
・ブラウザはHTTPリクエストをサーバーに送って、返ってきたレスポンスをもとに表示している
・アプリも同じように、HT
横スクロールするCollectionViewに縦横比率を維持した画像を表示する
# 環境
– Xcode 12.5
– Swift 5.4# 動作イメージ
表題通り、縦横比の異なる画像を横スクロールするCollectionViewで均等な間隔で表示します。||
|:—:|
||※表示している画像は [PLACEHOLDER.COM](https://placeholder.com) から取得しています
# 大まかなView階層
> `UITableView`
>> `UITableViewCell`
>>> `UICollectionView`
>>>> `UICollectionViewCell`
>>>>> `UIImageView`# 前提
– `UITableViewCell` の高さは任意の値で固定
– `UICollectionViewCell` の横幅は可変(se
App Store で iOS アプリ公開に必要な「Certificates Identifiers & Profiles」について情報整理する
## 概要
開発した iOS のアプリを App Store に公開する際、
Apple Developer のアカウントサイトで、「Certificates Identifiers & Profiles」 というページで色んなファイルを生成してアップしたり開発PCを紐付けたりと、ゴニョゴニョ作業が必ず発生します。その際、それぞれが何のために必要で、実施何をしてるのかイマイチわからなかったので、情報整理するための備忘録です。(より詳細な公式説明は全て英語だったので、日本語で残しておく)
## 前提
– アプリのリリースには、そもそも Mac (厳密には、「Xcode」というソフト)が必要です。
– 以下の全ての作業は、「Apple Developer Program」(有料)に登録が完了し、開発者アカウントが有効になっている必要があります。
– 作業をする際には、使用するPCをAppleのWebサービスが関連づけ処理をおこなうたまインターネットに常時接続されている必要があります。
– 文書量が多くなるため、できるだけ具体的な手順については割愛します。## 作業の流れ(個人
iOS アプリを公開するまでに必要だったこと/忘れがちなこと、まとめ
## 概要
iOS アプリを開発して、いざリリースする時に、「実はコレも必要でした」ってことがあったので、その情報を事前に知っておくための備忘録。アプリ開発戦略の参考情報にでもなれば幸いです。
## iOS 開発〜リリースまでの流れ
そもそも、環境ゼロの状態から、開発〜アプリリリースまでの全行程をざっくりとまとめてみた。– Apple IDを用意
– Apple Developer Program へ登録
– App Store Connect へのログインできるようになる
– Certificate(証明書)や Profile(プロファイル)の設定
– 開発環境の用意
– Xcode 導入、Xcode 以外のコードエディタなどを使う場合は、それも導入
– サーバ(Web/Ap等)、や DB を使用する場合は、その環境も用意
– クラウドサービスを使用する場合、それも用意(例: Google アカウントを作成し、Firebase プロジェクト作成等)
– 開発。コーディング・テストしてアプリ完成させる
– Xcode でビルド&アーカイブして、Xcode
Safari 14.1.1(macOS 及び iOS 14.6)で初回 indexedDB.openが正常に動作しない問題
## 問題
WKWebView上にWebアプリケーションの一部画面を表示する機能を作成しており、indexedDB上のデータ取得が、特定条件で正常に動作しないことに気が付きました。
## 原因
最新のSafari(MacOSおよびiOS 14.6の14.1.1)で初めてロードしたときに indexedDBのopen(データベースを開くリクエスト)が永遠にpanding状態でリクエストが消失する不具合が、WebKitにあるようです。
[indexedDB.open() sometimes hangs forever in pending state on first page load in iOS 14.6 / WebKit Bugzilla](https://bugs.webkit.org/show_bug.cgi?id=226547)## 対策
有志によって[npm/safari-14-idb-fix](https://www.npmjs.com/package/safari-14-idb-fix)が用意されているようですが、自環境では解消出来ず、`WKUserScript`
Expo(ReactNative)でiOSアプリ配信
何度リリースしても忘れてしまうのでざっくりと個人用メモを残しておく
【概要】
A. develop周り
B. connect
C. expo—
https://developer.apple.com/account
A-1. Certificatesの作成(証明書)
A-2. Identifiersの作成(識別子)
A-3. Profilesの作成(プロファイル)—
https://appstoreconnect.apple.com/
B-1. 新規App作成
B-2. App Store > 一般(プロモーション用テキスト、概要、キーワード、サポートURLの作成、Appプレビュー、、、その他入力)
B-3. App Store > App情報(名前、サブタイトル、カテゴリ選択、コンテンツ配信権、年齢制限指定、使用許諾契約)
B-4. App Store > 価格および配信状況(価格表、予約注文、配信可否、Appleシリコン向け配信、Appの配信方法)
B-5. App Store > Appのプライバシー(プライバシーポリシー、、、データタイプ以降を入力)
B-6
【SwiftUI】この世でいちばんわかりやすいビューのアニメーション
#この投稿は何?
SwiftUIフレームワークでiOSアプリを開発する際に、ビューをアニメーションさせる方法について基本を解説します。![スクリーンショット 2021-07-08 21.43.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70476/dda6f68e-0720-a9b9-d030-52cb896cbff6.png)
###実行環境
macOS 11.4
Xcode 12.5.1
Swift 5.4#ハンズオン
以下は、アプリのメイン画面のコードです。““Swift:メインの画面
struct ContentView: View {
var body: some View {
VStack {
Smiley() // ニコちゃんマーク
Button {
// ボタンタップ時の処理
} label: {