- 1. guard文まとめてみた
- 2. Flutter入門メモ:開発環境構築編
- 3. swich文について初歩的なことをかく
- 4. 【swift】google admobを実装した際に「[UIView setAdUnitID:]: unrecognized selector sent to instance」が出力した場合の対応
- 5. 【swift5】APIを叩くときは「HTTP」を「HTTPS」に直しましょう
- 6. 【Unity】Unity上からiOS端末の発熱状態を取得する
- 7. Swiftがこんなに使われる理由
- 8. iOSアプリエンジニアがM1搭載Macを購入するにあたっての検討事項
- 9. Firebase Authenticationを使ってiOSアプリのログイン機能を実装する
- 10. サーバーサイドエンジニアが知っておくべきiOSアプリのデプロイとかテスト周りの知識をメモる
- 11. モーダル遷移
- 12. classとstructについて【Swift】
- 13. Xcode 12 + XcodegenでCycle Inside ______エラーでテストターゲットがビルド通らない問題
- 14. PRPreviewViewControllerの再生が一回しかできない
- 15. 【第5回】初心者二人で0から麻雀アプリ開発
- 16. [iOS13]DeprecatedになったkeyWindowの取得方法
- 17. CoreMLモデルのサイズを小さくする量子化でモデルの精度はどう変わるのか
- 18. 2020-11-25時点でMongoDB RealmをiOSで使う場合の注意点
- 19. ProvisioningProfileの有効期限をチェックする
- 20. [Swift5]containsを使って特定の文字列を検索する方法
guard文まとめてみた
#guard文の役割
想定外の状況が起こった時にその処理から抜け出す役割をします。
#書き方
guard 条件 else {
条件を満たさなかったときの処理
break //returnでも良い
} 条件を満たした時の処理
#使ってみた
number2を割る数として割る数に0が入った時、{}内の処理が行われます。
条件式 number2 != 0の時{}外の処理
number2 == 0の時{}内の処理です。“`swift
guard number2 != 0 else{
answerLabel.text = “割る数には0以外の数字を入れてください”
return
}
kekka = number1 / number2
“`
#参考文献
詳解Swift 第5版
Flutter入門メモ:開発環境構築編
## 経緯
久々に新規でモバイルアプリでも作ろうかと思い、
一人で趣味で作るレベルだと、Swift・Kotlinでそれぞれ構築するのは掛けられる工数的に現実感が無いので、
1ソース系を試してみようかと。1ソース系は他にも選択肢がありますが、
React Nativeはなんか好みではないのと、Apache Cordovaは嫌な思い出しかないので、
流行ってるFlutterでやれないかなと、[公式](https://flutter.dev/docs/get-started/install)を見ながら少し試してみる事にしました。
今回は開発環境までのメモ。## 確認環境
* macOS Catalina
* Essential Essential Phone PH-1 (Android 10)### 前提
* [Homebrew](https://brew.sh/)がインストールされている。
※今回確認を実施したMacでは、XcodeやIntelliJ、VS Codeが予めインストールされています。
## 手順
Flutterのインストール。
“`shell
$
swich文について初歩的なことをかく
![スクリーンショット 2020-11-29 8.07.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/9e6d7bf1-b26f-224c-7cf5-ff10375baaf2.png)
#swich文の書き方
“`swift
let number1 = Double(number1TextField.text!) ?? 0
let number2 = Double(number2TextField.text!) ?? 0
var kekka :Double = 0
switch calculateSegmentedControl.selectedSegmentIndex{
case 0:
kekka = number1 + number2
case 1:
kekka = number1 – number2
case 2:
kekka = number1 * number2
cas
【swift】google admobを実装した際に「[UIView setAdUnitID:]: unrecognized selector sent to instance」が出力した場合の対応
swiftでgoogle admobを実装している際に下記エラーが出力した。
##エラー内容
“`swift
Thread 1: “-[UIView setAdUnitID:]: unrecognized selector sent to instance 0x7fce3a70abc0”
“`![スクリーンショット 2020-11-28 21.34.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60753/885afa85-a38a-6fc2-c217-fcf057fe9f67.png)
##対応方法
広告の枠としたいUIViewと「@IBOutlet weak var bannerView: GADBannerView!」をドラッグアンドドロップなどで紐付けるのだが、その際UIViewのCustom ClassのClass名に「GADBannerView」が記載されておらず実行時エラーとなっていた。UIViewのCustom ClassのClass名に「GADBannerView
【swift5】APIを叩くときは「HTTP」を「HTTPS」に直しましょう
※本記事が筆者の初投稿です! 優しい目で参考程度にご活用ください!
#はじめに
なーんにも考えずに、AlamoFireでAPIを叩いたりなどでHTTP通信をすると、
「エラーが出る」とか「想定より少ないデータしか取れない」
って問題が発生したりします。HTTP通信は暗号化されていない安全性の低い通信のため、
appleがデフォルトでブロックさせています。この状態でrequestを出しても、セキュリティでブロックされてる状態なので、
responseは返ってきません。
キャッチボールしようとしてるのに、二人の間に壁があるようなものです。
これでは投げても相手に届かないので投げ返してくれませんね。壁に邪魔されない形式の通信に変更しましょう。
#解決策
例えばAPIを使おうとして、サイトに載ってるサンプルクエリをコピペしてみます。
そうするとありがちなのが以下みたいなURL。
「http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key=[APIキー]&large_area=Z011」このデフォルトで文頭が「htt
【Unity】Unity上からiOS端末の発熱状態を取得する
iOS端末の発熱状態を取得できるAPIが無いか調べていたところ、[ProcessInfo.thermalState
](https://developer.apple.com/documentation/foundation/processinfo/1417480-thermalstate)から取得できることが分かりました。(※ドキュメントを見るに対応OSは`iOS 11.0+`である必要がありそう)この値を知ることが出来れば、例えば重いシーンなどで状態を見てサーマルスロットリング対策を可変的に機能させる処理を書くことが出来るかもしれません。(e.g. 熱状態がヒドいときに一部の機能のクオリティや更新頻度を下げるなど)
今回はこちらをUnityからも参照できるようにネイティブプラグインも合わせて実装したのでメモ。
[※コードだけ先に見たい方はこちら参照](https://gist.github.com/mao-test-h/f7a6733fc3eea2b73f617717c82d0351)– Unity 2019.4.15f
– Xcode 12.2# `Process
Swiftがこんなに使われる理由
本記事は、swiftって何をするための言語?swiftを使うメリットは?
というプログラミング初心者向けの記事になります。###<目次>
– 1. swift とは
– 2. swift の特徴#1. Swift とは
SwiftはiOS、macOS向けアプリケーションの開発言語として
Appleが発表したプログラミング言語です。
swiftの発表後に登場したwatchOSやiPadOSにも対応しています。**iOS**
-> iPhoneに搭載されているOS(オペレーティングシステム)
**macOS**
-> macに搭載されているOS(オペレーティングシステム)
世の中には、他にもWindows や Linux 、 Android などといった様々なOSが存在します。#2. Swift の特徴
swiftは、様々な人や企業が利用しています。
当たり前ですが、利用される多くの理由があるからです。swiftには様々な特徴が存在するのでそれについて紹介していきます。
##2-1. 静的型付き言語
静的型付き言語とは、コンパイル時などの実行前の段階で変数
iOSアプリエンジニアがM1搭載Macを購入するにあたっての検討事項
こんにちは。iOSアプリエンジニアの @zrn-ns です。
今月上旬、Apple独自チップであるM1チップを搭載したMacが登場しましたね。
発表イベント前までは(どうせ性能はIntelには及ばないだろう…)なんて思っていたんですが、実際はとんでもないバケモノ。
お値段据え置きにもかかわらず、既存のMacの中でも最上位モデルにも匹敵するほどの処理性能を持っている上、消費電力もめちゃくちゃ少ない。これまでのMacの歴史を塗り替えてしまうようなものが出てきてしまいました。普段iOS開発をしている僕としては、すぐにでも購入して試してみたい衝動に駆られたのですが、いかんせん3機種(MacBook Air/Pro, Mac mini)同時に発売されてしまったこともあり、どのモデルを買うか、どのようにカスタマイズするか、かなり迷いました?
今回は**iOSアプリエンジニア視点で、どのモデルをどんな構成で購入するか**検討していきたいと思います!
# 目次
– [? そもそも今M1 Macを買うべきでないユーザ](#? そ
Firebase Authenticationを使ってiOSアプリのログイン機能を実装する
最近、iOSアプリにFirebase Authentication を使ってSMS認証を実装する機会がありました。
実際に利用してみた感想としては、`ログイン機能` や `新規会員登録` などの複雑を要する機能を比較的簡単に品質の高く実装できるのでおすすめ出来ると感じました。## 前提
– Firebase/Auth をプロジェクトに追加し、 `pod install` の実行までが完了している
– まだの方は、[Firebase を iOS プロジェクトに追加する](https://firebase.google.com/docs/ios/setup?hl=ja) を参照し**FirebaseSDKの導入と、Firebase/Authのinstall**をお願いします。
– 各イベントのバインディング処理についてはRxSwift、RxCocoaを利用する
– RxSwiftに関する理解はこちらの記事がおすすめです: [RxSwiftについてようやく理解できてきたのでまとめることにした(1)](https://qiita.com/s_emoto/items/b000a5c
サーバーサイドエンジニアが知っておくべきiOSアプリのデプロイとかテスト周りの知識をメモる
他にもいろいろ方法あるかもしれない。
## firebase app distribution
– sandboxアプリやqaアプリなどのベータ版アプリのダウンロードはこれ経由で行う## test flight
– test flightが登録されたアプリを触って試すことができる
– (ややこしい登録なしで)課金も試すことができる
– testerとして招待してもらうことが必要
モーダル遷移
###ストーリーボードによるモーダル遷移から、前の画面に戻る方法
“`swift
self?.dismiss(animated: true, completion: nil)
“`####ストーリーボードによるモーダル遷移から、2つ前の画面に戻る方法
“`swift
self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil)“`
classとstructについて【Swift】
# はじめに
`class`と`struct`の違いについて理解が薄かったので、備忘録としての投稿させていただきます。# `class`と`struct`の定義
### `struct`の場合
“`Swift
struct Human {
let name: String
let age: Int
}
“`### `class`の場合
“`Swift
struct Human {
let name: String
let age: Int
// プロパティを初期化しないと下記メッセージのように怒られます。
// Class ‘Human’ has no initializers
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
“`# `class`と`struct`の使い分け
#### 1. `class`と`struct`の大きな違い
* `struct`は値型(継承できない、内部
Xcode 12 + XcodegenでCycle Inside ______エラーでテストターゲットがビルド通らない問題
# 問題
“`
Cycle insideTests; building could produce unreliable results. This usually can be resolved by moving the shell script phase ‘[CP] Embed Pods Frameworks’ so that it runs before the build phase that depends on its outputs.
Cycle details:
→ Target ‘Tests’ has copy command from ‘/Applications/Xcode12.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/XCTAutomationSupport.framework’ to ‘ /Library/Developer/Xcode/Derived
PRPreviewViewControllerの再生が一回しかできない
ReplayKitでの画面収録をプレビューするPRPreviewView。
再生ボタンが最初の1回しか表示されない、と思ったら、モーダル表示した時に、再生・停止ボタンとActivityボタンが画面の下に切れてしまっていた。
フルスクリーンでモーダル表示すると、全部表示されます。“`swift
let sharedRecorder = RPScreenRecorder.shared()……….
sharedRecorder.stopRecording(handler: { (previewViewController, error) in
previewViewController?.previewControllerDelegate = self
previewViewController?.modalPresentationStyle = .overFullScreen // このラインをプラス
self.present(previewViewController!, animated: true) {
}
})
“`?
【第5回】初心者二人で0から麻雀アプリ開発
[第4回はこちら](https://qiita.com/dashun814/items/ab4f7b668fb12cacd2f8)
#改版履歴
2020/11/26 投稿#第5回会議(2020年11月23日)
今回はいよいよ実装!……に入るための勉強会を実施しました。
これまでは個々に情報収集、学習を行なってきましたが、今回以降は足並みを揃える+毎週の学習時間確保を目的として、定例会議の場で学習した内容の共有をして行く予定です。###議題
– プロジェクトの立ち上げ
– ヘッダー・フッター表示
– テーブル表示#形式
今回は最初の勉強会でしたので、どんな形式で、どのように進行したかを残しておこうと思います。####使用したツール
– google meet
– google スライド
– Xcode####事前準備
1. お互いに学習テーマを決める
2. 一週間の間にテーマの調査・実装を行い、スライドにまとめる####当日
1. 順番にスライド発表
2. 質疑応答
3. 課題点整理
4. 次回のテーマ決定#勉強会
結論から言うと、実装について
[iOS13]DeprecatedになったkeyWindowの取得方法
# 環境
– Xcode 12.1
– Swift 5.3# 概要
`UIApplication` のプロパティである `KeyWindow` が
iOS13.0でDeprecatedになっていたので取得方法を修正する必要があります。
[Apple公式ドキュメント – keyWindow](https://developer.apple.com/documentation/uikit/uiapplication/1622924-keywindow)(今更ですが)
# 取得方法
### 修正前
“`swift
UIApplication.shared.keyWindow
“`### 修正後
“`swift
UIApplication.shared.windows.first { $0.isKeyWindow }
“`参照: [stack overflow](https://stackoverflow.com/questions/57134259/how-to-resolve-keywindow-was-deprecated-in-ios-13-0)
CoreMLモデルのサイズを小さくする量子化でモデルの精度はどう変わるのか
モバイルに載せるなら、モデルのサイズは小さいほうがいいと思う。
量子化とは、重みパラメータを、例えばFloat_32からFloat_16にして早めの桁で切り上げるようにすること。**実際のモデルを量子化して、どれくらいサイズが小さくなるのか、精度はどう変わるのか、をやってみた。**
![スクリーンショット 2020-11-25 23.04.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/e8dd8d36-17b6-cb55-b97d-f093a4f3c5e9.png)deeplabv3のxeptionバックボーンバージョンでセマンティックセグメンテーションを比較(背景ぼかし)。
xeptionバックボーンのdeeplabv3のmlmodelのサイズは165.1MB。
MobileNetバックボーンだとModelが8.6MBなので、xeptionの方が精度はずっといいとはいえ、さすがにもうちょっと小さくしたいところ。#CoreMLModelの量子化の方法
“`shell
2020-11-25時点でMongoDB RealmをiOSで使う場合の注意点
## 経緯
いま、iOS/Android(おそらくWebも)対応予定のアプリをprivateで書いています。
クロスプラットフォームでデータを同期するようなアプリとなる予定なので、記事タイトルにある[MongoDB Realm](https://www.mongodb.com/realm)を利用することにしました。というような経緯で、MongoDB RealmをiOSアプリで導入しようとしたら、2020-11-25時点でいくつか注意する点があったので、メモがてら残しておきます。
## Be sure to select MongoDB version 4.4
見出しの通りなのですが、MongoDB Realmでは、MongoDB version 4.4(2020-11-25時点)である必要があります。MongoDBが2019年にRealmを買収したため、2020年頃にRealmとMongoDBを統合したサービスに刷新され、以下の構成でworkするようになっています。
![スクリーンショット 2020-11-25 20.39.07.png](https://qiita-ima
ProvisioningProfileの有効期限をチェックする
InHouse配布のiOSアプリは、ProvisioningProfileの有効期限が切れるとアプリが起動しなくなる。
アプリが起動しない状況を未然に防ぐため、
ProvisioningProfileの有効期限をチェックする機構を検討した。# 前提条件
– ProvisioningProfileはFastlane Matchで管理されていること# 仕組み
主にFastlaneを利用する。
1. Fastlane MatchにてProvisioningProfileを取得する
2. OpenSSLにてProvisioningProfileをデコードし、Plistファイルを得る
3. Plistファイルから有効期限を取得する# サンプル
Fastlaneにて有効期限をチェックするサンプル“`Ruby
lane :check_provisioningprofile do
# Fastlane MatchにてProvisioningProfileを取得する
match(
readonly: true,
git_url: #{matc
[Swift5]containsを使って特定の文字列を検索する方法
## containsメソッドとは
文字列の中にある特定の文字列を検索するメソッドです。“`
contains(“検索したい文字列”)
“`## 実用例
“`.swift
var firstText = “2020年日本一はソフトバンク”
var secondText = “2021年は阪神タイガースが優勝”
var thirdText = “baseball”if firstText.contains(“ソフトバンク”) { //true
print(“含まれているので呼ばれる”)
}if secondText.contains(“巨人”) { //false
print(“含まれていないので呼ばれない”)
}//以下、lowercased()で大文字小文字を無視して検索
if thirdText.contains(“BaseBall”.lowercased()) { //true
print(“含まれているので呼ばれる”)
}if thirdText.contains(“Soccer”.lowercased()) { //false