- 1. ファクトリー・アブストラクトファクトリーをSwift5で実装する
- 2. SwiftUI Pickerの値をenumと連動
- 3. SwiftUIとFirebaseを使って簡単なチャットアプリを作る
- 4. gRPCでサーバー・クライアントを繋げてみる(iOS編)
- 5. flutter iOSでビルドできない時の対処法
- 6. 簡単なiOSアプリの開発費相場の意識調査結果
- 7. [iOS]CocoapodsでもCarthageでもない、Firebaseライブラリの導入方法
- 8. [iOS]プロトコルで疎結合に組む方法
- 9. Siriショートカットで出来ること出来ないこと
- 10. [Flutter] Dribbbleデザイン、そのまま作ろう その13
- 11. 【iOS】?コンテナViewの採用基準?
- 12. XCodeでビルドしたら「The application’s Info.plist does not contain CFBundleShortVersionString.」と出た時の対処
- 13. 全デザインパターンをSwift5で実装する(目次)
- 14. ビルダーをSwift5で実装する
- 15. UISliderをタップで選択可能にする (iOS12以上の場合)
- 16. プロトタイプをSiwft5で実装する
- 17. シングルトンをSwift5で実装する
- 18. 【iOS Firebase Dynamic Links】アプリインストールを経由するときに注意すること
- 19. Flutter iOS dark modeが設定された環境では起動画面を黒くする
- 20. Flutter iOS 幅320px端末で status barを隠す
ファクトリー・アブストラクトファクトリーをSwift5で実装する
※この記事は「全デザインパターンをSwift5で実装する」https://qiita.com/satoru_pripara/items/3aa80dab8e80052796c6 の一部です。
###The Factory(ファクトリー)
####0. ファクトリーの意義
複数のオブジェクト間で共通するプロトコルやスーパークラスがある場合に、それを利用してオブジェクトを生成する事をファクトリーという。
利用する側は、プロトコル・スーパークラスのみ知っていればよく、個々のクラスの実装について知る必要がないため実装が容易になる。また個々のクラスに変更が加わっても利用する側には影響しなくなる。
####1. ファクトリーを利用しない場合
– 生成される側
“`swift:Theme.swift
import UIKitpublic protocol Theme {
var backgroundColor: UIColor { get }
var textColor: UIColor { get }}
public struct LightTheme:
SwiftUI Pickerの値をenumと連動
#やりたいこと
Pickerの表示項目と選択を、モデル内のenumで管理したい|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59249/f2d630ce-3784-536e-0784-5729c5bf2154.png)|![image.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59249/159e1305-5bf0-2788-0f42-0ca004ac6de4.gif)|
|:-:|:-:|##enumの値をモデル内に設定
ポイントは、enumをCaseIterableに指定すること
“`swift:Model
class Model:ObservableObject{
//enumはrawValueとしてString
//PickerのForeachで使えるようにCaseIterableに指定
enum Mode:String,CaseIterable{
SwiftUIとFirebaseを使って簡単なチャットアプリを作る
# はじめに
FirebaseとSwiftUIを使ってチャットアプリを作ります。# 仕様
チャットアプリは最初にユーザー名を入力しチャット画面に入ると自分とそれ以外のユーザーで区別されたメッセージ一覧が表示されます。
今回は、ユーザー認証などありません。単純にリアルタイムデータベースを読み書きしてチャットします。→→gRPCでサーバー・クライアントを繋げてみる(iOS編)
[Aizu Advent Calendar](https://adventar.org/calendars/3938) の22日目の記事です。
大遅刻しました。申し訳ないです。。gRPCでサーバー・クライアントを繋げてみたもののiOS編です。
## gRPCとは
[こちらの記事](https://qiita.com/oohira/items/63b5ccb2bf1a913659d6)でわかりやすく簡単に紹介されています。gRPC自体は `.proto` ファイルを使用し、それを元に生成したコードを使用してクライアントから簡単にサーバー側のデータを取得することができるものです。
上記の点から、特定のエンドポイントに対して必要な値を載せてリクエストを飛ばして○○というデータが返ってくるというAPI定義書を作成することなく使用する側はサーバーからデータを取得することができます。また、HTTP/2を使用、データ取得関数使用時にシリアライズを行うため、高速に通信することができます。
## 実装編
### `proto` ファイルを定義する
クライアントとサーバーにとっての共通のイ
flutter iOSでビルドできない時の対処法
初めてQiitaに投稿してみます、、、
## 現象
* **flutter** と**Android Studio**を使い始めて数週間のペーペーです。
* simulator.appのiOSのシミュレータで、`run`を実行すると、以下のようなビルドの失敗が続くようになりました。“`
Launching lib/main.dart on iPhone Xʀ in debug mode…
Running Xcode build…
Xcode build done. 12.2s
Failed to build iOS app
Error output from Xcode build:
↳
** BUILD FAILED **Xcode’s output:
↳
/build/ios/Debug-iphonesimulator/Runner.app: resource fork, Finder information, or similar detritus not al
簡単なiOSアプリの開発費相場の意識調査結果
最近Twitter経由で個人での簡単なiOSアプリの受託開発の打診を受け、費用を伝えると連絡が途絶えました。具体的な内容は書けないのですが、以下のような案件です。
– 実装期間は2日(かなりシンプルな機能でこれ以上はかかりそうにない)
– 実装可能か要検証な機能有り
– アイコン画像等のリソースは発注元が作成
– App Store申請作業込み(シンプルな為リジェクト対応が必要になる可能性あり)見積もりとしては合計20万円と出しました。
そこで以下のようにツイートでアンケートをとってみました。
Twitter経由でちょっと検証は必要だけど2日程度でできそうなiOSアプリの開発を打診されて、申請関係も込みで20万円って返したんだけど、音沙汰がなくなった。20万って高いかな?
— りず (r.izumita) (@rizumita) [iOS]CocoapodsでもCarthageでもない、Firebaseライブラリの導入方法
## はじめに
iOSアプリにFirebaseを導入する際、選択肢として主に`Cocoapods`と`Carthage`の2通りがありますが、それぞれ一長一短があります。
Firebaseをよく利用する私としては、どちらも使いにくいなと感じました。色々調べていく中で、公式ドキュメントにあるような第3の方法がシンプルで早かったので、その方法をまとめました。### Cocoapods
導入が簡単だが、ビルド時間がかかる(特にFirestore)。Xcodeのビルドキャッシュもあるので、ある程度は全体的なビルド時間の短縮はありますが、それでも長いと感じます。### Carthage
[Firebaseのリポジトリ](https://github.com/firebase/firebase-ios-sdk/blob/master/Carthage.md)をみてみるとCarthageはまだベータ版だそうです。ビルドはバイナリを使っていますが、依存関係が複雑でXcodeに導入するときに注意を払わないとなりません。## 第3の方法
この2つ以外の方法としては、直接githubからバイ[iOS]プロトコルで疎結合に組む方法
今更なんですが、Protocolの話です。
サンプルとして「カスタムViewを疎結合に組む方法の話」をします。
なおSwiftUIは無視します。# 1.カスタムViewの例
## カスタムViewを作る際に困ること
iOSにおいてカスタムViewを作ると言ったらざっくりこうなるでしょう。
![Protocol-Page-1 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20784/5cd6b440-16ff-d41b-9df5-8dee9865074a.png)
違和感は無いと思いますが、実際に作ってみると案外上手く組めません。
悩みの原因は**どこに書くべきか迷う処理**が存在するからです。## カスタムViewをトリガーにしてViewControllerに何かさせたい時
カスタムViewをトリガーにしてViewControllerに何かさせたい時の処理を考えます。
例えば「Viewの中のボタンをタップしたときに画面遷移をする」のような処理です。抽象的にはこうです。
!
Siriショートカットで出来ること出来ないこと
# Siriショートカットで出来ること出来ないこと
## TL;DR
* Siriショートカットで色々やってみたかったけど、項目を眺めてるだけだと内容がわかりにくく、公式ドキュメントも一覧性がない。仕方がないので、全部触ってみてわかりにくいものに註釈をつけて、自分が後で閲覧するようのリストを作った。
* ついでに全体を触ってみた上での所見、困ったところ、便利なところを簡単に。## 所見
* 使い所
* アクションの中に「SSH経由でスクリプトを実行」と「Webリクエスト」というものがあり、指定したサーバー上で実行したりLambdaに投げたりしてしまえば処理の上で出来ないことは事実上無い。従って考えるべきは「何が可能か」ではなく「あえてモバイル端末上で実行して意味があることはなにか」であるこれは概ね以下の4つの観点に集約されそう。
* モバイル端末を携帯している「わたし」自身のリアルタイムな情報を利用する場合
* 典型的には「位置情報」「接続中のアクセスポイント」「歩数」など、端末が収集してくれている自分の情報
*
[Flutter] Dribbbleデザイン、そのまま作ろう その13
こんにちは 皆さん!Dreamwalkerです。
メリークリスマス! :santa_tone2:どんな年末過ごしているでしょうか
忙しくて、遅くなってしまいました。今回は13番目の「DribbbleのデザインをFlutterでやってみた」になります。
#:fire:今回のデザイン:fire:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/da1bbf81-50a6-7ec4-db87-6e6df49ac75c.png)
https://dribbble.com/shots/9110398-Gift-Shop/attachments/1183035?mode=media#:clap:結果:clap:
##一つ目のページ。
![Screenshot_1577357764.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/e6558f4e-205c-d40f-01f
【iOS】?コンテナViewの採用基準?
# TL;DR
UIKitには4つのコンテナViewがありますが、どれを選択すべきなのか、
自分の中で曖昧だな〜と思ったので、整理しました。# コンテナViewって?
UIViewに直接パーツを貼り付けても実装は可能ですが、
それをやると細かいUI調整がしんどくなります。
しかも動的にデータが更新されるようなアプリだったら、厳しいですね。
そこでコンテナViewというViewにパーツを乗せて、レイアウトやデータ更新を制御しやすくします。# UIKitのコンテナView概観
詳細については後述しますが、UIKitの標準クラスとしては4つあります。[UICollectionView](https://developer.apple.com/documentation/uikit/uicollectionview)
[UITableView](https://developer.apple.com/documentation/uikit/uitableview)
[UIStackView](https://developer.apple.com/documentation/uik
XCodeでビルドしたら「The application’s Info.plist does not contain CFBundleShortVersionString.」と出た時の対処
ozvision Advent Calendar 2019
に参加させて頂きました。(日にち過ぎてしまったけど…)[株式会社オズビジョン](https://www.oz-vision.co.jp/)の開発チームに業務委託として参加しています村上です。(以前は社員でしたが出戻りました)
最近リリースされたハピタスアプリ(ネットショッピングなどでポイントがたまるアプリ)の改修などをしています。
よかったら使ってみてください。
[iOS版ハピタスアプリ](https://apps.apple.com/jp/app/id1475444626?&mt=8)
[Android版ハピタスアプリ](https://play.google.com/store/apps/details?id=jp.hapitas.appnativeside)[Web版ハピタスはこちら](https://hapitas.jp/)
業務でハマったことを書いていきます。
—
XCodeでスマホアプリをビルドしてシミュレーターを起動しようとしたら以下のようなエラーが出ました。
プログラミング界でよく使われているデザインパターンをSwift5で実装してみた記事の一覧です。
全ての記事は”Design Patterns in Swift5″(Karoly Nyisztor)https://www.amazon.com/Design-Patterns-Swift-implement-Improve-ebook/dp/B07MDD3FQJ を参考にしています。
#Creational Patterns (生成パターン)
###The Singleton (シングルトン)
https://qiita.com/satoru_pripara/items/725b66fd0dfb301cd80c
###The Prototype (プロトタイプ)
https://qiita.com/satoru_pripara/items/e25921a4ec6cee9fb7de
###The Builder (ビルダー)
https://qiita.com/satoru_pripara/items/9ef22416bf684662b968
###The Factory
ビルダーをSwift5で実装する
※この記事は「全デザインパターンをSwift5で実装する」https://qiita.com/satoru_pripara/items/3aa80dab8e80052796c6 の一部です。
###The Builder(ビルダー)
####0. ビルダーの意義
インスタンス生成の際に大量の設定をしなければならない場合、そのまま生成していては毎回複雑な処理をしなくてはならなくなってしまう。
そこで毎回のインスタンス生成時の設定に数パターンのデフォルト設定を用意して、それを使い回すのが有効なことがある。これがビルダーパターンである。
毎回、設定の全てを考える必要がなくなるため、インスタンス生成に必要な知識が減りコードを作成しやすくなる。
インスタン生成時に多数の変数を使って設定が必要な場合などに有効で、それほどでもない場合は無駄となる場合が多い。
また、各インスタンスの設定に、「デフォルト設定」としてくくり出せるような共通の要素がなく毎回全く設定が異なる場合は、ビルダーパターンはあまり有効ではない。
####1. 登場人物:
– クライアント Client
–
UISliderをタップで選択可能にする (iOS12以上の場合)
### UISliderをタップで選択可能にするには
“`swift:iOS12より前
class MySlider: UISlider {
override func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
return true
}
}
“`## しかしiOS12以降だとSliderの値が変わらない
“`swift:iOS12以降
class MySlider: UISlider {
override func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
let tapPoint = touch.location(in: self)
let fraction = Float(tapPoint.x / bounds.width)
let newValue = (maximumValue – minimumValue
プロトタイプをSiwft5で実装する
※この記事は「全デザインパターンをSwift5で実装する」https://qiita.com/satoru_pripara/items/3aa80dab8e80052796c6 の一部です。
###The Prototype(プロトタイプ)
####0. プロトタイプの意義
プロトタイプとは、インスタンスが複数必要な時に、まず最初に一つだけ生成するが残りは最初の一つをコピーして用意する事を言う。
最初の一つを除いて、インスタンスをゼロから生成することが無い。そのためコストが削減される。
インスタンスを生成するコストが高い(例えば生成時に必要なデータをネットワークを経由してダウンロードしなければならない等)時、かつ複数のインスタンスが必要な時に主に使われる。
もともと値型である構造体(strtuct)などは、インスタンスのコピーを作成するのは容易である。参照型であるクラスのコピーを作成するのは簡単にはできないめ、実装が必要になる。
※値型と参照型については以下を参照
https://qiita.com/chihayafuru/items/f6bb38c4a34d8cf62a
シングルトンをSwift5で実装する
※この記事は「全デザインパターンをSwift5で実装する」https://qiita.com/satoru_pripara/items/3aa80dab8e80052796c6 の一部です。
###The Singleton(シングルトン)
####0. シングルトンの意義
あるクラスのオブジェクトをたった一つしか作れないことをシングルトンという。プログラムの実行の全過程を通してそのクラスのオブジェクトを一つのみに限定したいときに使われる。
例えばログファイルを扱うクラスは、ログはプログラム全体を通じて一箇所のみに書き込みたい事から、シングルトンにする意味がある。
またiOSに限ったものだと、アプリそのものを表す`UIApplication`クラスのインスタンスは、`shared`というプロパティを通じてただ一つのオブジェクトにアクセスするようになっている。
####1. シングルトンの実装:
– シングルトンオブジェクトがコピーされるのを防ぐため、値型の`struct`でなく参照型の`class`を使う。またサブクラスが作られるのを防ぐため`final`修飾詞をつける。
【iOS Firebase Dynamic Links】アプリインストールを経由するときに注意すること
# はじめに
Firebase Dynamic Links を用いて、 Web ページ等から AppStore を経由して新規インストール、その後の起動でリンクに基づいた処理をアプリで行う場合の注意点等をまとめます。
基本的な実装方法に関しては日本語ドキュメント等もありますのでそちらをご覧ください。なお、 iOS10 以降をサポートバージョンとするアプリを前提として話を進めます。
また、 Firebase Dynamic Links によって流れてくるリンクのことを別のリンクと区別するためにここでは Dynamic Links と呼ぶことにします。# 呼ばれるメソッドが違う
> 最後に、application:openURL:sourceApplication:annotation: メソッド(iOS 8 以前)と application:openURL:options: メソッド(iOS 9 以降)で、アプリのカスタム URL スキームを通して受信したリンクを処理します。これらのメソッドが呼び出されるのは、アプリが iOS 8 以前でリンクを受信したときと、iOS(バージョン
Flutter iOS dark modeが設定された環境では起動画面を黒くする
iOSの起動画面のdark mode対応について、LaunchScreen.storyboardで、背景色の設定を System Background Colorに設定しておけば自動的に通常時?白、ダークモード時?黒になるとのこと。
手順をまとめます。
### 1. XCodeを開く
プロジェクトディレクトリの
> ios/Runner.xcworkspace
をダブルクリックしてXCodeを開きます。
### 2. LaunchScreen.storyboardを選択します。
![a1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6327/143f8546-32f0-1419-9a3f-324d46ec099c.jpeg)### 3. Viewを選択します。
![a2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6327/8cc5f70b-3ce2-509f-1118-31cd32b949a0.jp
Flutter iOS 幅320px端末で status barを隠す
iPhone SEサイズの場合で、表示したいものの領域が足りなくなり、ステータスバーを隠すことで、領域を増やす対応をしたい場合があったのでメモ。
画面のサイズの取得と、ステータスバーの非表示のコードです。
“`dart
if (MediaQuery.of(context).size.width == 320) {
SystemChrome.setEnabledSystemUIOverlays([]);
}
“`アプリケーションの開始直後からこの設定を行いたかったので、main()の中でやりたいところでしたが、contextへアクセスが難しいのでコードを書く場所を悩みました。
Widgetのbuild内に書くのは好ましくないような気がしたので、最終的にはinitState()内に書くことにしました。
しかし、initState()が呼び出された時には、contextが取れずdelayを付けて実行する形にしました。
“`dart
Future.delayed(Duration.zero, () {
if (MediaQuery.of(context).size.w