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

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

【SwiftUI】RPGにあるような攻撃エフェクトを再現してみたい!

#はじめに
こんにちは!@kanato4です。

仕事ではJavaがメインなのですが、プライベートではSwiftを勉強している若輩者です。ただ、Swiftははじめて間もないので基本的な文法しか分かりません。これからもっと知識をつける予定です。

さて、そんなSwift初心者の私ですが、何を思ったのか「思いきってSwiftUIを使って遊んでみよう!」と考えたわけです。

SwiftUIは2019年に発表されたフレームワークなのですが、従来のSwiftの書き方とかなり違ってくるという話だったので、「やっぱこれからiPhoneアプリ作るなら知っておかないとね☆」と挑戦したわけですが、案の定苦労しました。。

今回はそんな私がはじめてSwiftUIで作れた成果物?を折角なら見てもらいたいなぁと思い記事にしました。アウトプット大事!

#完成したもの
まずは完成したものを見てやってください。
[![Image from Gyazo](https://i.gyazo.com/57f8330a06cfc6de680a0906e2f9e727.gif)](https://gyazo.com/57f83

元記事を表示

アクセス修飾子まとめ【Swift】

# はじめに
コードを書く際にあまり意識していなかったのと、理解が曖昧だったので備忘録として投稿します。

# アクセス修飾子とは?
アクセス修飾子とは、クラスや関数等にアクセス制限を設けるために利用します。

## internal
* 同じモジュール内であればアクセスすることができる。

#### モジュールとは
モジュールとは`import`して読み込んで利用する`Framework`を作成するための仕組み。

## private
* 一番制約の厳しいアクセス修飾子。
* 同じファイル内からのアクセスのみ許可されている。
* クラス単位ではなく、ファイル単位のアクセス制御であることに注意がいる。( Swift4から`extension`で`private`プロパティにアクセスできるようになった。)

## fileprivate
* 同じファイル内からのアクセスのみ許可されている。

## public
* 別のモジュールからでもアクセスできる。
* 継承やオーバーライドが不可能

## open
* 別のモジュールからでもアクセスできる。
* 継承やオーバーライド

元記事を表示

Flutter実装時にお世話になったページ 2020/11/18

## なにか

毎回、同じ問題に、同じ検索して、同じページで解決してるので。。。

## ContainerのBottomにだけ、枠線を入れたかった

[Stack Overflow “How to add a border to a widget in Flutter?”](https://stackoverflow.com/a/53680045)

## url_launcherでカスタムURLスキーマを使用したアプリ起動ができなかった(Android)

AndroidManifestまで意識が行かなかった。。。

[Stack Overflow “[url_launcher] When targeting API 30, canLaunch always retrurns false”](https://github.com/flutter/flutter/issues/63727#issuecomment-691066239)

## flutter upgradeしたら、ビルド通らなくなった。。。

こんなエラーが出るようになりました。

“`
Flutter Row()

元記事を表示

iOSの言語設定を取得するベストプラクティス(Swift)

## はじめに

iOSの言語設定を取得するベストプラクティスを紹介します。

## 環境

### PC

– OS:macOS Big Sur 11.0.1
– Xcode:12.2 (12B45b)
– Swift:5.3.1

### シミュレータ

– 機種:iPhone SE (2nd generation)
– OS:iOS 14.2

## 結論

– アプリがローカライズされていない
– `Locale.current` ではうまく取得できないので、 `Locale.preferredLanguages` から `Locale` を生成し直す
– アプリがローカライズされている
– アプリ単位で優先する言語を指定できるので、「おまけ」に書いたようにローカライズの設定を使うのがベター
– OS単位の言語設定を取得したい場合は、ローカライズされていないときと同様の方法でいい

## 言語設定の取得を試す

結論に至るまでにいろいろ試したので、過程を紹介します。

__PREFERRED LANGUAGE ORDER(使用する言語の優先順序): English

元記事を表示

カプセル化について

##カプセル化とは
データとメソッドを1つのオブジェクトにまとめてその内容を隠蔽すること!だそうです。
オブジェクト外から直接アクセスすることを出来なくして、不正なアクセス・意図しない変更から守ることができるのです!

##オブジェクト指向の1種
オブジェクト指向の構成要素3つのうちの1つになるそうです。
構成要素は以下の3つです。

+ 継承
+ カプセル化
+ ポリモーフィズム

##カプセル化するには?
データを保護することがカプセル化です。
その保護をするために、アクセス修飾子と言うものを使ってアクセスを制限していきます。

##アクセス修飾子
アクセス修飾子には制限の範囲に合わせて使うものが変わってきます。
以下が一覧になります。
私も使いこなせているわけではないですが。(privateしか使ったことありません)
カプセル化ではprivateを使用します。

+ open モジュール外からもアクセスできる。
+ public モジュール外からもアクセスできる。 サブクラス化されない。 overrideできない。
+ internal モジュール内ならアクセ

元記事を表示

Mac M1(Apple Silicon)でhomebrewをインストールできるの?

## Rosettaを使用しないとまだ使えない

現状、ターミナルからhomebrewをインストールしようとするとこのような出力が表示されます。

“`bash
$ /bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)”

Homebrew is not (yet) supported on ARM processors!
Rerun the Homebrew installer under Rosetta 2.
If you really know what you are doing and are prepared for a very broken experience you can use another installation option for installing on ARM:
https://docs.brew.sh/Installation
“`

出力通り、Rossetaを経由しないとダメみたいですね。

##

元記事を表示

UIPanGestureRecognizer(パン)とUISwipeGestureRecognizer(スワイプ)をいっしょに使う

同じviewにパンとスワイプを同時に与えると、パンしか効かなくなる。
素早くスワイプした時だけスワイプを発火してそれ以外の時はパンするコードがこちら。
基本PanGestureで、Pan速度が一定を超えた時だけSwipeになります。
[スタックオーバーフローの記事の引用です。元記事には実際のジェスチャアニメーションの様子があります。](https://stackoverflow.com/questions/4875255/is-there-any-priority-condition-between-gesture-methods-pan-gesture-and-swipe-g/48235812#48235812)

“`swift
let minHeight: CGFloat = 100
let maxHeight: CGFloat = 700
let swipeVelocity: CGFloat = 500
var previousTranslationY: CGFloat = 0

@objc func didPan(_ sender: Any) {

guard let pa

元記事を表示

Self-Sizing(Auto Layoutによる高さの自動調整)機能について

##はじめに
この機能を知るきっかけとなったのは、セルのimageViewを誤って大きくしてしまったことでした。
オレンジが変更箇所になってます。この結果、チェックマークが表示された時にCellが縦に大きくなると言う現象が起きました。
この件を相談すると、Self-Sizingという機能が元々備わっていて、セルの表示に影響が出たと分かりました。
![スクリーンショット 2020-11-17 20.27.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755375/aa1b3555-0eaf-a2dc-3de3-d2621e082281.png)

##Self-Sizingとは
タイトルにもある通り、セルなどの高さを自動で調整してくれる機能です。
Xcode 9(iOS 11 SDK)でデフォルトになったみたいです。それ以前はコードで表示しなければいけなかったみたいです。
私はデフォルトになってからswiftの勉強を始めたので気にしたこともなかったです。

##最後に
今回の件は、
そりゃ、セルの

元記事を表示

【SwiftUI】Mapkitから取得した情報をFirebaseに保存する

# はじめに
SwiftUIでMapkitとFirebaseを使用し、位置情報をデータベースに保存することを目的とする。
前回記事までにSwiftUIで取得した現在地から逆ジオコーディングし、都道府県名と市区町村名を取得するところまでを記載した。
今回は取得した情報をFirebaseに保存するところを記載する。
Mapkitを使った逆コーデイングについては前回記事を参考にしてください。

**参考記事**
[【SwiftUI】Mapkitを使った位置情報の取得と逆ジオコーデイング](https://qiita.com/m37335/items/a18c0e8979f76a5ad271)

# 開発環境
OSX 10.15.7 (Catalina)
Xcode 12.2.0
CocoaPods 1.10.0

# 本日の記事内容まとめ
1. Mapkitを使用して取得した位置情報をfirebaseに保存する。
2. ボタンを押したときにデータベースを更新できるようにする
3. 異なるView間でのデータのやり取りをできるようにする

# 今回記事で実装・更新したところ
今回記事で更新、

元記事を表示

Flutter実装時にお世話になったページ 2020/11/17

## なにか

毎回、同じ問題に、同じ検索して、同じページで解決してるので。。。

## TabBarViewのスワイプによる切り替えを無効にしたかった

[Stack Overflow “disable swiping tabs in TabBar flutter”](https://stackoverflow.com/a/51523272)

## Firebase の Cloud Messaging による通知がiOSで受け取れなかった

公式ドキュメントをちゃんと読めってことですね。
iOS Integration のステップ2で、以下を読み落としてたのと
> Don’t follow the steps named “Add Firebase SDK” and “Add initialization code” in the Firebase assistant.

Dart/Flutter Integration のここを実装せずにテストしてました。(Androidは無くても届く)

“`
import ‘package:firebase_messaging/fireba

元記事を表示

Xcode12 + SwiftPM + Firebase iOS SDKの注意点

### はじめに
Firebase iOS SDK も Swift Package Manager (SwiftPM) 向けの対応が進み、2020/8/25にリリースされた[v6.31.0](https://firebase.google.com/support/release-notes/ios#version_6310_-_august_25_2020) からβ版として提供され始めました。

[Swift Package Manager for Firebase Beta](https://github.com/firebase/firebase-ios-sdk/blob/master/SwiftPackageManager.md) に利用方法が掲載されており、とても簡単に SwiftPM で Firebase iOS SKD を組み込むことができます。

### Archive を処理する時の問題
ただ、アプリを Archive して Organizer で Distribute App や Validate App を実行すると次のようなエラーが発生してしまいます。

– Fo

元記事を表示

Swift4で同期通信をする

今回は、Swift4で同期HTTP通信を実現します。
使いどきはあまりイメージできておりませんが、書き換えチャレンジです。

# 参考にしたSwift2のコード

まず、Swift4で同期HTTP通信をするためにこちらのサイトを参考にしました。
サイトに掲載されていたSwift2のコードも、勉強のため載せておきます。

> [https://53ningen.com/synchronous-http-request-swift/](https://53ningen.com/synchronous-http-request-swift/)

“`Swift
public class HttpClientImpl {
private let session: NSURLSession
public init(config: NSURLSessionConfiguration? = nil) {
self.session = config.map { NSURLSession(configuration: $0) } ?? NSURLSession.shar

元記事を表示

子供用の学習アプリケーションを作る(2) アニメーション編

# はじめに
以前作成したアプリの続きをしていきます。
[参考: 子供用の学習アプリケーションを作る(1)](https://qiita.com/yoshii0110/items/ba2bf4023c4a6caf3431)

今回は、コンテンツの選択画面にアニメーションを導入し、選択後の詳細画面を作成したので、その実装について記事にしていこうと思います。

# 動作
まずは、動作を見ていただければと思います。

![test3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/8a3b3ed2-689d-83f3-3255-fd42bc6fbb4d.gif)

# 実装
## 構成
構成は以下のようになっています。

“`
❯ pwd
/Users/yoshitaka.koitabashi/Desktop/iLearn/src/components

~/Desktop/iLearn/src/components
❯ tree .
.
├── a

元記事を表示

Realm Databaseのバックアップとリストア

# Realm Databaseのバックアップとリストア
あまりRealmのバックアップとリストアについての記事が見つからないので投稿します。

### 環境
|環境|バージョン|
|—|—|
|Xcode|12.0|
|Swift|5|
|MacOS|Big Sur(11.0.1)|

### Libraryディレクトリ直下にバックアップ
`defaults.realm_bk_yyyy-MM-dd-hh-mm-ss`というファイル名で
現在のdefaults.realm(Realm Database本体)をバックアップします。

“`swift:Hoge.swift

private func hoge() {
do {
let url = try FileManager.default.url(for: .libraryDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let dateformater = DateFo

元記事を表示

[iOS] frameとboundsの違いを理解する

「frameとboundsの違いってなんやねん!」となったので調べました。

# そもそもframeとboundsは
UIViewのサブクラスが持っているプロパティ。CGRectを返す。

英単語の意味的には[Weblio英和辞書によると](https://ejje.weblio.jp/)
### frame
>a 窓枠.
b 額縁.
c 背景.
d (温床の)枠組み,フレーム,温床.
e (刺繍(ししゆう)などの)製作台,掛け枠.
f 複数形で(眼鏡の)枠,フレーム.
g (養蜂の取りはずし可能の)箱形のフレーム.

要するに”枠”という意味(?)

### bounds
>1境界,限界(内); 立ち入り許可区域.
2限度,範囲; 境界線,限界

という意味らしい

## CGRectとは
[公式ドキュメント](https://developer.apple.com/documentation/coregraphics/cgrect)によると
> A structure that contains the location and dimensions of a rectangle.

元記事を表示

【iOS】半強制アップデートの仕組みをカジュアルに実装する

# はじめに

この記事では、**アプリを起動したとき、新バージョンがリリースされていることをユーザに伝え、アップデートを促す仕組み(この記事では半強制アップデートと呼ぶ)**の実装方法を紹介します。

強制アップデートはゲームアプリなどでよく見る仕組みです。アップデートするまでアプリを利用できなくすることで、常に最新バージョンで動かすことができます。ただ、必ずしもユーザがアップデートできる通信環境にいるとは限らないため、すぐに使いたいという時に使えないのは不便です。そういった使い勝手の観点から、僕はアップデートを促すまでに留めた半強制くらいが好みです。

さて、ユーザにインストールされているアプリのバージョンに乖離が生じると、最新機能を提供できないのはもちろんのこと、既存機能を改修しづらくなってきます。例えば、DBのマイグレーションを何世代かに渡って行っているとき、バージョンが飛んでいると思わぬバグを踏んだりします。

ユーザには常に最新バージョンを使ってもらうのが望ましく、アップデートを促す仕組みは積極的に取り入れた方が良いと考えています。

# iTunes Search API

元記事を表示

FirebaseでiOSのプッシュ通知を実装

#始めに
iOS アプリでプッシュ通知機能を実装しようと思ったら、想定より苦戦したので、振り返ってみようと思います。
#Firebase プロジェクトを作成する
[Firebase コンソール](https://console.firebase.google.com/?hl=ja “Firebase コンソール”)で [プロジェクトを追加] をクリックし、 [プロジェクト名] を選択して、新しいプロジェクト名を入力します。
#アプリを Firebase に登録する
1. Firebase プロジェクトを作成したら、プロジェクトに iOS アプリを追加できます。
[Firebase コンソール](https://console.firebase.google.com/?hl=ja “Firebase コンソール”)から、 [プロジェクトページ] に移動して、中央にある iOS アイコンをクリックして設定ワークフローを起動します。
2. アプリのバンドル ID を [iOS バンドル ID] フィールドに入力します。このバンドル ID を探すには、 XCode でアプリを開き、最上位のディ

元記事を表示

[Swift5]複雑なJSONの解析をおこない、条件を満たす要素のindexを取得する方法

## はじめに
JSON解析についてわからない方はコチラ▼の記事を参考にしてください。

**[Swift5]ライブラリ ‘SwiftyJSON’ を使ってJSONから配列(個別)の情報を取得する**
https://qiita.com/nkekisasa222/items/84c40bbfacfaca9f38a9

## JSONデータの確認

“`joyCountArray.
[{
“document_tone” : {
“tones” : [
{
“tone_name” : “Joy”,
“score” : 0.53749899999999995,
“tone_id” : “joy”
}
]
}
}, {
“document_tone” : {
“tones” : [

]
},
“sentences_tone” : [
{
“tones” : [

],
“text” : “Kozai \”Aza\” Haru

元記事を表示

【SwiftUI】Mapkitを使った位置情報の取得と逆ジオコーデイング

# はじめに
SwiftUIでMapkitとFirebaseを使用し、位置情報をデータベースに保存することを目的とする。
今回はSwiftUIで取得した現在地から逆ジオコーディングし、都道府県名と市区町村名を取得するところまでを記載。
Mapkitを使って現在置を取得する方法は前回記事を参考にしてください。

**参考記事**
[【SwiftUI】Mapkitを使った位置情報の取得とピンの表示](https://qiita.com/m37335/items/4592f4fc40a1d2b7da05)

# 開発環境
OSX 10.15.7 (Catalina)
Xcode 12.0.1
CocoaPods 1.10.0

# 取得した現在地から逆ジオコーディングを実行する

追加するのは“`makeCoordinator“`の下部に“`title“`と“`subtitle“`を定義します。

“`swift:ContentView.swift
func makeCoordinator() -> mapView.Coordinator {

元記事を表示

Unity Device Simulator のインストール方法

##背景
Device Simulatorのインストール方法が変わったようなので、忘却録として。。。

##開発環境
PC:macOS Catalina
Unity:2020.1.10f1

##内容
「Unity Device Simulator インストール」で検索すると、
同じような検索結果が出てくる。
メニューのwindowからPackage ManagerをクリックするとPackage Managerのダイアログが表示される。
ダイアログのAdvancedからshow preview pakagesにチェックを入れて、Device Simulatorで検索すれば見つかる、、、が肝心のAdvancedがない。

調べてみると、Unity 2020.1以降からインストール方法が変わったらしい。(参考のUnity 日本語ヘルプデスクに書いてあります)

書いてある通りにやれば、無事インストールでき、GameタブにGameとSimulatorを選択できるようになる。
Safe Areaを表示したり、回転することもできる。

![スクリーンショット 2020-11-16 2.17.5

元記事を表示

OTHERカテゴリの最新記事