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

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

iOS ReplayKitを調べてみた

iOS ReplayKitを調べた内容を纏めてみました。

# 環境

– macOS Big Sur 11.0 Beta
– Xcode 11.6
– 実機 iOS 13.6

# 機能概要

ReplayKitの主な流れ

– ReplayKitはiOS9から追加
– iOS11からアーキテクチャが変更され、RepalyKit2に
– iOS11からコントロールセンターの画面収録機能が追加

ReplayKitには、主に2つの機能がある

## 1. 画面録画

### 1.1. Screen Recording(iOS9〜)
– 実行中のアプリを録画し、プレビューコントローラーから写真や共有で保存
![スクリーンショット 2020-08-17 22.45.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237942/15807d06-96f2-d84e-0e44-0844998cdb28.png)

### 1.2. In-App Screen Capture(iOS11〜)
– 実

元記事を表示

[Multiple commands produce ‘/Users/ユーザ名/…省略…/Info.plist’]が発生した場合

#### 問題
Info.plistを誤って削除してしまい、手動で追加し直した。
その後、エミュレータでアプリを実行すると下記のようなエラーが出るようになった。

“`
Multiple commands produce ‘/Users/ユーザ名/Library/Developer/Xcode/DerivedData/Runner-hogehoge/Build/Products/Debug-iphonesimulator/Runner.app/Info.plist’:
1) Target ‘Runner’ (project ‘Runner’) has copy command from ‘/Users/…省略…/Info.plist’
2) Target ‘Runner’ (project ‘Runner’) has process command with output ‘/Users/…省略…/Info.plist’
“`
#### 対応

Xcodeで下記の場所まで移動。

Runner → Build Phases → Copy Bundle Resources

Copy

元記事を表示

UIFeedbackGenerator を使おう

## 概要

UIFeedbackGenerator は UI にフィードバックを追加するための、フィードバックジェネレーターの抽象クラスで、フィードバックの種類別に下記の3つの具象クラスが存在し、それぞれ iOS10 以降で使用することが可能です。

