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

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

既存のプロジェクトをMVPにして気づいた点、注意点

 
## はじめに

現場ではCocoaMVCだったのですが、まぁ今後のプロダクトでどのよーなアーキテクチャが良いか
比較して、実際に既存のプロダクトの1画面作り変えてみました。
実装→iOSチームでレビューの過程ででた所感や気づきを共有します。

MVP自体はネットにゴロゴロありますし、
MVP自体についてざっくり知りたい方はアーキテクチャ比較も投稿したのでよければ。

## ざっくり所感

– 各コンポーネントの役割が決まっているので、読みやすい。
– ユーザーの入力部分について(ViewController)とPresenter,Modelと作業分担しやすい。
ただ、作る際にある程度認識合わせ、ルールを考えておかないと実装漏れやコンフリクトのような問題が起きそう。

– ViewControllerの肥大化は抑えられるが、FatPresenterになってしまう恐れがある。
例)Presenterは画面遷移やViewの操作も全て行うのか。
  今回は全部行うようにしたが、「Delegate多すぎ」って意見もあったので。
– viewDidLoadなどのライフサイクルイベントもv

元記事を表示

【初心者向け】Googleが開発したFlutterとは?効率的に学習する方法もご紹介

皆様、こんにちは!フクロウと申します。
今回はGoogleが開発した、フリーでかつオープンソースのフレームワークであるFlutterについて、簡単にご紹介します。
#Flutter(フラッター)とは
使用言語:Dart
開発環境:Linux、Windows、macOS
開発ツール:Android Studio またはVisual Studio Code
Googleが開発したAndroid、iOS、WEBアプリの開発を行うことができるマルチプラットフォームに対応したフレームワークの名称
2018年12月4日に初の正式版「Flutter 1.0」のリリースが発表されたので、比較的新しいフレームワークと言えます。
WindowsとMacの両環境でAndroid/iOSの開発は可能だが、WindowsではAndroidしか実機テストやリリースはできないです。iOSの実機テストやリリースには、別途 Xcodeが必要になります。
### 開発においてのメリット
・WEB開発や、スマホアプリ開発では、複数の言語を学ぶ必要があるが、FlutterではDartを学ぶだけで開発が可能。(Javaやkot

元記事を表示

iOSレビュー時ノウハウ、コメント例

## 投稿理由、内容
自分自身の振り返りを含めて投稿します。
仕様の指摘、OS・言語としてのベストプラクティス、デグレやアップデート時の確認など
いろいろなレビュー時の観点があると多います。
今回の投稿ではiOS/Swiftで開発してのナレッジになります。

あと、SwiftLintとか入れると勉強になりますよね。٩( ‘ω’ )و

## 参考になったもの

今回2人体制での開発、相互レビューだったので教えてもらう部分もたくさんありつつ、以下の記事は観点と目的がまとまってたのでわかりやすかったです。
https://qiita.com/kkoide1332/items/4545bf8c2ffbfb05bb1f

## コメント例
その他実際に意識してた部分、レビュー時にコメントされた中でプロジェクト関係なく必要なものを以下にざっくりまとめました。

また、Swift、Cocoaフレームワーク限定の観点もありますので全部が全部ではないです。(get/setはjavaとか普通に使うし)

– 名前get/setつけない。
– BooLでis使う時には考える。意味がおかしくなるのが多い

元記事を表示

Push通知の証明書作ってみた in 最近

## はじめに
あんまり頻繁に作るものではないですが
業務で得た内容をこちらに残します。

## Push通知証明書って

iOSって証明書多いですよね。
ただ、developperサイトで一括管理できることは楽なのかも。

## p12ファイル作成手順

①デスクトップのLaunchpadをクリック

![20200725023041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701264/79657141-f03a-e554-be60-e9c026393428.png)

②Launchpadのその他をクリック

![20200725023045.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701264/d36faeba-8a7f-d966-882c-b7640d4131d8.png)

③その他をクリック

![20200725023058.png](https://qiita-image-stor

元記事を表示

CocoaPods Warning: ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES の対処法

`pod install` でいつものごとくライブラリをインストールすると下記のような警告がでました。

“`
[!] The `Hoge [Debug]` target overrides the `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` build setting defined in `Pods/Target Support Files/Pods-Hoge/Pods-Hoge.debug.xcconfig’. This can lead to problems with the CocoaPods installation
– Use the `$(inherited)` flag, or
– Remove the build settings from the target.
“`

警告文を見てみると、どうやら Target で指定してある `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` が `Pods-Hoge.debug.xcconfig`(Pods) で設定した値を上書きするので

元記事を表示

Android アプリ開発者がiOSアプリも開発したくなったので、とりあえずFlutterの導入をしてみた

## 概要
* Androidアプリの開発ばかりやっていたが、iOSアプリの開発も今後やっていきたい。
* Flutterを使用すれば、iOSアプリの開発も今後やっていけそうなので、調べていく。

## 想定している対象者
* Androidアプリの開発であれば経験はあり、iOSアプリの開発の開発もFlutterでやってみたいという方。

## Flutterとは
* Flutterとは Google 製のアプリケーションUI構築ツールキット。
* 構築出来るアプリ
* モバイルアプリ制作
* iOS
* Android
* Web
* デスクトップ向けのアプリケーション
* とくにモバイルアプリにおいては、単一のコードから iOS/Android の両方にビルドできる。
* Google によって『The best framework for developing beautiful experiences for any screen』をめざして開発が進められているフレームワーク。
* ※「技術的な垣根を超え一つのコー

元記事を表示

[Unity] AppStoreConnectへのUpload時のITMS-90809問題

# 概要
iOS AppをAppStoreConnectにアップロード後、審査結果で下記のような事由でリジェクト。
>ITMS-90809: Deprecated API Usage – New apps that use UIWebView are no longer accepted. Instead, use WKWebView for improved security and reliability. Learn more (https://developer.apple.com/documentation/uikit/uiwebview).

Deprecated(非推奨)扱いになった『UIWebView』というAPIの呼び出しが検知されたため、とのこと。

この記事を読んでいる方はUnityユーザの方が多いと思うので、基本的には直接UIWebViewを呼び出して使っているわけではなく、UIWebViewを利用するライブラリを利用しているものと思われます。

この記事ではそのライブラリの調査方法と、私が遭遇したケースにおける解決方法を記載します。
※調査方法はMaxユーザ向

元記事を表示

SandBoxをふんわり調べてみたよ。

## はじめに
サンドボックス備忘録。

iOSの**App Groups**について調べていく中で

– **サンドボックス**
– **Keychain sharing**
– **App Extentions**

の3つが結構な頻度で出てきました。
自分的によく分からないことだらけだったので見返せるように。
また、間違ったイメージで捉えているかもしれないので正してくれる方がいれば幸いです。

## 一般的なサンドボックス説明

以下、[「サンドボックスとは?セキュリティを向上の仕組みと弱点」](https://japan.norton.com/sandbox-9246)から引用

>サンドボックスを直訳すると、「砂場」という意味になります。
子供が安全に遊べるように砂場が設けられているのと同じように、
コンピューター上に砂場のような仮想空間を設け、
サンドボックス内での動作がサンドボックスの外側に影響を与えないようにする仕組みのことです。

ふーん。

外側に影響を与えない、外側から干渉できないってことなのでしょうか。
App Gropsではこのサンドボックス領域とは別

元記事を表示

結城先生のデザインパターンの本を買ったので勉強ノートを書いていく – ArrayやDictionaryを支えるIteratorパターン

# 教科書:Java言語で学ぶデザインパターン入門

「数学ガール」で有名な結城浩先生の「Java言語で学ぶデザインパターン入門[^1]」を購入しました[^2]。
せっかくの機会なので、普段使っているSwiftで実装しながら、勉強ノートを作っていこうと思います。
本記事は「第1章 Iterator 1つ1つ数え上げる」を参考に作成しました。

# Iteratorパターンの嬉しさがなんとなくわかってきた!

はじめてIteratorパターンに触れたとき(JavaScriptのIteratorでした)は、何が嬉しいのかまったくわかりませんでした。
今回、自分で手を動かして具体的に実装したり、Swiftの`Sequence`や`map`のソースコードを眺めているうちにIteratorパターンの嬉しさがなんとなく実感できた気がします。
同じような気持ちを抱いている方の参考になると嬉しいです!

# Iteratorパターンとは?

ArrayやDictionaryのように、何かの集まりの全体を順番にスキャンしていくときに使われるデザインパターンです。
少し長い引用になりますが、「Java言語

元記事を表示

[SwiftUI]Textの右寄せが難しい

このような`Text`の右寄せが意外と分かりにくく難しかった。

![スクリーンショット 2020-09-01 19.19.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297014/110e3f5b-d359-a74b-cd83-27d7f6f56adb.png)

## うまくいったコード

`Text`単体ではできませんでした。ZStackでラップして実現しました。

“`swift
struct ContentView: View {
var body: some View {
HStack(spacing: 16) {
ZStack {
Text(“タイトル”)
.frame(width: 120, alignment: .trailing)
.foregroundColor(.gray)

元記事を表示

UISegmentedControlのフォント色を変える

UISegmentedControlの文字色を変える際のメモです。
選択された状態の背景色の変更の記事は良く見かけたのですが、文字色を変える記事はあまりありませんでしたので、書きました。
iOS13以降で確認していますが、基本的にiOS11,12でも同じかと思います。

## 実装

“`swift

segment.setTitleTextAttributes([.foregroundColor: UIColor.red], for: .selected) //選択時の文字色
segment.setTitleTextAttributes([.foregroundColor: UIColor.gray], for: .normal) //非選択時の文字色

“`

`UISegmentedControl.setTitleTextAttributes` を使用して、選択状態によって色を変えて設定しました。
上記の例では、選択時には赤、日選択時にはグレーになります。

適用結果は以下のようになります。

![スクリーンショット 2020-09-01 12.19.58.png]

元記事を表示

Keychain sharingってよく聞くから調べた[2020]

## はじめに
キーチェーン備忘録。

iOSの**App Groups**について調べていく中で
– **Keychain sharing**
– **App Extentions**
– **サンドボックス**

の3つが結構な頻度で出てきました。
自分的によく分からないことだらけだったので利用の仕方とかまでは書きませんが見返せるように。
また、間違ったイメージで捉えているかもしれないので正してくれる方がいれば幸いです。

## Keychainとは何か

大まかにまとめると…

keychainは
パスワードや秘密鍵・公開鍵などの機密情報を安全に管理するための仕組み。
KeyChainで管理する情報は暗号化されています。
主にアカウント情報を扱うのに最適とされています。

ユーザの情報を保存する仕組みとして UserDefaults がありますが、
これは設定ファイルなどのプリファレンス情報を管理するための仕組みで
違いとしてはアプリが削除されてもデータが残るかどうか、が大きいですかね。
あとは、後で記述しますが同じKeychain Access Groupに属するアプリ同士

元記事を表示

iOSの画面輝度変更にハマった話

# はじめに
よくある画面表示中は輝度を最大にして非表示にしたら輝度戻して!っていう要望がきた!
そのときにちょっとハマったのでメモ。。。

# 輝度設定
輝度の変更には下記を使うらしい。

“`swift
var brightness: CGFloat { get set }
“`

[公式ドキュメント:brightness](https://developer.apple.com/documentation/uikit/uiscreen/1617830-brightness)

簡単やん!と思い下記のように実装してみた

“`swift
final class SecondViewController: UIViewController {

/// 元の輝度を保持
private let defaultScreenBrightness = UIScreen.main.brightness

override func viewDidLoad() {
super.viewDidLoad()

// Do any addi

元記事を表示

【iOS 14】正確な位置情報をOFF時にはジオフェンスが無効となる

本記事は公開情報を元に書いております。

## おおよその位置情報
>新しい設定により、正確な位置情報の代わりに、あなたのおおよその現在位置をアプリと共有するオプションを選べます。

参照:[iOS 14で登場する新機能](https://www.apple.com/jp/ios/ios-14-preview/features/)
位置情報がユーザーの権限設定で、正確な位置情報を提供するかおおよその位置情報を提供するか選択できるようになるようです。

## [accuracyAuthorization](https://developer.apple.com/documentation/corelocation/cllocationmanager/3600215-accuracyauthorization)の追加

`CLLocationManager`にaccuracyAuthorizationというプロパティが追加されます。`.fullAccuracy`と`.reducedAccuracy`の値が入る可能性があります。
>If the value of this property

元記事を表示

ios実機デバッグ時に、後からデバイスを追加する方法

タイトルについて1時間ほどハマったのでメモ。

# 背景
iPhoneで実機デバッグをしていたが、複数端末でデバッグする必要が出てきたので、iPadでも実機デバッグをしたかった。

# 環境
Flutter 1.20.2
Xcode 11.6

XcodeはAutomatically manage signingをオンにした状態

Flutter以外でも参考にはなると思います。

# 手順
## appleのdeveloperコンソールでデバイスを追加
[デバイス一覧ページ](https://developer.apple.com/account/resources/devices/list)よりデバイスを追加します。
Device ID (UDID)の取得方法は[appleのサポート](https://support.apple.com/ja-jp/HT204073#itunes)の記事が参考になります。

## 過去のProvisioning Profileを削除
ここが**つまりポイント**です。
XcodeはSigningを自動でしてくれる、Automatically man

元記事を表示

BitriseでCarthage + Xcode 12 betaを使用してビルドする

# エラー内容
– BitriseのCarthageステップにて以下のエラーが発生。

“`
Build Failed
Task failed with exit code 1:
/usr/bin/xcrun lipo -create

~~ 省略 ~~

This usually indicates that project itself failed to compile. Please check the xcodebuild log for more details: /var/folders/6q/wgy6jtp12w5gzgm9lzcglpqw0000gn/T/carthage-xcodebuild.50gMh8.log
Carthage command failed, error: exit status 1
“`

>Please check the xcodebuild log

と表示されていたのでログファイルを開くと、ファイルの最後には`Build Succeeded`と表示されていた。

?

# 調査
– どうやら同じような内容で困っている方がいるら

元記事を表示

[Swift]RootViewControllerでアニメーションつきの画面遷移

## はじめに
RootViewControllerを使ったアニメーションつきの画面遷移を簡単にまとめます
![RootViewController.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/cbdf4b41-307d-8198-f150-33997d887d7b.gif)

## Storyboard
![スクリーンショット 2020-09-01 12.48.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/51eba30e-e7bc-8abc-8e35-535d2619321e.png)

ViewControllerとSecondViewControllerを置いてるだけです。
StoryboardIDも設定しましょう。忘れるとクラッシュします。

## SceneDelegate
RootViewControllerの処理をAppDelegateに書いてる記事が多いですがiOS

元記事を表示

MVVMについて簡潔にまとめてみた

半分自分用のまとめです、iOSでの内容になります
覚えたてなので間違っている解釈があるかもです
その際はツッコミ頂けると嬉しいです

# MVVMとは

Model、View、ViewModelから構成され、現在のiOSアプリでは主流のアーキテクチャである

#構成図
![スクリーンショット 2020-09-01 12.17.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105496/ee180819-60ed-cb06-fb91-c813043892d7.png)

#構成要素

### View

UI部分で、iOSでいうとUIViewやUIViewControllerにあたる
ViewはViewModelを参照(監視)することができる

### ViewModel
大まかな役割が2つある

#### ・ViewとModelの仲介役
Modelは直接Viewへ干渉出来ない、Viewもまた直接Modelへ干渉することが出来ない
Viewとのやりとりは直接参照するのではなく、後述するデータバインデ

元記事を表示

【Xcode】Module compiled with Swift 5.x.x cannot be imported by the Swift 5.x compiler【Carthage】

複数のSwiftバージョンの違うXcodeをインストールした状態でアプリをビルドすると

“`
Module compiled with Swift 5.x.x cannot be imported by the Swift 5.x compiler
“`
のエラーが発生することがあります(xのところは具体的なバージョン)。これはCarthageのモジュールとXcodeでビルドしようとしているもののSwiftバージョンが異なりますというエラーです。
その場合はCarthageのビルドを使いたいXcodeのSwiftバージョンに合わせなければなりません。
その際は`xcode-select`コマンドを使います。

“`
sudo xcode-select -switch /Applications/Xcode-beta.app/Contents/Developer
“`
のようにxcode-selectコマンドでCarthageが見るXcodeの向き先を変えてあげます。
念の為に、変更前に現在のpathを確認したい場合は

“`
sudo xcode-select -p
“`

元記事を表示

iOSで物体追跡【Vision】

![Sep-01-2020 12-34-38.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/3df77fad-bf82-f21f-eaaa-1ac99389d970.gif)
連続するフレームで物体を追跡できます。
物体位置をCGRectで指定すると、次のフレームで追跡します。

###手順

1、追跡用のシーケンスハンドラをつくります。

“`swift
let requestHandler = VNSequenceRequestHandler()
“`

2、物体を囲むCGRectで、物体観測をつくります。

“`swift
var inputObservation = VNDetectedObjectObservation(boundingBox: cgrect)
“`

3、「1、」で作った物体観測で、追跡リクエストをつくります。

“`swift
let request = VNTrackObjectRequest(detectedObjectObservation:

元記事を表示

OTHERカテゴリの最新記事