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

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

iOSアプリ開発 デザインパターン入門を読んで

# 目次

第1章 前準備 ~おすすめ書籍
第2章 前準備 ~オブジェクト指向とは
第3章 前準備 ~プロトコル指向とは
第4章 前準備 ~入門書には書かれていないが重要なiOS開発Tips
第5章 Model View Controllerデザインパターン
第6章 MVCでタスク管理アプリを作ろう
第7章 Model View ViewModelデザインパターン
第8章 MVVMでGitHubクライアントアプリを作ってみよう

# 第1章 前準備 ~おすすめ書籍
学習者のレベル別で技術書を紹介している。

# 第2章 前準備 ~オブジェクト指向とは
オブジェクト指向、継承の概念を図を使って解説していて、初心者の方には分かりやすいだろうなぁと思いました。
継承のメリット、デメリットに関しても説明されており、再確認できてよかったです。

# 第3章 前準備 ~プロトコル指向とは
オブジェクト志向のデメリットを何がデメリットかをはっきりさせて解説した上で、そのデメリットをプロトコル志向がどう解決したか解説されていて、理解しやすかったです。

# 第4章 前準備 ~入門書には書かれていないが

元記事を表示

SwiftUIで作るドラえもん【顔編】

# はじめに
日曜日で暇なので, SwiftUIを使ってドラえもんを作ってみました.

この記事で完成するドラえもんは以下の画像です.
口を開けているドラえもんは難しそうなので断念しました.
かなり近く本物に近くないですか?笑

スクリーンショット 2020-03-01 20.37.49.png

さぁ作って行きましょう.

# 土台づくり
まず,以下の画像のような土台となる青の円とその中にある円から作って行きましょう.
ドラえもんって意識してませんでしたが,地味に楕円なんだと感じました.
確かによくよく見たら楕円なんですよね.

以下コードです.

“`swift:ContentView.swift

struct base: View {
var body: some View {

元記事を表示

[Xcode]ディレクトリをターミナル にドラッグ&ドロップすれば絶対パスが表示される

Project Navigatorのgroupからターミナル にドラッグ&ドロップすればgroupまでの絶対パスが表示されます。

スクリーンショット_2020-03-01_11_15_51.png

## こういう時に便利
– Xcodeを開いていてさくっとルートディレクトリにファイルを作りたいとき。
– `Podfile`や`Cartfile`など

このままではルートディレクトリでは無いので先頭のパスを消す必要があります。

“`
$ cd /Users/[UserName]/iOS/[Project Name]/[Project Name]⬅︎先頭のパスが不要
“`

元記事を表示

Google Maps iOS Utils でマーカーをまとめて表示する

Google Maps SDK を使用していてマップ上にマーカーを立てることはよくあると思います
ただ、マップ上にマーカーをたてすぎると、広域表示にした際にマーカーが密集しちゃって見辛くなってしまうってこともよくあると思います

そんな時マーカーを1つにまとめたいなーと思ったので、その実装方法を残しておきたいと追います

![GrWyuKwR.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53717/1adb1bac-7d9e-de26-b807-cc4172bfaedf.gif)

# 開発環境
Xcode:11.1(11A1027)
Swift 5
iOS:13.1
CocoaPods: 1.8.0

# 実装

## ライブラリのインストール
Google Maps iOS Utils をインストールするために CocoaPods を使用します
以下のように Podfile を編集し、 `pod install` を実行してください

“`
target ‘YOUR_APPLICATION

元記事を表示

