- 1. iOSアプリ開発に便利なライブラリ
- 2. 【Flutter】Statefullなカウンターアプリをhooks_riverpod+state_notifier+freezedでリファクタリングする
- 3. もう、なくそう。誹謗中傷を「なくす」アプリの開発
- 4. enumとvalidationの用い方(初学者向け、コード説明あり)
- 5. [SwiftUI] ロングタップした位置をViewに伝える方法
- 6. CGRectを中心とサイズ指定で簡単に生成できるようにする
- 7. Flutter製のiOSアプリでApple Watchを連携する際にハマったこと
- 8. ignoresSafeArea の第一引数と SwiftUI のキーボード避け
- 9. iOS(Swift)リンク集
- 10. iOS15でのジオフェンシングの異常について
- 11. Xcode13のUser-Defined Settingで「MTLLINKER_FLAGS」キーが登録できないときの対処法
- 12. Xcode Cloud でプロジェクトをビルドしてみる
- 13. Firebase × Swift × Vueでマッチングアプリmeepleをリリースしました!
- 14. 【App Architecture編】流し読みするHuman Interface Guidelines
- 15. Xcodeのシミュレータで録画する方法
- 16. 【Swift】AVPlayerの再生と一時停止を切り替える
- 17. iPhoneのショートカットにて時間を減算する
- 18. SwiftのOptional型に?をつけて代入した時の挙動
- 19. 【Swift】Swift Concurrency を使って簡易なAPIClientを作ってみる
- 20. [iOS]Test実行時のエラー: Multiple commands produce ~ MyApp.app ~ Target ‘MyApp’ has create directory command with output MyApp.app
iOSアプリ開発に便利なライブラリ
#はじめに
– ライブラリについてメモとして記事を書いています。#便利なライブラリ一覧
– IQKeyboardManager
– Kingfisher
– SnapKit
– lottie-ios#IQKeyBoardManager
### どんなライブラリ?
– IQKeyboardManagerのGitHubから引用– While developing iOS apps, we often run into issues where the iPhone keyboard slides up and covers the UITextField/UITextView. IQKeyboardManager allows you to prevent this issue of keyboard sliding up and covering UITextField/UITextView without needing you to write any code or make any additional setup. To use IQKeyboardMana
【Flutter】Statefullなカウンターアプリをhooks_riverpod+state_notifier+freezedでリファクタリングする
FlutterのNullSafetyがstableになってしばらくたち、最近になってriverpodがstableになったので、記念にhooks_riverpod + state_notifier + freezedの使い方を最低限記載しておきます。
プロジェクトを作った時に作られるカウンターアプリを上記パッケージを使って実現するようにリファクタリングしていきます。# tl;dr
– flutterの初期アプリをhooks_riverpod+state_notifier+freezedを使うようにリファクタリングする
– 結論としては単機能なアプリでこんなに複雑にやると余計わかりずらい(趣旨としてはサンプルなので良いのですが、、、)
– freezedも無理やり使ったしhooksはさすがに使えなかったので、hooks特有の機能については本記事のスコープ外#### 完成版の全コード
https://github.com/tokku5552/flutter_riverpod_sample/tree/1.0.0
## 環境
– Android Studio“`yaml:
もう、なくそう。誹謗中傷を「なくす」アプリの開発
# はじめに
**技術的な内容のみをご覧になりたい方は[こちら](#技術的なポイント)からどうぞ**[](https://tokiwaproject.page.link/mute)
**誹謗中傷をネット上から「なくす」アプリ**を開発しました。簡単にいうと、Web上の特定の単語、過激な表現や人を傷つけるような言葉を非表示にするものです。
アプリ開発の動機など、いわゆる「ポエム」よりの内容は[note](https://note.com/izumo092/n/ne17f44c9fda4)に掲載しているので、Qiitaでは機能や技術面に絞ってお話ししたいと思います。
**[ダウンロードはこちらから](https://tokiwaproject.page.link/mute)**
https://apps.apple.com
enumとvalidationの用い方(初学者向け、コード説明あり)
Swift初学者であり、間違っていることも、
記載している可能性もありますので、ご注意ください。##まずはじめに用語の説明
バリデーションとは、
__入力内容や記述内容が要件を満たしているか、妥当性を確認すること__
URL:https://wa3.i-3-i.info/word11610.html
かんたんに言うと 入力チェックです。enumとは、
__列挙型(enum)とは関連性のある事柄、データを一つにまとめた定数のようなものです。__
URL:https://www.sejuku.net/blog/35711##行いたいこと
テキストフィードが2つあり、
一つに税抜金額、
もう一つに税率を入力し、
数値が入力されているか、されていないかを確認する。
チェック後に、行いたい処理を行う。というプログラムを作成します
##enumでValidationを定義
![スクリーンショット 2021-11-08 5.22.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799713/
[SwiftUI] ロングタップした位置をViewに伝える方法
## はじめに
SwiftUIで、Gestureを使ったUIを作成する機会があり、その時の実装メモを残したいと思います。
## どんなことをするのか
Viewをロングタップして、その場所(座標)をView側に伝える
## 概論
SwiftUIだけでは完結しなかった。
UIViewRepresentableを使って、UIKitのGestureを使う必要がある(iOS14までだと多分、)## 実際のコード
早速実際のコードです
UIViewRepresentableを使ったところ
“`ViewRepresentable.swift
struct ViewRepresentable: UIViewRepresentable {class Coordinator: NSObject {
@Binding var point: CGPoint
init(point: Binding
) {
_point = point
}@objc func longTappe
CGRectを中心とサイズ指定で簡単に生成できるようにする
##やりたいこと
Viewの配置場所指定などで頻繁に使用する、おなじみのCGRect。
CGRectの生成方法は
“`swift
CGRect(origin: CGPoint, size: CGSize)
“`または
“`swift
CGRect(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat)
“`
という感じで、
四角形の左上の座標指定 + 幅・高さ指定
で生成します。なのですが、実際には
中心の座標指定 + 幅・高さ指定
からCGRectを生成したいシーンはよくあるかと思います。毎度毎度、これらの値からoriginを計算してCGRect生成するのはめんどくさいので、
中心の座標 + 幅・高さ
で一発でCGRectを生成できるようにしてしまいたいですね。##解決方法
CGRectを 中心座標 + サイズ の情報で生成でいるイニシャライザを、
CGRectのExtensionとして実装してしまえば良いです。“`swift:CGRectExtension.swift
i
Flutter製のiOSアプリでApple Watchを連携する際にハマったこと
Flutter製のiOSアプリでApple Watchを連携する際にいろいろハマった点があったのでメモに残しておきます。
# 環境
– Flutter 2.5.2
– Xcode 13.0## 基本的な手順
– XcodeのiOSプロジェクトにWatchのターゲットを追加
– プロフェクトフォルダ内/ios/Runner.wcworkspaceをXcodeで開く
– File>New>Target>WatcOS>Watch App for iOS App
– 任意のプロジェクト名(ここの記事では**watch**とする)をつけて作成
– bitcodeをYESに変更
– iOSとWatchOSのバージョン番号を一致させる
– Flutter Method ChannelでFlutterとSwift間のデータのやり取りを実装詳細は[こちらの記事](https://medium.com/kbtg-life/adding-apple-watch-to-flutter-app-via-flutter-method-channel-f1443532d94e)を
ignoresSafeArea の第一引数と SwiftUI のキーボード避け
## 概要
SwiftUI には `ignoresSafeArea` という modifier がありますが、しっかり理解せず使っていたので基本的な動作や引数の役割、SwiftUI の自動でのキーボード避けとの関係について調べてまとめました。
## ignoresSafeArea とは
SwiftUI の View はデフォルトでは SafeArea の中に配置されます。例えば画面全体に背景色を設定しようとすると、背景色は以下のように SafeArea 内だけに適用されます。
“`swift
struct ContentView: View {
var body: some View {
Color.yellow
}
}
“`
ときにはこの振る舞いが余計なお世話になってしまうことも
iOS(Swift)リンク集
個人的な雑多リンク集です。
https://stackoverflow.com/questions/39080807/drag-and-reorder-uicollectionview-with-sections/39088025#39088025
[Supporting Drag and Drop in Collection Views](
https://developer.apple.com/documentation/uikit/views_and_controls/collection_views/supporting_drag_and_drop_in_collection_views)https://swift-ios.keicode.com/devenv/xcode-how-to-build-for-12-with-xcode11.php
https://phosphor-bronze.blogspot.com/2018/07/uicollectionviewios11.html
※配列の要素の交換は`swapAt(i, j)`で可能
https://qii
iOS15でのジオフェンシングの異常について
#iOS15でのジオフェンシングの異常について
iOS14まで正常に動いていたジオフェンシングが、
iOS15以降、正常動作していないケースがありました。
「iOS15での端末再起動後、アプリ起動するまで、ジオフェンスを検知しない」問題があるようです。日本語での該当記事が見つからないため、
とりあえずレベルですが、検証してみました。##海外記事
[ios15 geofencing not working]で検索すると、
いくつかのアプリで、iOS15+ジオフェンシングの組み合わせで問題があり、
掲示板などで多少、会話がなされているようです。
内容的には、以下のような共通点があります。– iOS14までは問題なく、iOS15では問題がある
– 端末再起動後、アプリを起動しないとジオフェンスが有効にならない
– iOS15.0.2でも直っていない[Geofencing problems with iOS15.01]
https://discussions.apple.com/thread/253247480[Geofencing and iOS15.]
https://
Xcode13のUser-Defined Settingで「MTLLINKER_FLAGS」キーが登録できないときの対処法
# TL;DR
Xcodeのビルド設定に新しく`Metal Linker – Build Options`という項目ができているので、そこに値`-cikernel`を指定しましょう。# 環境
– Xcode 13.1
– macOS Big Sur 11.6.1# 起こっていたこと
Core ImageのフィルタをMetalファイルで記述するには、XcodeのBuild Settingを以下の2つ変更する必要があります。– `Other Metal Compiler Flags`に`-fcikernel`を指定する
– `User-Defined Setting`として`MTLLINKER_FLAGS`キーを追加し、値に`-cikernel`を指定するこのうち下側の`User-Defined Setting`で`MTLLINKER_FLAGS`キーを追加しようとしたところ、「すでに設定されている名前なので違う名前で設定してね」というエラーが出ました。
> There already is another setting named “MTLLINKER_FLAGS”.
Xcode Cloud でプロジェクトをビルドしてみる
## これは何
Xcode Cloud でプロジェクトをビルドする方法のメモです。そもそも Xcode Cloud って何よ?という方は下記サイトを御覧ください。
[Xcode Cloud Overview \- Apple Developer](https://developer.apple.com/xcode-cloud/)
## 利用申請
Xcode Cloud はまだベータ版であり、利用するには下記URLから申し込む必要があります。
https://developer.apple.com/xcode-cloud/beta/request/
何日か待つと「使えるようにしたよ〜」といった内容のメールが Apple から届きます。
## とりあえずビルドしてみる
まずは [Xcode 13](https://developer.apple.com/download/) 以降をインストールしましょう。
次に Xcode のメニューから Product > Xcode Cloud > Create Workflow… を選択します。
![スクリーンショット
Firebase × Swift × Vueでマッチングアプリmeepleをリリースしました!
2021.11.04 本日、ブラインドマッチングアプリ **meeple(ミープル)** をリリースしました!
この記事では開発に至るまでの経緯〜リリースまでの過程と、その中で思ったことをまとめました。#自己紹介
新卒2年目のWebエンジニア。
このアプリに集中するため、ちょうど最近会社を辞めたところです。
半年ほどちまちまとSwiftとFirebaseを触った後、去年の12月から友人3人を誘って本格的にアプリ制作を開始しました。#作ったアプリ
###meeple (https://meeple.jp/)
***「1度の出会いを大切に」***をコンセプトとした、モザイクから始まる、運営からの紹介制のブラインドマッチングアプリです。
> ※ブラインドマッチングとは簡単に言うと、**プロフィール非公開・審査登録制・運営紹介型**のマッチングサービスです。[App Storeリンク](https://apps.apple.com/jp/app/id1592092244)
![アプリの説明画像](https://qiita-image-store.s3.ap-northea
【App Architecture編】流し読みするHuman Interface Guidelines
## App Architecture
? は`iOS 15.0`から導入されたものです。### Launching
– Provide a launch screen.
→ コンテンツのロード中にユーザを待機させない
参考: [Launch Screen](https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/launch-screen)
– Launch in the appropriate orientation.
→ アプリ起動時の画面の向きを考慮する
参考: [Adaptivity and Layout](https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/adaptivity-and-layout)
– Avoid asking for setup information up front.
→ 設定画面は最小限に(カスタマイズ性より汎用性 ※ユーザ意識)
Xcodeのシミュレータで録画する方法
#環境
Xcode13.1
Swift5.5.1#シミュレータで使用する方法
1.⌘+⌥+スクショボタンをタップで録画開始。
2.スクショボタンで終了。※録画が開始されるとこのような表示になります。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409860/af318f35-662c-7fea-209d-dcbfa167cd1a.png)#ターミナルを使用する方法
録画データはカレントディレクトリに保存されるので、事前に保存したいディレクトリに移動しておいてください。
1.`xcrun simctl io booted recordVideo 任意の名前.mov`で録画が開始
2. ⌃+cで録画終了エラーが発生する方はXcodeで以下の設定を行ってください。
⌘+,>Locations>Command Line Toolsを設定してください。
【Swift】AVPlayerの再生と一時停止を切り替える
Swiftで導入したAVPlayerの再生と一時停止を切り替える方法。
今回はUIButtonで再生と一時停止を切り替える方法を書きます。
## 実装コード
### モジュールを導入
“`swift
import UIKit
import AVFoundation
“`### 変数・定数の定義
“`swift
var videoPlayer: AVPlayer!enum AVStatus {
case playing
case stoped
}
var av_status : AVStatus = .stopedlet switchbutton = UIButton()
“`### AVPlayerの設定
“`swift
guard let path = Bundle.main.path(forResource: “sample”, ofType: “mp4”) else {
fatalError(“動画が見つかりませんでした”)
}
let fileURL = URL(fileURLWithPath: path)
let
iPhoneのショートカットにて時間を減算する
# ショートカットで時間を減算すると午後になる
https://discussionsjapan.apple.com/thread/250899633
この質問では不具合ですと結論づいていますが、解決しました。
めでたし。# 方法
アラームに代入する値の設定をします。
日付フォーマットを`カスタム`にし、内容を`HH:mm`とします。
![E31DAAB1-3936-4AAE-92CD-658D7437470A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274492/426a384c-ba5f-d3b9-22da-d1d329fb1418.png)
そうすれば、5分前や10分前の時間も無事に設定することができました。
# 理由はわからず。
上の記事の通り、アラームに代入するときに時間がずれるみたいです。
その直前の`調整済みの日付`までは正常な時刻になっています。
SwiftのOptional型に?をつけて代入した時の挙動
# Optional変数への代入
次のstrは何が代入されるでしょうか?“`swift
var str: String? = nil
str = “Hallo”
print(String(describing: str))
“`strにはHalloという文字列が代入されるので、strの結果は `”Hallo”` になります。正確には`Optional(“Hallo”)`になります。
# ?付きOptional変数への代入
では、次のstrは何が代入されるでしょうか?“`swift
var str: String? = nil
str? = “Hallo” // ←?付き変数に代入する
print(String(describing: str))
“`先程と似たようなコードですが、先程のコードとは違ってstrには`?`をつけて代入しています。
これはちゃんとビルドが通るコードですが、この場合、strの結果は `nil` になります。## ?付きの値のあるOptional変数へ代入
もう一つ、次のstrは何が代入されるでしょうか?
“`swift
var
【Swift】Swift Concurrency を使って簡易なAPIClientを作ってみる
Swift Concurrency は魅力的です。
それを試しに使ってみるために、APIClientを作成しレスポンスをViewに表示してみます(SwiftUIを利用)。GithubのREST APIを利用しています。
https://docs.github.com/ja/rest最終的なコードはこちらにあります。
https://github.com/yyokii/APIClientUsingSwiftConcurrency## APIリクエスト/レスポンス
まず、APIリクエストする際の設定とレスポンスで受け取る型を定義します。
ここではSwift Concurrencyの機能は利用していません。今回はGithubのユーザー情報取得のAPIを利用します。
レスポンスはこちらです。
“`swift
public struct UserInformation: Codable {
public var login: String
public var id: Int
public var followers: Int
public
[iOS]Test実行時のエラー: Multiple commands produce ~ MyApp.app ~ Target ‘MyApp’ has create directory command with output MyApp.app
Xcode13でテスト実行時に以下のようなエラーが出ました
> Multiple commands produce ‘/Users/XXXXXXX/Library/Developer/Xcode/DerivedData/MyApp-dezhjkzxmgwlxncualxzkrriyqfc/Build/Products/Debug-iphonesimulator/DEV_MyApp.app’:
1) Target ‘MyApp’ has create directory command with output ‘/Users/XXXXXXX/Library/Developer/Xcode/DerivedData/MyApp-dezhjkzxmgwlxncualxzkrriyqfc/Build/Products/Debug-iphonesimulator/DEV_MyApp.app’
2) Target ‘MyApp-for-preview’ has create directory command with output ‘/Users/XXXXXXX/Library/Develo