– [UIImpactFeedbackGenerator](https://developer.apple.com/documentation/uikit/uiimpactfeedbackgenerator)
– [UISelectionFeedbackGenerator](https://developer.apple.com/documentation/uikit/uiselectionfeedbackgenerator)
– [UINotificationFeedbackGenerator](https://developer.apple.com/documentation/uikit/uinotificationfeedbackgenerator)

基本的には、UIFeedbackGenerator を自身でインスタンス化す

元記事を表示

ask me! appのログイン画面の実装

#1 この記事の内容

ask me! appでのログイン画面の実装方法について記載します。画面レイアウトは下記のとおりです。

![quitta①+.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681104/a12634d1-d61e-627d-f6a0-1a79eb294dd6.jpeg)

#2 ソースコード概要

ソースコードの概要は下記の通りです。

“`dart:login.dart

@override
Widget build(BuildContext context) {
return
new GestureDetector(
onTap:()
{
_focusNodePwd.unfocus();
},
child:

new Scaffold(
appBar: new AppBar(
centerTitle: true,

tit

元記事を表示

【Flutter, Dart】ミュータブルとイミュータブル、そしてfreezed

# はじめに
本記事は [The Mutability Tax](https://medium.com/@davidmorgan_14314/the-mutability-tax-6403d84f21c0) をベースにしています。
意訳・抜粋しまくったので翻訳記事と呼ぶには忍びないですが、記述の足らない箇所があれば元の記事を参照してください。
筆者の David Morgan 氏はGoogleのソフトウェアエンジニアです。

元記事の公開は2019年7月15日です。
本文中に登場するコードは `Dart` で記述されています。

## 3点要点
1. Mutableはダメです
2. Immutableも正しく扱わないとデメリ

元記事を表示

iOS Keyboard Extensionでキーボードを介さない操作を検知する

iOSの純正キーボードは超絶多機能です。ちょっと考えただけでもこんな機能がついています。

* 入力中の文字を薄い青色(ダークモードでは黄色)でハイライトする。
* 点滅するカーソルをドラッグすることによるカーソルの移動を検知し、変換候補を変更する。
* 点滅するカーソルをドラッグすることによるカーソルの移動を検知し、入力中の範囲から外に出られないようにする。
* 入力範囲外をタップした場合入力中の文字を確定する。
* 選択されているテキストを取得し、再変換する。
* ペースト操作が行われた場合検知し、入力中の文字を確定する。
これは高度な機能です。実際私が日本語対応のkeyboard extensionを漁った限り、純正キーボードと同じ挙動を再現できているものはほとんどありませんでした。
![iOS keyboard extension functions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638786/3312b906-27f9-75fc-aa93-1234e97547f2.png)

元記事を表示

ダークモード対応の罠

去年iOS 13の新機能で出たダークモードを自社アプリに対応したのですが、思わぬ挙動でバグが出てしまいそのTips共有です

# traitCollectionDidChangeの罠

ライト⇄ダークの色切り替え時に特定の処理を行いたい場合は
`func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)`
を使って切り替え時の検知ができます

単純にライト/ダーク時に専用の配色を入れる(例 CGColorで色を入れる必要がある)場合は問題ないですが、それ以外の何か別の設定を入れる(例 ダークモードの時だけ〇〇する)みたいなケースだと問題がおきます

“`Swift
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {

super.traitCollectionDidChange(previousTraitCollection)

元記事を表示

APIデータを、JSON形式で取得。【JSON解析】

## JSONとは?

JavaScript Object Notation ?

– `データフォーマット (データ形式)` の一つ。
– **キー**と**値**のペアで構成。(=辞書型)
– データの記述量が少ないので、読み込みが速い。
– **JavaScript**との親和性が高い。
– JavaScriptに限らず、データのやりとりに広く使われる。

![picture_pc_5726e4146e6ea68b6e70cc6e7b9361de.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683795/3945e611-025b-be20-ebda-65c0f42938c6.png)

キーは常に文字列ですが、
値には`String`, `Int`, `Bool`, `配列`, `null`なども使えます。

### データフォーマット (データ形式)

現在の主流のデータ形式は、`XML`, `JSON`, `CSV`の3つ。
**JSON**が一番軽く、使い勝手がよく、多く使われる。

元記事を表示

Google Maps もダークモード対応しようね

## スタイルを適用する

`isDarkMode` のようなパラメータがあるわけではなく、自分で用意したスタイルを適用する形になります。
背景は黒、路線は青、文字は白などを個々に指定する必要があります。

指定方法としては [JSON ファイルで指定する方法](https://developers.google.com/maps/documentation/ios-sdk/styling#use_a_json_file) と [String で直接指定する方法](https://developers.google.com/maps/documentation/ios-sdk/styling#use_a_string_resource) がありますが本記事では前者について紹介します。
実装方法は大きく変わりませんが、可読性や Android との共通化の観点から JSON 形式で指定することをお勧めします。

## JSON で指定する

`style.json` などの JSON ファイルをローカルに用意し、Map の `mapStyle` に適用します。

“`swift
//

元記事を表示

iosでプッシュ通知の証明書を.p12形式でexportしようとしたら.p12形式が選択できない問題について

備忘録

[この記事を参考にしました](https://ja.stackoverflow.com/questions/1729/ios%E3%81%A7%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5%E9%80%9A%E7%9F%A5%E3%81%AE%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92-p12%E5%BD%A2%E5%BC%8F%E3%81%A7export%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%97%E3%81%9F%E3%82%89-p12%E5%BD%A2%E5%BC%8F%E3%81%8C%E9%81%B8%E6%8A%9E%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84)

まとめると
キーチェーンアクセスのログインからではなく
分類の自分の証明書から選んで右クリックで.p12を使用できる

![スクリーンショット 2020-08-17 12.33.22.png](https://qiita-image-store.s3.ap-northeas

元記事を表示

【Windows編】FlutterとCodemagicを使ってAndroid/iOSアプリを生成するまで

## 0. はじめに
勉強不足なもので、スマホアプリの開発は最近全然やっていませんでした:rolling_eyes:
私の自宅にはWindows1台、Mac1台あるのですが、性能的にも新しさ的にもWindowsの方が上ですので、開発は主にWindowsで行っております。
でも、iOSアプリも作りたいなーと思い(スマホはiPhoneなので)、最近流行っている**Flutter**を使ってみることに。
せっかくなのでアウトプットとして、環境構築手順やらCodemagicについて当記事にまとめました。

## 1. Flutterとは
– Googleによって開発された**クロスプラットフォーム**の開発技術。
– つまりは**React Native**や**Xamarin**のライバル。
– **Android Studio** or **XCode** or **VSCode**に**Flutter SDK**をぶち込んで開発する。
– **Dart言語**を使って実装する。

## 2. Codemagicとは
– Flutter専用の**CI / CD**サービス。
– ソースをP

元記事を表示

SwiftのFunctionを学んだ。【returnとか、paramとか】

## Functionの初歩。

func(関数)を学んだので、簡単におさらい。

### Functionを何故使うのか。

amazonのような買い物アプリにて、
ユーザーの買い物カゴの合計金額を計算する箇所が5つあるとき、

– `5箇所で同じコードを書くのは無駄。`
– `コード量が増えて、プログラム自体が複雑で読みにくくなる。`

**処理が1回しかないもの**でも、functionには利点あり。

– `functionにしてマトめる`と、コード量がかなり多いとき読みやすい。
– `function名`を適切につけて、判別しやすい。

### パラメータと引数の違い
> 意思疎通にはそれほど困らないけど・・・
「引数 == パラメータ」ではない

– **パラメータ** (**仮引数**)は、関数に受け渡されるものの**宣言**
– **引数**は、関数に渡した実際の**値**

“`swift
// Funtion with parameters

func declare(name: String) {
print(name)
}

declare(name:

元記事を表示

[2020年版]tabBarControllerの設定方法

##tabBarControllerとは?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643372/e13b62d9-229e-34c5-be81-1a1beb88002a.png)
tabBarControllerとは、よくiPhoneで見かける液晶下部にあるボタンのことを指します。
このBarの働きは複数画面と接続し、UITabBar(以下、tabBar)に並べられたボタンで画面の切り替えを行う部品であります。

##tabBarの実装方法
Xcode右上のプラスボタン(+)をクリックして`tabBarControllerを選択`
すると以下画像のように3つの画面が出てくるのでそのまま配置。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643372/67600425-a7af-6b26-2849-e8cf32817884.png)

##tabBarのテキスト変更方法
以下の画像

元記事を表示

Swift で CollectionView の最後に謎の余白がつく

Swift で横スクロールの CollectionView の作成している時に最後のアイテム後ろに謎の余白があく現象に悩まされていました。
どうやらこの現象は CollectionView のスタイルが `.horizontal` + FlowLayout の `minimumLineSpacing` プロパティがデフォルト値(10pt)を下回った時に発生する現象のようです。

https://stackoverflow.com/questions/42980842/minimuminteritemspacing-is-adding-some-strange-content-at-the-end-of-collection

## 解決策

解決策は FlowLayout の `minimumLineSpacing` と `minimumInteritemSpacing` の値を同じにすることで、これで無事余白を省いて表示されることができました。

“`swift
let flowLayout = UICollectionViewFlowLayout()

元記事を表示

[iOS] [Xcode] ライブラリやビルドに関する基礎知識を得られるリンク集

iOSアプリを開発する上でライブラリの利用は欠かせませんが、ライブラリの利用にはトラブルがつきものです。

私はこれまで、そのような場面では場当たり的なトラブルシューティングでお茶を濁してきました。

しかしそれでは「非効率」であったり「危なっかしい」と感じ、やはり、iOSアプリのビルドの仕組みや、ライブラリのリンクの仕組みをちゃんと理解すべきと考えています。

以下、私が参考にさせていただいている記事を共有します。
今後良い記事を見つけたら随時更新して行きます。

# ライブラリの基礎

– ライブラリの種類(静的/動的、ライブラリ/フレームワーク)

[Xcode の力を借りない Swift の Dynamic Library の作成とビルドを試す-ライブラリとは?](https://qiita.com/tasuwo/items/be8188c3645801a00252#%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A8%E3%81%AF)

[Embedded Frameworkについて](https://qiita.co

元記事を表示

iOS13 全体タップイベント制御 swift Objective-C

# はじめに

久しぶりの記事な気がしています。
検索した時思いの外しっくりしたものを見つけられなかったので記事にしてみました。

【全体タップイベント制御】って書きましたが以下紹介コードは押させないのみ記述しています。

変更するのにフラグの変更だけなのでそうしました!:shamrock:

では早速:sunflower:

# code

【**swift**】

“`swift

var keywindow:UIWindow? = nil;
for (count, item) in UIApplication.shared.windows.enumerated() {
if(item.isKeyWindow){
keywindow = UIApplication.shared.windows[count];
break;
}
}
if(keywindow == nil){
keywindow = UIApplication.shared.windows[0];
}
keywindow?.isUserInteractionE

元記事を表示

Flutterでローカルな通知機能を実装するためのOSごとの前設定

## 前置き
とあるアラートアプリを作成していて、ローカルでの通知機能を実装する必要が出てきました。

通知機能に関する日本語記事が何故か少ないような気がしますが、Flutter内でやることについては[この英文記事](https://itnext.io/local-notifications-in-flutter-6136235e1b51)を追っていけば問題なく進められると思います。しかし、前提として`flutter_local_notifications`というパッケージを使うために、OSごとの固有の設定が必要になるのでそれについてまとめておきます。ですので、この記事の内容は概ね[flutter_local_notificationsのページ](https://pub.dev/packages/flutter_local_notifications)のまとめです。

もし、記事の内容が参考になれば[Twitter](https://twitter.com/1d7678174656)のフォローをお願いします。個人的に進めているアプリ開発に関連することをよくツイートします。

## 環境

元記事を表示

iOSの「ショートカット」アプリを使って休暇申請メールを自動作成にしてみた話

# はじめに
ちょっとした息抜きで「ショートカット」アプリで自動化を取り入れてみた話
日々の細々とした作業は少しでも軽減していきましょう。

## 本編
ボタン押下と日付選択だけで休暇申請メールが自動で作成されるようにしてみました。

### 休暇予定日の入力設定
まず、休暇を申請する日付を入力できるようにしましょう。
「スクリプティング」>「通知」>「入力を要求」を選択し、以下のように設定します。

入力値はマジック変数「**休暇予定日**」と定義します。

|項目|設定|備考|
|—:|:–:|:—|
|質問|日付|入力要求時のメッセージを任意に設定|
|入力の種類|日付||

### 休暇種別の入力設定
休暇種別の内容を入力できるように設定をします。
テキストはマジック変数「**休暇種別**」と定義します。

#### 休暇種別を定義
まず休暇の種類を定義します。
「スクリプティング」>「リスト」>「リスト」を選択します。

今回は以下のように、一般的な全休・午前休・午後休を定義しました。
会社の制度に応じて任意に設定してください。

|項目|設定|
|–:|:–|

元記事を表示

[swift] CVPixelBufferからCGImage、UIImageへ変換する

iOSでカメラをリアルタイムで扱うとき、ところどころにcvPixelBufferが出てきますが、表示させたりフィルターをかけようとしたらCGImageやUIImage等に変換する必要があります。
そこで本記事ではCVPixelBufferからCGImageやUIImageに変換する方法をまとめておきます。

# CVPixelBuffer→CGImage

`VideoToolbox`ライブラリの`VTCreateCGImageFromCVPixelBuffer`という関数を使用します。

“`
import VideoToolbox

var cgImage: CGImage?
VTCreateCGImageFromCVPixelBuffer(pixelBuffer, options: nil, imageOut: &cgImage)

“`

ちなみにswift4.2では`options:`の引数名は省略可能です。

# CVPixelBuffer→UIImage

CVPixelBufferからCGImageに変換し、CGImageからUIImageを生成するExtensio

元記事を表示

【Flutter】【iOS】SimulatorでTextFieldを操作した時の画面フリーズを解消する方法【xcode】

#この記事を読んで習得できること
Xcode、FlutterでiOSアプリの開発をしている際に生じる、
TextFieldを操作すると画面がフリーズする問題を解消することが出来る
(つまずくとマジできついので備忘録として)

#結論

1.シミュレータの「ペーストボードの自動同期」のチェックをはずす
(Simulator -> Edit -> Automatically Sync Pasteboardをクリック)

![スクリーンショット 2020-08-16 7.02.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389553/43addc88-cc85-3bde-9442-9968cd3de1ac.png)

2.シミュレータアプリ自体を再起動
(command + qで簡単に消せるよ)

#どういうこと?
Flutterでいつものように、アプリの開発をしていた。
ログイン画面作らなきゃなーと思い、
「ユーザーID」と「パスワード」のTextFieldを作成。

デザイン的にもいい感じだし

元記事を表示

OTHERカテゴリの最新記事