Debug areaにerror: module importing failed: Missing parentheses in call to ‘print’. Did you mean print(‘Whoops! You are missing the <' + arg.argName + "> argument.’)? (fbildb.py, line 98), File “temp.py”, line 1, in と表示されるとき。

Debug areaにいつのまに次のエラーが表示されるようになった。
スクリーンショット 2020-03-01 1.16.34.png

## 環境
Xcode11.1
Swift5.0
chisel 1.8.1

## 結論
上記のエラーは`chisel`を利用していたため、起きたものでした。
Xcode11ではエラーがあるとissueがあがってました。

– [Xcode11 error: module importing failed: Missing parentheses in call to ‘print’ · Issue #272 · facebook/chisel](https://github.com/facebook/chisel/issues/272)

`v2.0.0`では解決されているとの

元記事を表示

CustomCellに値を代入したときにFatal error: Unexpectedly found nil while implicitly unwrapping an Optional value: custom cell: file xxxというエラーが出た

nibで作成したCustom cellに値を入れようとした時に次のエラーが出ました。

“`
Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value: custom cell: file xxx
“`

## 結論

– tableViewのregisterメソッドが間違っていた。

“`:before
tableView.register(UserSearchCell.self, forCellReuseIdentifier: UserSearchCell.className)
“`

“`:after
tableView.register(UINib(nibName: UserSearchCell.className, bundle: nil), forCellReuseIdentifier: UserSearchCell.className)
“`

cellをコードで実装している時は`before`が正しくて、cellをnibで作成した時は`after`でテー

元記事を表示

*** Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘-[UIViewController _loadViewFromNibNamed:bundle:] loaded the “xxx” nib but the view outlet was not set.’というエラーがでたとき。

## 概要
イニシャライザでnibを呼び出す時に次のようなエラーが出た。

“`
*** Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘-[UIViewController _loadViewFromNibNamed:bundle:] loaded the “xxxViewController” nib but the view outlet was not set.’
“`

“`:init()
init() {
super.init(nibName: UserSearchViewController.className, bundle: nil)
}
“`

loadViewで呼び出した時はこのエラーがでなかった。

“`:loadView()
override func loadView() {
guard let view = UINib(nibName: “UserSearchViewControll

元記事を表示

Library not loaded: @rpath/Flutter.framework/Flutter

– 内容:
Flutterでアプリを作成し、実機で確認をしようとした際に、
下記のエラーが発生したため、実機での確認ができませんでしたので、
情報共有させていただきます。
※情報の判断はご自身の責任でお願い致します。

`dyld: Library not loaded: @rpath/Flutter.framework/Flutter`

– 環境:
Xcode 11.3
iPhoneX(iOS13.3.1)
iPhone5S(iOS10.3.2)

– 結果:
[本家サイト](https://github.com/flutter/flutter/issues/49504)に追記がありました。特定の条件の場合、エラーが出てしまうようです。
– signing identity profile
– iOS13.3.1
ですと、ダメなようです。

iPhone5S(iOS10.3.2)では、実機で実行されることを確認致しました。

以上となります。?

元記事を表示

iOSアプリの審査状況変更を、Slackに自動通知する(GAS + Slack Webhook)

iOSアプリの審査状況(ステータス)は、iOSアプリ開発に関わる方なら誰もが気になることですよね。
[AppStoreConnect](https://apps.apple.com/jp/app/app-store-connect/id1234793120)はリアルタイムで審査状況に関する通知を受け取ることができるため、こちらのアプリを使っている方は多いと思います。

今回は、Slackのチャンネルにも審査状況を伝えたい方のために、GASとSlack Webhookを使用して自動的に通知を行う方法を記載します。

# 仕組み
アプリの審査状況は、AppStoreConnectに登録してあるメールアドレスに対して、メールで通知させることができます。
また、Appleからのメールは定型文となっており、審査状況に応じてメールの件名が決まっています。
例.

– アプリ申請済み、審査待ち -> `[アプリ名], is now “Waiting For Review”`
– アプリ審査中 -> `[アプリ名], is now “In Review”`
– 配信準備完了 -> `[アプリ名], i

元記事を表示

fastlaneでIn-Houseで配布するコマンドを作る

 開発しているアプリを実機で確認したい場合、通常は、「iOS Developer Program」の「Certificates,Identifiers & Profiles」から、実機登録を行なって、AdHoc配信でインストールするかと思いますが、開発者が多い場合や、イベントの時だけなど、端末を登録したくない理由がいろいろ出てくると思います。
この場合に、もし、エンタープライズライセンスを持っている場合は、社内向けに配布ができる、In-Houseという配信方法があるので、それを活用して、開発中のアプリをインストールできるようにすると便利です。

ただ、In-House配信も簡単にとはいかないので、これもfastlaneのコマンド一発で、crashlytics もしくは、Firebase App Distribution までアップロードし配布できるようにすると、かなり運用が便利になります。
必要あれば、CircleCIなどのCIサーバーに、自動で実行するジョブをセットすれば、もっと楽になります。

この場合に問題になるのが、証明書やProvisioningProfileやTeamIDな

元記事を表示

【iOS】UISegmentedControlの見た目を変える(iOS13対応)

# 概要
[UISegmentedControlの見た目を変えたいなぁ](https://qiita.com/omotesando/items/b2481cb57fa941adf88c) – Qiita
さんを参考に、iOS13に対応したカスタムUISegmentedControlを紹介します。

見た目はこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272677/1bc5d53a-6777-c9c0-7411-9e57b622357d.png)

# コード
今回書いたカスタムクラスを丸ごと貼ります。
プロジェクト内にコピペしてください。

“`swift:FlatSegmentedControl.swift
import UIKit

class FlatSegmentedControl: UISegmentedControl {
private var segmentItemWidth: CGFloat = 0
private var underli

元記事を表示

Multiple targets match implicit dependency for linker flags エラーの解決法

#FirebaseでGoogleSignInを導入したらエラーが発生。

share extensionを使った時も同じようなエラーが出た。

#解決法
###podfileを修正

以下を追加

“`
pod ‘GTMSessionFetcher’
“`

#解決後

“`
# Uncomment the next line to define a global platform for your project
platform :ios, ‘10.0’
use_frameworks!

def google_utilites
pod ‘GoogleUtilities/AppDelegateSwizzler’
pod ‘GoogleUtilities/Environment’
pod ‘GoogleUtilities/ISASwizzler’
pod ‘GoogleUtilities/Logger’
pod ‘GoogleUtilities/MethodSwizzler’
pod ‘GoogleUtilities/NSData+zlib’
p

元記事を表示

謎リジェクトされてしまった件について+対応

初めて以下のようなリジェクトをくらいました。

“`
差出人: Apple
Other – Other
Hello,

We are unable to continue this app’s review because your Apple Developer Program account is currently under investigation for not following the App Store Review Guidelines’ Developer Code of Conduct.

Common practices that may lead to an investigation include, but are not limited to:

・Inaccurately describing an app or service
・Misleading app content
・Engaging in inauthentic ratings and reviews manipulation
・Providing misleading custom

元記事を表示

iOSアプリの署名を更新

開発者の証明書の期限が切れるなどで証明書を更新すると、過去に作った`ipa`ファイルが開発用端末で使えなくなる。
ビルドし直すという手もあるが、時間が経っているとビルド環境が変わっている可能性が高い。

Fastlaneを`ipa`を再度署名することができる。

“`bash:コマンド例

FASTLANE_SKIP_UPDATE_CHECK=1 && \
FASTLANE_OPT_OUT_USAGE=1 && \
fastlane sigh resign myapp.ipa \
–use_app_entitlements \
–signing_identity ‘iPhone Distribution: Runo Sahara.’ \
–provisioning_profile “$HOME/Library/MobileDevice/Provisioning Profiles/myapp.Today.mobileprovision” \
–provisioning_profile “$HOME/Library/MobileDevice

元記事を表示

Core Haptics – カスタムハプティックパターンの作成と再生

Core Hapticsは、iOS 13で新たに追加された「ハプティック(触覚)パターンを作成し、再生する」ためのフレームワークです。ついにTaptic Engineを開発者が制御するためのAPIが公開されたというわけです。[^taptic]

[^taptic]: Core Hapticsはオーディオによるフィードバックも扱うので、厳密にはTaptic Engineを制御するだけではありません。

## 従来手法(UIFeedbackGenerator)との違い

Taptic Engineが初めて搭載されたのはiPhone 6sで、ハプティックパターンの再生自体は、iOS 10で追加された`UIFeedbackGenerator`により以前から可能

元記事を表示

admobの広告を実機で表示する際にエラーが起きたときの対処

# やりたかったこと

iOS向けのアプリケーション作成に手を出しはじめたのですが、admobによる広告表示を実機で確認しようとしたとき、
下記のエラーに見舞われましたが、なんとか表示まで持っていけたという話です。

公式のスタートガイド(https://developers.google.com/admob/ios/banner?hl=ja) に従い進めたところ、
シミュレータでのテスト広告表示まで問題なく確認できたが、実機(iPad mini 4)でのテストで躓いた部分を書きます。

# 前提/背景

admobによる広告表示のため、Xcodeのプロジェクトを作成した後に、CocoaPodsを用いて`Google-Mobile-Ads-SDK`をインポートしました。

公式ガイドの通りに実装をしてiPhoneSE, iPhone8のシミュレータでテスト広告の表示まで順調に確認できてました。

# 実機でのテストにおけるランタイムエラー

しかし、いざ実機でアプリケーションを動かそうとしたときに問題が発生しました。
ビルドは成功するのだが、実行時エラーでアプリケーションが落ちてし

元記事を表示

【iOS】遷移方法まとめとエンジニア1年生の独り言

# iOS遷移方法まとめ

案件にて、主に Navigation Controller に関する懸念点を考慮し Controller の構成を考える必要があったため、今回は iOSにおける一般的な遷移方法をまとめてみました。

遷移方法・Controller の hierarchy を決定するために役立てられればいいなと思っています。

また、最後に[エンジニア1年生の独り言](#エンジニア1年生の独り言)も記載しています。

ご指摘・ご感想・たわいもないコメントなどいただければ嬉しいです!

### 環境

– Xcode 11.2.1
– Swift 5.0
– iPhone 11 Pro Max (iOS13.2.2, シミュレータ)

# 遷移の種類

一般的な遷移の種類は大きく分けて以下の4つです。

– push遷移
– modal遷移: [番外編: モーダルとは?](#番外編-モーダルとは)
– tab切り替え
– page遷移

||push遷移|modal遷移|tab切り替え|page遷移|
|—|—|—|—|—|
|遷移時のアクション|指定なし|

元記事を表示

iPhoneアプリで自己証明書のサーバーにリクエストを送りたい

# はじめに
開発環境ではlocalhostに対してAPIリクエストを送って情報を得るケースがあります。
しかし、iPhoneのデフォルトではどのサーバーにも`https`であればきちんとした証明書を求めます。
証明書関連をしっかりするのをチーム全員に求めるのも酷なので(たまにしか触らない人も出てくるし)、アプリ側で吸収する方法を調べました。

# 環境
iOS 13.3

# ライブラリを使う
`Alamofire`というライブラリを使用するのが一番楽という結論になりました。
Security関連の設定を楽にできる仕組みが入っているためです。

# Alamofireインストール
https://qiita.com/ume1126/items/9ec378c02ca1b06287e9

上記記事を参照ください。
少し前の記事ですが、この記事を記載している時点で同じやり方で特に困りませんでした。

# Sessionの生成
`Alamofire`はSessionを元に動きます。
公式では`AF.request`という形でリクエストを作っていますが、`AF`の正体は`Session.de

元記事を表示

[iOS][Swift]UIColorからUIImageを生成する(ダークモード対応版)

# 概要
参考 https://qiita.com/akatsuki174/items/c0b8b5126b6c12f62001

参考リンクに挙げた記事の通り`UIKit`の`UIButton`のハイライト時の背景色を指定したい場合など、色から指定したいが仕様上`UIImage`でしか設定することができないという状況では、`UIColor`から`UIImage`を生成する必要があります。
iOS12までは参考リンクの通りで良いのですが、iOS13ではダークモードが搭載されたため特定のケースで上手く動かなくなることがあります。
本記事ではダークモードに対応したUIColorからUIImageを生成する方法を紹介していきます。

# 方法
先に方法だけ提示します。解説は以下の項に続きます。

“`swift
extension UIImage {
static func filledImage(byColor color: UIColor) -> UIImage {
let createImage = { (rawColor: UIColor) -> UII

元記事を表示

iOSアプリに必要なデータをCoreDataでbundleする

iOSアプリで読み取り専用データをbundleするための方法

# データ作成
実際に使うものと同様のデータモデルで作成する。

https://qiita.com/kenmaz/items/818d61cd0ece8664c017
の設定をしておくと、SQLiteのファイルパスがログに出力されるので便利。

サイズを小さくするためにVACUUMする。

“`sql
sqlite> VACUUM;
“`

# Bundleのやり方
普通にSQLiteのファイルをドラッグアンドドロップしてbundleする。
書き込みたい場合は Application Support とかにコピーしてから使う必要があるが、読み取り専用なのでその必要はない。
ただし、sqliteの一時ファイルである Hogehoge.sqlite-wal と Hogehoge.sqlite-shm も一緒にbundleしてあげる必要がある。
これが存在しないと、Unable to open って怒られる。
両方とも空ファイルでOK。
image.png

  • OTHERカテゴリの最新記事