iOS関連のことを調べてみた2020年06月30日

iOS関連のことを調べてみた2020年06月30日
目次

Ionic & golangでリアルタイム大喜利アプリを作りました

アプリのリリースまでなんとか漕ぎ着けたので、宣伝も兼ねて使ったフレームワークについて紹介します。

### どんなアプリか

写真で一言アプリです。
特徴的なのはリアルタイムで集まった人たちが、お互いに投稿し合ったボケを評価し合う部分です。

マッチングした最大10名が、制限時間内に一つのお題写真に対してボケを投稿します。
投稿はお互いに評価することができ、一定数イイネを集めると一本獲得になります。

こちらからダウンロード可能です。
よかったら遊んでみてください。

android
https://play.google.com/store/apps/details?id=jp.co.popbits.funnyapp

ios
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の設計と構築方法、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. 使用したい画像とフォントを各フォルダに格納する。

スクリーンショット 2020-06-29 4.11.29.png

## `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)

元記事を表示

OTHERカテゴリの最新記事