- 1. テスト可能なコードを書くために改善したこと
- 2. こんなソースコードはイヤだ-sharedインスタンスの誘惑
- 3. 【Xcode】背景画像をダークモードに対応させる
- 4. iosのショートカット Tips
- 5. macOS/iOSスレッドプログラミング(スレッドとRunLoop)
- 6. 【Swift】Realm DatabaseでのDB操作方法について
- 7. SwiftUI で UITextField を使ってマークされたテキストを無視する
- 8. [Swift] アプリ内でSafariを開く方法
- 9. FlutterアプリでonResume的なタイミングの処理をする/複数ウィジェットで監視編
- 10. [Swift] クロージャ(Closures)を理解してみよう
- 11. UIButtonの枠線色を動的なUserInterfaceStyleの切り替えに対応させる
- 12. AndroidStudioでiOSのinfo.plistを編集する
- 13. こんなソースコードはイヤだ-ifの分岐で数を数えないで
- 14. iOS Safariのoverflow:scroll内の要素でtransitionendが発生すると、バウンススクロールがキャンセルされる
- 15. iOSのURLスキームの脆弱性について
- 16. iOSのバックグラウンド状態でできることを簡易的にまとめる
- 17. 【超基本】カウントアップで学ぶ②AVFoundationで効果音をつける。
- 18. こんなソースコードはイヤだ-関数の使用者に余計なことをさせない
- 19. 【Pyto】スマホをPC用フリックキーボードにしてみた
- 20. Application Development Guide for Android and iOS
テスト可能なコードを書くために改善したこと
## はじめに
最近、業務でパイセンが書いたコードをレビューした時に、こんな書き方できるんだ!と勉強させていただいたので、実際にどのような挙動になるのかテストコードを書いてみたことがありました:hammer_pick::gear:([CountablePartialRangeFrom](https://developer.apple.com/documentation/swift/countablepartialrangefrom)っていうのが使われていたのですが、初見でした:eyes:)
理解を深めるためにもテストコードを書いてみよう!と思いましたが、
テストコードを書きづらいところがあったので、その要因とテストを書くために改善したことを整理したいと思います。## 本記事で扱わないこと
本記事では、Swiftで書かれたiOSプロジェクトについて扱いますので、
他の言語については扱いませんm(_ _)mまた、テストコードについてはXCTestを使用することを想定した内容となりますが
XCUnitTestの書き方(Assertの種類や使い方など)については本記事では扱いませ
こんなソースコードはイヤだ-sharedインスタンスの誘惑
プログラムのソースコードのより良い書き方をまとめていこうと思います。
# sharedインスタンスの誘惑
“`sample.swift
class UserRequest {
class func shared() -> UserRequest {
struct Static {
static let instance = UserRequest()
}
return Static.instance
}//ユーザデータを取得
func getUserData(userId: String, completionHandler: (Response?) -> ()) {
//API終了時の処理…
}
“`[どのようにリファクタリングできるのか](https://www.sentohsharyoga.com/ja/bad_source_code/entry/temptation_of_shared_instance)
【Xcode】背景画像をダークモードに対応させる
##背景画像を変更したい!
iOS13からダークモードが搭載されましたね!
今更ですが、背景画像をダークモードと通常モード(ライトモード)で変更させてみました。##1.まずはImage Viewを配置
Image Viewを配置して、各Contstrainsを設定します。※ Constrainsは設定しなくても大丈夫ですが、設定しないとSimulator上で背景画像がずれてしまうので、一応設定しましょう!
iosのショートカット Tipsiosのショートカットのプログラム初心者が便利なtipsを書いてゆきます
ショートカットのプログラムは以下のようなアクションと呼ばれるプログラムパーツを並べることでプログラムを構成するのですが、各アクションを示すのに画像を張り付けるのは大変なので、下の図のアクションは
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535482/9bc8fa39-29c7-1ef8-a41b-d651e8b91e74.jpeg)
最初のアクションを[日時/{現在の日付}] (1)
次のアクションを
[書類/{日時}からテキストを取得] (2)
と表記します。{}は変数名やオプションを示します
#Tips(プログラミング)
##テキストの途中結果を見る
以下のアクションを見たいアクションの後に入れる| 表示の方法 | アクション |
|:–|:–|
| ポップアップで表示 | [スクリプティング/{テキスト}を表示] |
| メモで表示 | [メモ/{テキスト}でメモを
macOS/iOSスレッドプログラミング(スレッドとRunLoop)
# シリーズ(予定)
突然ですがOSの進化とともに充実していった、今では使うことはないであろうAPIなどにも触れつつスレッドなどの概念についてまとめていきたいと思います。
1. macOS/iOSスレッドプログラミング(スレッドとRunLoop) :point_left:
2. macOS/iOSスレッドプログラミング(排他制御とキャンセル / Objective-C 2.0 / NSOperationQueue)
3. macOS/iOSスレッドプログラミング(Grand Central Dispatch)
4. macOS/iOSスレッドプログラミング(Swift + Dispatch / Combine)# 注意点
* macOSまたはiOSで簡単なアプリが開発できるレベルの知識が前提となります。ご注意ください
* OS作れるレベルまで熟知しているわけではないため、間違い等あればお手数ですがご指摘いただけると嬉しいです# Mac OS X 10.4 Tiger / iPhone OS 3 までの非同期処理
懐かしいと思う方、 iPhone OS とはなんぞやと思
【Swift】Realm DatabaseでのDB操作方法について
iOSのアプリ開発時に設定画面で使用したRealmについてまとめました。
# Realm Database
Realm Databaseは、SQLiteと違いSQL文は使用せずにデータの追加等を行います。
Realm Databaseを使用する場合、DB用にファイルを作成しデータの追加等を行います# DBの作成
Objectを継承させて、カラムを追加します。
カラムの追加には初期値の入力が必要になります。“`swift:RealmDB.swift
import UIKit
import RealmSwift//Relam
class GPSConfig: Object {//Int型
@objc dynamic var column1 = 0
//String型
@objc dynamic var column2 = “”}
“`# データの追加
realm.add(RealmDB(value: object)) でDBにデータを追加できます。“`swift
let realm = try! Realm()
SwiftUI で UITextField を使ってマークされたテキストを無視する
iOSアプリ開発中に SwiftUI の TextField で日本語入力したときに、テキストがうまく入力できない場合があって困りました。
とりあえず、UITextField で回避する方法を書いておきます。## 準備
– Xcode 11.5
## UITextField と代用する
`SwiftUI.TextField` の入力がおかしいときは、マークされたテキストのときに起こっているようだったので、そのときの入力だけ無視するように UITextField を代わりに使って実装します。
※ マークされたテキストは、日本語のような `multistage text input` のときに起きるそうです。– https://developer.apple.com/documentation/uikit/uitextinput/1614489-markedtextrange
UITextField を UIViewRepresentableでラップしつつ、SwiftUI.TextField と同じようなインターフェイスが取れるようにしてます。
“`swift
im
[Swift] アプリ内でSafariを開く方法
##完成形
###pageSheet(iOS13以降の画面遷移の標準)
![ezgif.com-video-to-gif (4).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328477/18bfe489-8acb-3eff-b795-7ad49e93c723.gif)###フルスクリーン
![ezgif.com-video-to-gif (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328477/1053152d-ea73-cdb3-f0d0-8cdaf7bb2624.gif)##コード
“`Swift:ViewController
import UIKit
import SafariServices
class ViewController: UIViewController {override func viewDidLoad() {
super.viewD
FlutterアプリでonResume的なタイミングの処理をする/複数ウィジェットで監視編
Flutterアプリで、Androidでいう`onResume`のタイミング(アプリがホームボタンなどでバックグラウンドに行ってまた前面に戻ったとき)で処理をしたいと思い、以下の記事を書きました。
FlutterアプリでonResume的なタイミングの処理をする
https://qiita.com/kasa_le/items/1fdbe07112ab4aed250aしかし、複数のウィジェットで同時多発的に監視したいときに、この方法では問題がありました。
関数名を見て貰えれば分かりますが、`set***`なので、**最後にセットしたコールバックしか呼ばれません。**ということで、対処法を調べたのでそのまとめです。
# 環境など
|ツールなど|バージョンなど|
|:–|:–|
| MacBook Air Early2015|macOS Mojave 10.14.6|
|Android Studio |3.6.1|
|Java |1.8.0_131|
|Flutter|1.12.13+hotfix.9|
|Dart |2.7.2|
|Xcode |11.3.1|# 解決
[Swift] クロージャ(Closures)を理解してみよう
まとめたものを共有します。
環境は以下の通りです
Swift 5.1
Xcode 11.3# クロージャの携帯
{(パラメータリスト) → リターン型 `in` 実行するコード}
何も印字で受け取らず、何も返さないクローザーは `( ) → ( )` です。# Swiftの関数はクロージャ!
Swiftの関数はクロージャです。
これは、関数の本体内のスコープ内の外部変数への参照をキャプチャできることを意味する。例えば、下のドグのインスタンスを参照してみよう。
参照がその`whatThisDogSays`にどうなるのか見てみましょう。UIButtonの枠線色を動的なUserInterfaceStyleの切り替えに対応させる
# 環境
– Xcode 11.5
– Swift 5.2.4
– iOS 13.0~# 前口上
表題ではUIButtonとしていますが、UIColorで設定されているtextColorとの比較ができるのでUIButtonを用いているだけで、`UITraitEnvironment`を継承している`UIView`や`UIViewController`で対応可能です。
あと動的という表現が適切かどうかはわかりません。# 問題点
UIButtonの枠線に色を設定するために、 `layer.borderColor`にCGColorを設定します。
※比較のため、textColorとborderColorには同一のUIColorを用います。“`Swift
button.titleLabel?.textColor = UIColor.label // UIColor
button.layer.borderColor = UIColor.label.cgColor // CGColor
“`しかし、上記の設定だけではUIButtonが**生成された後**、
`UserInter
AndroidStudioでiOSのinfo.plistを編集する
わざわざXcodeを起動して編集するの面倒だなと思っていたら、AndroidStudioの以下ファイルを編集することで設定を反映させることができた。
ios/Runner/Info.plist
“`Info.plist.yaml
…略
io.flutter.embedded_views_preview
“`
今回はwebViewの設定を追加
keyの下に設定する値を記述。書き方はファイル内を参考すればわかるので割愛
こんなソースコードはイヤだ-ifの分岐で数を数えないで
プログラムのソースコードのより良い書き方をまとめていこうと思います。
# ifの分岐で数を数えないで
“`sample.swift
var count = 0
if (self.existsApple) {
count += 1
}
if (self.existsGrape) {
count += 1
}
if (self.existsOrange) {
count += 1
}
print(count)
“`[どのようにリファクタリングできるのか](https://www.sentohsharyoga.com/ja/bad_source_code/entry/dont_use_if_for_count)
iOS Safariのoverflow:scroll内の要素でtransitionendが発生すると、バウンススクロールがキャンセルされる
iOSのOverflow:hiddenを持った要素内スクロールで問題が発生。
iOS safariでは、スクロールが末端でバウンスするエフェクト(ぼよよーんって感じの表現)がかかる。つまり一時的にスクロール可能最大量以上のスクロールがされた状態がユーザーに見える。
ところで、要素内でtransitionendイベントが発生すると、このバウンスが一時的にキャンセルされるのか、スクロール可能量以上のスクロール状態ではなくなる。結果として、連続的にtransitionendが発生するような演出を入れていた場合(スクロール要素内の要素が次々とスライドインするような演出)、
バウンススクロールが連続的に強制的にスクロール可能最大量にリセットされ、震えているように見える。効果的な対処法はちょっと思いつかない。
スライドインする要素が全部出現終わるまでは、javaScriptで強制的にバウンススクロール時のスクロールイベントをキャンセルするなどした。ただこれも十全ではない。
iOSのURLスキームの脆弱性について
# 概要
iOSのURLスキームが意外と脆弱だから気をつけた方が良いよと言う話をします。
※違うよ、とかあれば気軽にコメント頂ければ幸いです
※すみません、間違って一度記事を削除してしまいました。。orz もう一度再掲します# iOSのURLスキームについて
下記のようにURLスキームを叩くことがあると思うのですが、
“`
hoge://〜
“`これってどの情報を元にどのアプリがこのURLスキームを受けるか決めているのでしょうか。
答えとしては、どのアプリが受け取ると言う情報が入っている訳ではありません。
なので
AアプリとBアプリでそれぞれ同じプロトコル名で受け取るようにしていた場合、どちらがそのURLスキームを受け取るかわかりません
(過去に確認した挙動だと、先にインストールされている方のアプリが受け取るようです)Aアプリ
“`
hoge://〜
を受け取るように実装
“`Bアプリ
“`
hoge://〜
を受け取るように実装
“`奪い取りたいURLスキームのプロトコルなんて他の人わ
iOSのバックグラウンド状態でできることを簡易的にまとめる
## Audio, Airplay, and Picture in Picture
音の再生・AirPlay(音楽を再生するなど)## Location updates
位置情報更新https://qiita.com/SatoTakeshiX/items/a7039b9a1691d05d10da
– significant-change location service
完全にアプリを閉じてる状態でも更新できる
https://developers.cyberagent.co.jp/blog/archives/771/## Voice over IP
通話, VoIP用のプッシュ通知
VoIPプッシュは高優先度かつ遅延なく配送されるとみなされる
https://qiita.com/mgkdev/items/303b9015fabca4eb7fb7端末がロックした状態で着信に応答すると、CallKitの通話画面が表示されたままになります。この状態では、アプリ側の画面が表示されないためビデオが表示されません。ユーザーがロックを解除するとアプリの画面に切り替わりま
【超基本】カウントアップで学ぶ②AVFoundationで効果音をつける。
## はじめに
本記事はプログラミング初学者の筆者が、備忘録として作成した記事であり、興味本位で試してみたい機能についてのメモである。前回の続きです。
[【超基本】カウントアップで学ぶ①if文](https://qiita.com/mashishift/items/a6fcc79e845d5cc1f2a8)
## ゴール
・AVFoundationを用いて、アプリに効果音を付ける。##内容
・前回作成したカウントアップアプリに効果音を付ける。
・AVFoundationを用いて、Labelが”7″の時にハッピーな効果音を流す。
・↑と同時にimageViewに”犬”の画像を表示し、”祝福の言葉”をLabelに表示させる。##完成:Simulator画像
・”7″の時、効果音が鳴る。
・犬に祝ってもらう。
こんなソースコードはイヤだ-関数の使用者に余計なことをさせないプログラムのソースコードのより良い書き方をまとめていこうと思います。
# 関数の使用者に余計なことをさせない
“`sample.swift
func printCountMessage(counts: [String]) {
print(counts.joined(separator: “,”))
}let counts = [1, 2, 3]
printCountMessage(counts: count.map{ String($0) })
“`[どのようにリファクタリングできるのか](https://www.sentohsharyoga.com/ja/bad_source_code/entry/create_function_easy_to_use)
【Pyto】スマホをPC用フリックキーボードにしてみた
![image2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549600/88220d07-4b7b-21a3-bb1e-a9808d179553.jpeg)
## はじめに
若者のPC離れと言われる中、タイピングができない人が多くなってきているそうです。しかし若者はPCが使えない代わりにスマホの扱いには慣れており、現在の女子高生のフリック入力はガラケーギャルもびっくりするほどの速さです。
それならPCの入力もフリックでやってしまえば良いのではないか、ということは以前から言われていたようですが、手軽に試せるソフトはありませんでした。
そこで、iOSでPythonプログラミングができる[Pyto](https://pyto.app/)というアプリを使って、フリックキーボードを作ってみました。
## 既存の製品
– [FlickTyper](http://flicktyper.com)
スマホとPCをこの装置で繋ぐとスマホがフリックキーボードになります。また、Bluetooth
Application Development Guide for Android and iOS
The complete guide on how to create a mobile application, from defining the project goal and technology stack to testing and deployment. Check it out!