- 1. Ionic & golangでリアルタイム大喜利アプリを作りました
- 2. App Clipの設計と構築方法
- 3. キャプチャリストにおいて複数の変数に対して weak, unowned キーワードを付ける際の注意点
- 4. 手を動かして理解するCocoa MVCパターン
- 5. App Clipsをざっくり理解する
- 6. CocoaPodsで外部のライブラリの導入方法
- 7. Flutterで画像、カスタムフォントを使用する方法
- 8. FlutterでWeb,Android,iOSの3プラットフォームから同じコードでS3に写真をアップロードする
- 9. Unity で Automatically manage signing を行う
- 10. iOS アプリ起動時に “The Google Mobile Ads SDK was initialized without an application ID” で強制終了する場合に必要な対応
- 11. UITabBarController において選択されたタブに応じた処理をしたい時
- 12. [Swift] Date生成時にありえない日付のときはnilを返したい
- 13. NavigationLinkとList
- 14. iOSのExposureNotificationのAPIをサンプルアプリとドキュメントから見てみる
- 15. @IBDesignable を指定した View の中で Asset Catalog の内容を読み取るために必要なこと
- 16. iOS 開発初心者による Xcode におけるビルドの使い分け
- 17. UITextDocumentProxyのsetMarkedTextを(まだ)使ってはいけない。
- 18. 【Swift】 Color Setを使うときのちょっとした注意
- 19. MacでゼロからのFlutter環境構築
- 20. iOS MultipeerConnectivity Frameworkに必要なデレゲートメソッドたち 【Swift】
Ionic & golangでリアルタイム大喜利アプリを作りました
アプリのリリースまでなんとか漕ぎ着けたので、宣伝も兼ねて使ったフレームワークについて紹介します。
### どんなアプリか
写真で一言アプリです。
特徴的なのはリアルタイムで集まった人たちが、お互いに投稿し合ったボケを評価し合う部分です。マッチングした最大10名が、制限時間内に一つのお題写真に対してボケを投稿します。
投稿はお互いに評価することができ、一定数イイネを集めると一本獲得になります。こちらからダウンロード可能です。
よかったら遊んでみてください。android
https://play.google.com/store/apps/details?id=jp.co.popbits.funnyappios
https://apps.apple.com/jp/app/funny-one/id1515018792## アプリ側
### ionic
アプリのベースはIonic Frameworkで作成しました。
https://ionicframework.com/
ざっくりいうと、
webview + Angular
にネイティブっぽいリッチな見た目
App Clipの設計と構築方法
WWDC 2020の[Explore app clips](https://developer.apple.com/videos/play/wwdc2020/10174)を見たのでメモです。
※ここに出てくるスクリーンショットは、全て上記の動画のものです。
※App ClipのHIG概要はこちらから。App ClipのHIGを読んでいくぞ
■概要
App Clipはアプリをインストールすることなくタスクを実行できる軽量版アプリ。NFCタグをスキャンしたり、スマートアプリバナーなどから起動できる。https://t.co/xUjiYbmgXL
— akatsuki.kt/.java/.swift (@akatsuki174) June 26, 2020
# 概要
App Clipの設計と構築方法、App Clipと普通のアプリとの違いについて。
# App Clipとは何なのか
3つの概念を理解する必要がある。
![スクリーンショット 2020-06-29 8.35.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100736/d02fda44-eb05-b8fa-1026-2dbd210ccbdd.png)## アプリ
App Clipはあくまでもアプリの追加機能であり、App Clipを作るにはアプリの存在が必要に
キャプチャリストにおいて複数の変数に対して weak, unowned キーワードを付ける際の注意点
今回はトレイリングクロージャにおけるキャプチャリストについての気づきをシェアします!
小ネタですが、意識しないと気づかずメモリリークを起こす原因になるような注意点です!## 本題: 弱参照のつもりが、強参照に!?
ネットにあるコードを読んでいると、たまに、メモリリーク解消を目的とした弱参照を宣言するために、以下のような実装を見かけます。“`swift
alertController.addAction(UIAlertAction(title: “OK”, style: .default) { [weak self, alertController] _ in
“``[weak 変数1, 変数2]` のような実装になっていますね。
コードを読むと、どうやら `変数1` `変数2` ともに `weak` 属性にして弱参照にしたいようです。
が、この実装では **`変数2` が強参照になります**。もう一度申し上げます。
**`変数2` は強参照です**。## 対策
じゃあ、どうするか??
`[weak 変数1, weak 変数2]` とそれぞれの変数の前に `wea
手を動かして理解するCocoa MVCパターン
![cover](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71154/716e5f63-a947-64e9-9936-4d7e745792f6.png)
# はじめに
本記事ではiOSアプリ実装では最もよく用いられているであろうCocoa MVCパターンについて解説します。
巷ではクリーンアーキテクチャーはじめ様々なソフトウェアアーキテクチャーが出てきていますが、Swiftでアプリケーションを構築する上で余程大規模にならない限りは、Apple自体が推していることもあり、このCocoa MVCパターンを使うのが自分の経験上最もいいのではないかなと思います。ソフトウェアアーキテクチャーは本などで読むとふむふむなるほどと思うのですが、いざ実装しようとしてみると難しいことが多いです。
そこで今回は実際に非常に単純なアプリケーションを実装しながら**手を動かして理解する**ような構成にしています。
では早速始めていきましょう!# Cococa MVCパターンについてのイメージを掴む
何も知らない状態で手を動
App Clipsをざっくり理解する
WWDC20で発表された、App Clipsをざっくり理解するために要点をまとめています。
### 仕様・特徴
– ユーザーはアプリをインストールする必要なく、ネイティブアプリの一部を使用できる
– App Clipによって処理されるURLを使用する(ユニバーサルリンクに似ている)
– NFCタグ、QRコード、Smart App Banner、iMessageのリンク、Mapsから開くことができる
– App Clip URLはApp Store Connectを使用して登録する
– アプリとApp Clipの両方を含むビルドをApp Store Connectに配信すると、App Clip Configurationセクションが表示される
– 異なるエクスペリエンスには個別のURLを使用する
– URLはprefixの一致に基づいているため、すべての可能なApp Clip URLを登録する必要はない(クエリストリングやパスパラメータで柔軟に出来る)
– アプリがインストールされている場合アプリが優先、アプリがインストールされていない場合は、App Clipがダウンロードされる
–
CocoaPodsで外部のライブラリの導入方法
多くのプロジュエクトが外部のライブラリを使っています。
Githubからプロジェクトをダウンロードして、ライブラリの導入したり、インストールしたりする必要です。#### 必要のライブラリの導入方法
1.ターミナルでpodバージョンを確認
“`pod –version“`
バージョンが1.7.5より古い、またはpodがインストールしていない場合は下記のコマンドで更新またインストールします。“`
gem sources –remove https://rubygems.org/
gem sources –add https://gems.ruby-china.com/
//pod install
sudo gem install cocoapods -n /usr/local/bin
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
//update pod local library
pod setup
“`
2.プロジェクト関連のライブラリを追加します。
プロジュエクトが必要な
Flutterで画像、カスタムフォントを使用する方法
今回はFlutterアプリで画像とカスタムフォントを使用する方法を記述します。
## プロジェクトに画像とフォントを追加する
1. プロジェクト直下に`assets`フォルダを作成し、その直下に`images`と`fonts`フォルダを作成する。
2. 使用したい画像とフォントを各フォルダに格納する。## `pubspec.yaml`にパスを記述する
Flutterで画像やフォントを使用するには、`pubspec.yaml`にパスを記述する必要があります。“`pubspec.yaml
flutter:# The following line ensures that the Material Icons font is
# i
FlutterでWeb,Android,iOSの3プラットフォームから同じコードでS3に写真をアップロードする
##概要
6月にWeb向けのImagePickerが出ていたので、ネイティブアプリとブラウザアプリを同じソースコードでビルドして、どのデバイスでもファイルアップロード出来るのかというのを試しました。
AndroidとiOSに加えてWebでもPickerが同じ処理で使えるようになったのは結構画期的だなと思ってのメモです。内容はクライアント側に重点を置いています。### 1. パッケージをインポートする。
pubspec.yamlにimage_pickerとimage_picker_for_web、amazon_cognito_identity_dart_2を追加する。
私が試したバージョンは以下です。“`
image_picker: ^0.6.7
image_picker_for_web: ^0.1.0+1
amazon_cognito_identity_dart_2: ^0.1.14
“`### 2. 画像取得処理を書く。thenを使用してますが、awaitでも問題ありません。
“`
import ‘package:image_picker/image_picker
Unity で Automatically manage signing を行う
#はじめに
Unity & Xcode でビルドを作成する際に毎回忘れてしまう署名関連の備忘録として残しておこうと思います。
#Manual or Auto
『Certificates, Identifiers & Profiles』の署名関係のファイルなどを Xcode だけで出来るようになっています。
以前までは自前でポータルサイトにログインしてそれぞれのファイルを作成していましたが、今はそれが不要になっています。
エンタープライズ版の場合は * アスタリスクでどのアプリでも利用することができたのですが、今はそれを行う必要がなく Unity を利用する場合は Preferences と PlayerSettings に設定するだけです。#注意
**Automatically manage signing を行う場合にポータルで同じ Bundle ID のプロビジョニングプロファイルなどの作成はしないようにしてください。もし、同じ Bundle ID が存在すると競合してしまいエラーになります。**
#Unity 側の設定
Unity 側には二箇所設定する項目がありま
iOS アプリ起動時に “The Google Mobile Ads SDK was initialized without an application ID” で強制終了する場合に必要な対応
# 概要
iOS アプリ起動直後に以下のようなログを出力して強制終了する件について、原因と対応方法をまとめました。
“`
*** Terminating app due to uncaught exception ‘GADInvalidInitializationException’, reason: ‘The Google Mobile Ads SDK was initialized without an application ID. Google AdMob publishers, follow instructions at
https://googlemobileadssdk.page.link/admob-ios-update-plist to set a valid application ID. Google Ad Manager publishers, follow instructions at https://googlemobileadssdk.page.link/ad-manager-ios-update-plist.’
“`# 対応方法
ログ
UITabBarController において選択されたタブに応じた処理をしたい時
先日、 Google Analytics などのイベントトラッキング系の実装をしている時に、
「**選択されたタブのログを取りたい、ただし現在開いているタブは取らなくていい。**」という場面に出会いました。画面に依らない共通の処理だったので、それぞれの `ViewController` ではなく `UITabBarController` に書くことにしました。
簡単な実装かと思いきや、結構奥深い学びがあったので共有します。– バッドプラクティスとそれが悪い実装となる理由
– 最終的な実装例を紹介します。
**2020 年に Swift 始めたばかりの初心者なので、アドバイス・指摘待っています!!!**
## ざっくりとした結論
始めに、最終的に至った形を示しておきます。
後の理解を深めるためと、時間がない人のためです。1. `tabBar(_:didSelect:)` を使おう
2. 引数 `item` と `items` 配列でパターンマッチングしよう
3. `item.tag` を使った指定はバッドプラクティスになりがちなので、極力避けよう!これを読んで、「
[Swift] Date生成時にありえない日付のときはnilを返したい
## TL;DR
DateFormatterを使い `isLenient = false` に設定する。
“`swift
func makeDate(year: Int, month: Int, day: Int) -> Date? {
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .gregorian)
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.isLenient = false
formatter.dateFormat = “yyyy-MM-dd”
return formatter.date(from: String(format: “%d-%02d-%02d”, year, month, day))
}let date = makeDate(year: 2021, month: 2, day: 29)
// -> nil
“`## や
NavigationLinkとList
Discordの [swift-developers-japanサーバー](https://medium.com/swift-column/discord-ios-20d586e373c0) で興味深い話題があったので、気になって調べてみたものを雑にまとめました :slight_smile: (話題自体は [このへん](https://discordapp.com/channels/291054398077927425/585184753364238346/726002870708600849) から)
特に明記していない限り、Xcode 11.5とシミュレーター(iOS 13.5、iPhone SE (1st generation))で確認しています。SwiftUIは ~~まだ発展途上なので~~ 進化が早いので、しばらく経つとここに書いたものは全く意味をなさないゴミになってるかもしれませんが、むしろ早くそうなることを望んでいます :sweat_drops:
## NavigationLinkで遷移する前の画面はつながっている
まずは `NavigationLink` を使った
iOSのExposureNotificationのAPIをサンプルアプリとドキュメントから見てみる
# ExposureNotification概要
ExposureNotificationはCOVID-19への潜在的な曝露を人々に通知します。
ExposureNotificationの機能を実現するにはExposure Notification Serverの実装が必須です。# おことわり
実機ビルドするには [Exposure Notification Entitlement Request](https://developer.apple.com/contact/request/exposure-notification-entitlement)で申請する必要があり、ハードルが高いので、
あくまで、公式ドキュメントとサンプルアプリのシミュレータでの確認になっています。
大いに間違っている可能性があるので公式ドキュメントを正としてください。# 公式ドキュメント
https://developer.apple.com/documentation/exposurenotification# サンプルアプリ
https://developer.apple.com/docum
@IBDesignable を指定した View の中で Asset Catalog の内容を読み取るために必要なこと
# 概要
`@IBDesignable` を指定したカスタム View クラスの中で `UIColor` クラスのイニシャライザ `init(named:)` を呼び出す処理を書いておき、Interface Builder 内で、ある View Controller クラスの View にそのカスタム View クラスを 追加したところ、以下のようなビルドエラーが発生しました。
“`
IB Designables: Failed to render and update auto layout status for [View Controller のクラス名] ([Interface Builder 内での View Controller の Object ID]): The agent crashed
“`この問題の原因について調査したところ、 `@IBDesignable` を指定したカスタム View クラスの `prepareForInterfaceBuilder()` から呼び出される処理の中で Asset Catalog の内容を正しく読み出されないためである
iOS 開発初心者による Xcode におけるビルドの使い分け
iOS 開発者の皆さん、 **ビルド** 、してますか!? (当たり前)
ビルド待ちって筋トレしたくなるくらい暇な時間ですよね。ビルド待ちの間についつい Twitter や Slack 見てて、気づいたら夜だったなんてこともあったりなかったり。
僕は iOS 開発を初めて 2 ヶ月の初心者ですが、そんな僕から「**ビルドの使い分け**」をシェアしたいです。
最初は **⌘ + R** しか知らなかった僕ですが、今ではその他に **2 つのビルド方法** を使い分けています。## 本題
今日紹介するビルド方法は以下の 3 つです。
– ⌘ + R (`Run`)
– ⌘ + ⇧ + R (`Build for Running`)
– ⌘ + ⌃ + R (`Run without Building`)この 3 つがあれば、以下のような使い分けができます。
– `Run`: ビルドして、実機 or シミュレータで動作を確認したいとき
– `Build for Running`: ビルドだけして、動作確認はしないとき
– `Run without Building`: ビ
UITextDocumentProxyのsetMarkedTextを(まだ)使ってはいけない。
#概要
iOSのKeyboard Extensionを自作するとき、必ず触ることになるのが`UITextDocumentProxy`です。iOS13からは`setMarkedText(_:selectedRange)`というメソッドが追加され、これを使うことで標準の日本語キーボードのような「入力中のテキストの背景の色が変わる」挙動が実現できるように思われます。
実際、4月に複数のキーボードで調べたところでは2つのKeyboard Extension([flick](https://apps.apple.com/jp/app/flick-%E3%83%95%E3%83%AA%E3%83%83%E3%82%AF/id923138396)と[Flick SKK](https://apps.apple.com/jp/app/flickskk/id944678753))が`setMarkedText()`を用いていると思われる挙動を示していました。
#挙動の詳細
チェックした環境はiOS 13.5.1のiPhoneSE(第1世代・第2世代)です。![ezgif-6-0ef87aa099
【Swift】 Color Setを使うときのちょっとした注意
iOS11(Xcode9)からImage Setのように、色を定義することの出来るColor Setが実装され、Storyboard上での色管理の煩わしさから開放されました。
もちろん、コード上からも使うことが出来てとても便利なのですが、ちょっとした注意点があったので、備忘録として残しておこうかなと思いました。あるプロジェクトで遭遇したことなのですが、Storyboard上で定義したLabelで、コード上からAttributedTextで色を変更しようとしたときのことです。
iOS13で起動したときは確かに色が変わっていたはずなのに、iOS11や12の端末で起動してみると、### 色が変わらない
という現象が発生しました。
Great Scott!(BTTF大好き)と何度もつぶやきながら調べましたが、どうやら原因は「Storyboard上でColor Setを使用しているから」のようです。特にサイトを調べたりしたわけではなく、Storyboardをいじっていたら発見したことなので本当かは定かではありませんが、少なくともStoryboard上で該当LabelのtextCol
MacでゼロからのFlutter環境構築
ゼロからFlutterの開発環境を構築するには以下の3つの手順が必要です。
1. Flutterを導入する
2. Xcodeを設定する
3. Android Studioを設定する# Flutterを導入する
#### Flutterのインストール
[Flutter公式](https://flutter.dev/docs/get-started/install/macos)からインストーラーをダウンロードします。
ダウンロードした`zip`を解答して、`flutter`フォルダを任意の場所に置いてください。
私はアプリケーション直下に配置しました。#### コマンドの有効化
– flutterフォルダの中にある`flutter_console.bat`を実行します。
これでFlutter Consoleからflutterコマンドが使えるようになります。#### Pathを通す
`~/.bashrc`または`~/.bash_profile`に以下を記述する。“`console
$ export PATH=$PATH:/Applications/flutter/bin
iOS MultipeerConnectivity Frameworkに必要なデレゲートメソッドたち 【Swift】
# はじめに
MCBrowserViewControllerを使わないパターンでのMultipeerConnectivity適用に必要なデレゲートメソッドたちです。
– iOS 13.5
– Swift 5.2## 準備編
“`swift
class xxxxxController {let displayName: String!
let serviceType: String!
var peerID: MCPeerID!
var session: MCSession!
var browser: MCNearbyServiceBrowser!
var advertiser: MCNearbyServiceAdvertiser!func setup() {
displayName = “displayName”
serviceType = “serviceType”peerID = MCPeerID(displayName: displayName)