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

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

【Unity】ビルドせずに実機デバッグできるAR Foundation Editor Remote

#AR Foundation Editor Remoteについて
[Asset Store](https://assetstore.unity.com/packages/tools/utilities/ar-foundation-editor-remote-168773)

公式ドキュメントを元にして、iOSで使う場合について説明します。

ARCompanionアプリをビルドしてiPhoneにインストールすると、iPhoneとPCでカメラの情報を通信できるようになり、UnityのGameSceneで確認ができるというものです。

##自分の環境
Unity 2019.4.1f1
ARFoundation 3.0.1
ARKit XR Plugin 3.0.1

Macbook Pro 13 2017 Mid メモリ8GB
MacOS 10.14.6

iPhone XS
iOS 13.6

#使い方
##推奨環境
ARFoundation 3.0.1
ARKit XR Plugin 3.0.1

iOSのフェイストラッキングを有効にするには、パッケージマネージャ経由でARKit

元記事を表示

Docker で CocoaPods のバージョン管理をする

rbenv や Bundler を用いてCocoaPods のバージョン管理しているチームは多いと思います。
以下は rbenv と Bundler を使い Ruby と CocoaPods のバージョンを管理する例です。
Ruby のバージョンを 2.7.1, Bundler のバージョンを 2.1.4, CocoaPods のバージョンを 1.9.2 に固定しています。

“`bash
$ brew install rbenv ruby-build
$ rbenv install 2.7.1
$ gem install bundler -v 2.1.4
$ bundle config set path vendor/bundle
$ bundle _2.1.4_ install
$ bundle exec pod install
“`

“`:.ruby-version
2.7.1
“`

“`Ruby:Gemfile
source “https://rubygems.org”

git_source(:github) {|repo_name| “https://gith

元記事を表示

メモ:AndroidのWebにもアプリのスマートバナーを表示

この記事は
===

* スマートバナー(スマホブラウザで画面の上の方にアプリインストールを促すバナー)をiOSに加えてAndroidも含めて表示したかったので、そのメモです

やりたかったこと
===

* スマートバナーはiOSだと[Safariが標準対応](https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/PromotingAppswithAppBanners/PromotingAppswithAppBanners.html)していて、metaタグを書くだけでいい感じにしてくれます
* それをAndroidでもやりたかったです
* でも標準では非対応なのでJSで個別に対応する必要があり
* 仕様上は[PWA仕様の一部に含まれてる](https://developers.google.com/web/fundamentals/app-install-banners/native)ので試してみたけど、今はまだ動かな

元記事を表示

SwiftLint 0.40.0 で追加された computed_accessors_order に対応する

![SwiftLint-0.40.0 or later](https://img.shields.io/badge/SwiftLint-0.40.0 or later-brightgreen) ![Xcode-11.6](https://img.shields.io/badge/Xcode-11.6-brightgreen) ![Last Modified-2020/09/01](https://img.shields.io/badge/Last Modified-2020/09/01-brightgreen)

# はじめに

先日、SwiftLintを0.40.1にアップデートしたところ、次のwarningが大量に出るようになったので対応方法をまとめました。

> Computed Accessors Order Violation: Computed properties should declare first the getter and then the setter. (computed_accessors_order)

# 原因

SwiftLint 0.40.0で

元記事を表示

URLSessionでSSLエラーが起きた時にSafariと同様にアクセスできるようにする

# 要約
`SecTrust` を使って、SSLエラーへの対処を行います。

# 概要
Safariでブラウジングしていると、サイトによって「接続はプライベートはありません」と表示される場合があります。

![接続はプライベートはありません 2020-08-31 22.58.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62305/33a4bbc5-b7e9-b2f5-f726-97b5401bf42b.png)
これに対し、「詳細を表示」→「このWebサイトを閲覧」とすることにより、**ユーザーの責任で**サイトを閲覧できます。
これをURLSessionでも行いたいと思います。

## Info.plistの設定
Info.plistに`App Transport Security Settings`の設定をする必要があります。
`Exception Domains` → 目的のドメイン → `NSExceptionAllowsInsecureHTTPLoads` をYESに設定します。
今回

元記事を表示

iOSのSafariで上方向の無限スクロールの問題を解決する

# はじめに
LINEやSlackのような `上方向への無限スクロール` が必要なWebアプリを作っていて、なぜか **iOSのSafariだけうまく動作しない** 問題に悩まされたので、原因とどう解決したかメモしておきます。
`Vue.js`を使っていますが`Vue.js`以外でも使えるテクニックです。

同じ事象で悩んでいる方の参考になれば幸いです。

# 上方向の無限スクロールでやっていること
そもそも無限スクロールとは **コンテンツの端の方までスクロールしたら次のページを読み込みコンテンツに追加する** という処理を繰り返すことで実現します。
下方向への無限スクロールの場合はこれだけです。

これが、上方向の無限スクロールの場合、次のページを追加する位置がコンテンツの先頭になるため、**追加する前のスクロール位置に戻す**必要があります。

イメージで説明すると・・・

1. 1ページ目を上端までスクロールする。
![iPhone上スクロール-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/

元記事を表示

はじめての ReactorKit【概要編】

iOS で Flux アーキテクチャの恩恵を受け、リアクティブかつ一方向のデータフローをサポートするための Framework で、これによって **シンプル**で**処理を追いやすく**かつ、**Testable**なアプリ設計を構築することができるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292456/f604246f-d392-60cb-2f17-c3f3c997dede.png)

### ReactorKit の恩恵

– Testability
– ビジネスロジックを View から完全に分離することで、`View` と `Reactor` をそれぞれテストすることが可能になります。

– Start Small
– ReactorKit はアプリ全体に単一のアーキテクチャを適用する必要がなく、最小で1ViewController からアーキテクチャを導入できるため、プロジェクトの途中から導入する場合でも細かいステップを踏んでいくことがで

元記事を表示

StoryboardからSwiftUIで作ったUIを呼び出す方法

#はじめに
どうも@chan_kakuです
今回はタイトルにもあるようにStoryboardからSwiftUIを呼び出す方法を紹介していこと思います。
アプリの内容としてはボタンを押したらSwiftUIで作ったUIが出てくるような簡単な構成にしたいと思います。

*注意
– 普段まったくSwiftを書いてないので間違ってることがあると思いますのでご容赦ください
– SwiftUIの使い方自体はこちらの記事では説明しません

#動機
ハッカソンに出る機会があり、iOS向けのアプリを作るということになりました。そこでSwiftの勉強をしていたのですが、前から耳にしていたSwiftUIがちょっと気になっていたので、SwiftUIの勉強をしてました。
しかしながら、SwiftUIはiOS13以上の端末でしか利用できないということで今後StoryboardからSwiftUIに移行していく時代がきたときにこういった使い方をしていくんじゃないかということでこのような記事を書いた次第です。
また、SwiftUI自体の記事は結構あるのですが、今回のユースケースの記事で日本語のものが全然なかった&初心者の

元記事を表示

【Flutter】TextFormField タップ時にピッカー(ドラムロール)を出して入力させる

![Flutter-1.20.2](https://img.shields.io/badge/Flutter-1.20.2-blue) ![Dart-2.9.1](https://img.shields.io/badge/Dart-2.9.1-blue)

フォームを作成するとき [TextFormField](https://api.flutter.dev/flutter/material/TextFormField-class.html) を用いて実装することが多いですが、キーボードによるテキスト入力ではなく、選択肢から選ばせたい場合があります。
独自のウィジェットを作成しても良いですが、 TextFormField として実装することで、他の TextFormField と同じように `onSave()` を処理したり、バリデーションを適応することができます。

「テキストフィールドをタップすると、ピッカー(ドラムロール)が表示され、選択したものがフォームに入力される」というものを実装します。

まず普通のテキストフィールドを作成します。

“`main.dart
Text

元記事を表示

Flutter環境構築(MacOS Catalina)

初めてのFlutter環境構築(MacOS Catalina)

まえがき

こんにちははじめまして。アウトプットと後学のためにこれからQiitaを書いていこうと思います。
初めての今回はFlutter環境構築の話です。
たくさんの方が同じような記事を書いてますがご容赦ください。

やったこと

参考にしたのはFluutter公式とこちらのQiitaの記事です。
https://qiita.com/_asa08_/items/b321c0c76719cfebf774

以下のFlutter公式サイトからzipをDLします。
https://flutter.dev/docs/get-started/install/macos

DLしたらファイルを解凍し任意の場所に置きます。
(私はdeveloperフォルダを作りその下に作成しました。)

ターミナルでPATHを通します。

“`
$ export PATH=”/Users/ユーザー名/developer/flutter/bin”
“`

そしてここからがかなり苦戦しました。

fl

元記事を表示

【Swift】範囲型について

###1.はじめに

今回は基本的なデータ型の1つである、範囲型についての説明と、使い方を解説していきます。(もう1つの基本的なデータ型であるストライド型については次回の記事で解説します。)

###2.範囲型とは

まずSwiftには**範囲演算子**というものがあり、「A..

A..<B
Range<Int>
Rang

元記事を表示

[iOS]LicensePlistの使い方

## 概要

ライブラリを使用することは開発においてほぼ必須となっているが、そのライブラリのライセンスをアプリで表示したいことがある。大したことない作業のようだが、手動でコピペでやると面倒な上、ライブラリの追加・更新ごとに作業が必要となってしまう。

この問題を解決するため、LicensePlist というiOSアプリ利用ライブラリのライセンス一覧を生成するmono氏の便利なツールがある。使い方をメモとして記載する。

場所 https://medium.com/swift-column/license-plist-c0363a008c67

## 準備

本ライブラリの標準的な使い方となる。

CocoaPodを使う場合、以下のようにLicencePlistを導入する

“`
pod ‘LicensePlist’
“`

もしくは、Homebrewを使い導入する

“`
$ brew install mono0926/license-plist/license-plist
“`

## iOSの「設定」アプリでライセンスを表示したい

mono氏が推奨する通り、XcodeのT

元記事を表示

Firebase Crashlyticsに不足しているdSYMをアップロードする

Firebase Crashlyticsに不足しているdSYMをローカルマシンからアップロードする方法です。

基本的に[こちら](https://firebase.google.com/docs/crashlytics/get-deobfuscated-reports?platform=ios&authuser=0)に書いてある手順を参考にしています。

## 不足しているdSYMを探す

“`.sh
mdfind -name .dSYM | while read -r line; do dwarfdump -u “$line”; done | grep
“`

不足しているdSYMのUUIDはFirebase CrashlyticsのdSYMの欄から探すことができます

![スクリーンショット 2020-08-31 11.30.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117503/d37864f4-9140-b0b5-a756-358e6129538c.png

元記事を表示

Xcode tamplates の作り方

#### 一言で言うと

`~/Library/Developer/Xcode/Templates/File Templates`にテンプレートファイルを置いておくと、Xcodeでファイルを新規作成する時使える。

#### Clean Architecture用のテンプレートファイル
https://medium.com/swift2go/installing-the-clean-swift-template-in-xcode-6b4367006827

#### テンプレートファイル作成法
https://medium.com/@popcornomnom/swift-tutorial-how-to-create-own-xcode-file-template-for-ios-and-macos-d2e535ed62c5
https://help.apple.com/xcode/mac/9.0/index.html?localePath=en.lproj#/dev7fe737ce0

元記事を表示

Swift で日本語を含む URL を扱う

日本語を含む文字列を URL に変換する時に値が nil になることがあると思います。これは、URI において使用できない文字列を URL として変換しようとしている時に発生します。Google などの検索バーでは、このような使用できない文字列を自動で[パーセントエンコーディング](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%BC%E3%82%BB%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0)しているので正常に検索を行うことができます。自分もたまに、エンコーディングを忘れてしまうのでこれを機に気をつけて行こうかと思います。

### 文字列をエンコード

今回は楽天市場の商品 URL を取得するという設定でエンコーディングを行っていきます。

“`swift
let itemString = “スコーピオン”
let itemEncodeString = itemString.addingPercent

元記事を表示

UITableViewにUIButtonを追加する

UITableViewの追加方法と、Cellにボタンを追加する方法を記載します。

# UITableViewの作成

UITableView(frame: CGRect, style: UITableView.Style)でUITableViewを作成します。
CGRect(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat)でテーブルのサイズを指定し、
self.view.addSubview()でテーブルを画面に追加します、

“` swift:
var tableView: UITableView = UITableView()

override func viewDidLoad() {
super.viewDidLoad()

// 画面の横の長さ
let width = self.view.frame.size.width
// 画面の縦の長さ
let height = self.view.frame.size.height

tableView =

元記事を表示

謎のinsertArrangedSubviewでクラッシュする問題

筆者が開発しているiOSのアプリで、App Store Connect経由でクラッシュログが繰り返し送られてくるものの、再現方法も解決方法もずっと謎であった不具合が解決したのでメモとして残しておきます。

## 問題の内容

送られてくるクラッシュログは以下のようなものでした。

“`
Last Exception Backtrace:
0 CoreFoundation 0x18d2d75b4 __exceptionPreprocess + 220 (NSException.m:199)
1 libobjc.A.dylib 0x1a12c742c objc_exception_throw + 60 (objc-exception.mm:565)
2 CoreFoundation 0x18d1d3aac +[NSException raise:format:] + 112 (NSException.m:155)
3 UIKitCore

元記事を表示

UITableViewのinsertRows()でEXC_BAD_ACCESSが発生した件

筆者が開発しているiOSのアプリで、App Store Connect経由でクラッシュログが繰り返し送られてくるものの、再現方法も解決方法もずっと謎であった不具合が解決したのでメモとして残しておきます。

## 問題の内容

送られてくるクラッシュログは以下のようなものでした。

“`
Thread 0 name:
Thread 0 Crashed:
0 UIKitCore 0x000000018fde4bd0 __46-[UITableView _updateWithItems:updateSupport:]_block_invoke + 60 (UITableView.m:3826)
1 UIKitCore 0x000000018fde4bd0 __46-[UITableView _updateWithItems:updateSupport:]_block_invoke + 60 (UITableView.m:3826)
2 UIKitCore

元記事を表示

[Xcode] [Swift] 実務的Tips: Unwind Segueで2つ以上前の画面に一気に戻って画面を再更新する

今日からでもすぐに取り入れられて、

– コードをよりクリーンにできる、とか
– 工数を削減できる、とか

そんなTipsを紹介していく記事シリーズです。
「知らなかった」「気づかなかった」「忘れていた」そんな誰かの役に立てば幸いです。

# 前提環境

– Xcode 11.3.1
– Swift 5.1.3

# Unwind segue

## 概要・使い所

– **2つ以上前の画面に一気に戻りたい時。**
– **特に、戻り先の画面にて、画面更新などの処理を行いたい時に便利。**

## 手順

例えば、こんな感じのStroyboardがあるとします。
![スクリーンショット 2020-08-29 9.58.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/7969ac15-d86a-d4c5-beb5-1567ff7e96dd.png)

– FirstViewController > SecondViewController はpush遷移です。
– SecondViewC

元記事を表示

[Swift] 実務的Tips: Initialization Closureを使ってオブジェクトの初期化コードをリーダブルにする

今日からでもすぐに取り入れられて、

– コードをよりクリーンにできる、とか
– 工数を削減できる、とか

そんなTipsを紹介していく記事シリーズです。
「知らなかった」「気づかなかった」「忘れていた」そんな誰かの役に立てば幸いです。

# 前提環境

– Xcode 11.3.1
– Swift 5.1.3

# Initialization Closure

## 概要・使い所

プロパティが属する型が初期化されるたびに、クロージャーが呼び出され、その戻り値がプロパティのデフォルト値として割り当てられます。

特に、UIをコードで構築する場合に効果を発揮します。
プロパティの宣言部分に初期化のためのコードを集約できるため、見通しが良くなります。

“`swift
class ViewController: UIViewController {
private let label: UILabel = {
let l = UILabel()
l.translatesAutoresizingMaskIntoConstraints = fals

元記事を表示

OTHERカテゴリの最新記事