iOS関連のことを調べてみた2021年05月23日

iOS関連のことを調べてみた2021年05月23日

Android -> iOS (SwiftUI) 開発tips

普段Androidアプリ開発をしていて、この度iOSアプリ開発に手を出してみた。
その際にAndroidにおけるあれってiOSでどうやってやるの?となったことをまとめておくメモ。
随時加筆予定。
# 環境・技術スタック
Android…Viewベースアプリ(jetpackComposeではなく)
iOS…SwiftUI (UI,ライフサイクルともに)
Xcode…Version 12.5 (12E262)

# View
(Android View) → (SwiftUI)

– FrameLayout→ZStack
– LinearLayout (横方向)→HStack
– LinearLayout (縦方向)→VStack
– ImageView→Image
– TextView→Text

# 画面遷移
Androidではタッチすると次の画面にいきたいViewにClickListnerをセットして、その中で新しいActivityのstartやFragmentのreplaceを行ったりするのが一般的だと思います。
SwiftUIでは

– まず入れ替え元にしたいView

元記事を表示

アクセシビリティを保ちながらiOSで使用するアイコンデザインを変更する

アプリのデザインはガイドラインがしっかりと作られてますが、痒いところに手が届かず、デザインの細かい調整が難しいことがあります。

プロダクトらしいデザインを実現するためには、独自カラーや独自アイコンの作成がありますが、それではアクセシビリティを犠牲にしてしまう場合があります。
今回はガイドラインを守りつつアクセシビリティを保ちながらアイコンデザインを変更する方法を書きます。

わたしはデザイナーなので、たぶん言葉のニュアンスが違う部分が多々あります。(いつもエンジニアと会話する時にはいい感じに汲み取ってもらえていて感謝です)

## 目次
1. iOSのアイコンに必要なアクセシビリティ
1. アイコンの編集
1. Xcodeに追加
1. 補足
1. 参考

## 1. iOSのシステムアイコンに必要なアクセシビリティ
iOSではデフォルトの文字サイズと文字の太さを自由に変更できる機能があります。
Settings -> Display&Brightness -> Text Size
Settings -> Display&Brightness -> Bold Text

元記事を表示

[Swift] structがデフォルトで持つMemberwise Initializerを使い続けたい。別のイニシャライザをextensionで追加すれば使い続けられるよ!

# 問題

## Memberwise Initializer

Swiftの構造体(struct)にはメンバ変数の初期化を行うイニシャライザ(_Memberwise Initializer_)がデフォルトで自動的に生成されます。この機能によって新しいメンバ変数を構造体に追加したとしても自動的にイニシャライザへの引数の追加が行われるため、イニシャライザの変更を手動でする必要もなく、対応漏れもありません。

“`swift
struct Person {
let name: String
let age: Int
}

let john = Person(name:”John” , age: 18)
“`

## Memberwise Initializerが使えなくなる

ただこの便利な_Memberwise Initializer_は、イニシャライザを追加すると上書きされて使えなくなってしまいます。
下の例では新しく追加した`birthday:`を引数にとるイニシャライザは問題なく使えるのですが、_Memberwise Initializer_が上書きされてしまい

元記事を表示

絶対使いたくなる!MacCatalystのメリットを紹介!

#Macへの移植が簡単
「MacCatalyst」では、iPadアプリのソースコードを流用できるのはもちろん、UIのデザインをMac向けに最適化してくれたり、キーボード&マウス操作に対応してくれたりと、何かと自動でやってくれるので、簡単にMac移植ができます。
対応OSが増えれば必然的にユーザー数も増えるので、簡単にMac対応ができる「MacCatalyst」は効率が良くて便利です。

#アプリの管理が楽
対応OSが増えると、アプリの管理の手間もどんどん増えていきます。
ですが、「MacCatalyst」を使えば、アプリの修正や機能追加などが簡単になります。
というのも、iPad版とMac版で同じソースを共有しているため、アプリに変更を加えたい場合は1つのソースに変更を加えるだけで良いからです。
これで面倒なソース管理も楽にできちゃいます。

#iOSアプリと同じ感覚でMacアプリを作れる
iOSアプリとMacアプリでは、作成するのに使うAPIが違います。
そのため、同じアプリを開発する場合でも勝手が違うのですが、「MacCatalyst」なら、iPadアプリのソースからMacアプリが

元記事を表示

iphoneの画面が勝手に拡大される問題

**文字を入力するときに勝手に画面が拡大されるときの対処**

iphoneで、テキストボックスに文字を入力するとき、
勝手に画面が拡大され、手動でいちいち画面倍率を戻さないといけないという事象が不具合として修正要望に上がってきました。

これは、iosの親切で、
文字が小さくて見にくいから自動ズームしてくれており、不具合ではありませんでした。

###対処法

“`ruby:qiita.rb
style=”font-size:16px;”
“`

文字サイズをあらかじめ16px以上に設定しておくと、
ズームされません。

元記事を表示

コードで作るContainer View Controller

# はじめに
この記事の目的は、コードから、Container View Controllerを作れるようになることです。
子ViewControllerが一つである単純な例で説明を行います。
参考文献の書籍の内容です。

# Container View Controllerとは
UINavigationControllerやUITabBarControllerなどといった、ViewControllerヒエラルキーの親子関係の親になり、子ViewControllerのviewを表示するViewControllerのことです。

あんまり知らないですが、androidだとFragmentを持つActivityみたいな感じでしょうか??

# 方法
UIViewControllerでは、子ViewControllerを格納するための`children`プロパティが用意されていますが、直接扱うことは非推奨みたいです。
子ViewControllerを扱うには決まったお作法があり、それを破ると手痛い仕打ち(バグ)を受けるとのことです。
Container View Controllerは、こ

元記事を表示

iOSで広告を実装すると、ミュージックアプリのBGMが止まってしまう場合の対処法

# 概要
広告を実装したアプリを使っていると、裏でミュージックアプリで流している音楽が止まる場合があります。
その対処法になります。

# 音楽が止まる理由
iOSでアプリが音声を発する場合、デフォルトでは`アプリが音声を発した場合に他の音声を中断する` となっています。
そのため、広告を実装したことにより、何かの拍子で広告側が音楽をコントロールしようとして、その結果ミュージックアプリが流す音楽が止まるといったことが考えられます。

# 音楽が止まる問題の対処
自分のアプリで音声再生を行ったとしても中断しないようにします。
一番簡単な方法は`Category`の変更です。

iOSには `AudioSession`というものがあり、アプリやOS間での音声のコントロールをしています。
AudioSessionには`Category`というものがあり、ここで`サイレントスイッチONで無音になるか`、`他の音声の中断をするか`、が決定されます。
このCategoryを、アプリが音声を発した場合に他の音声を中断しないように設定することでミュージックアプリの音声の中断を行わないようにします。

元記事を表示

Flutter でアプリを作ってみた感想

# はじめに

Flutter が本格的に流行ってきたので、勉強のため、架空のショッピングアプリの開発を Flutter を用いて開発してみました。
そこで得られた知見をまとめたいと思います。

# 開発したアプリの概要

開発するアプリとして架空の飲食店または小売店での注文アプリを作成しました。
この手のアプリの中ではマクドナルドのオーダーアプリがかなりよくできていたので、それを参考にして作成しました。

Flutter の勉強が主な目的ですが、相性の良い Firebase の機能も試してみたかったので、店舗情報、商品情報、注文履歴などのデータはアプリ内で固定値で持たずに Firestore に格納するようにしました。

ただし、商品マスタ登録、店舗マスタ登録や商品在庫といった運用の考慮どはしていません。
また、決済機能は実装対象外としました。

最終的な画面数は 10 画面。
実装期間は土日を 2 ヶ月間ほどです。

# アーキテクチャ(全体)

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/

元記事を表示

2021年版 ユニバーサルリンクが更新されなくてハマった話

# 結論
– ビルド番号が違うアプリをインストール
– Storeから入っていたアプリをTestFlightからインストール

の2種類の方法で治りました。
どこかの記事で、アプリ再インストール時に **apple-app-site-association** を見に行っているという話がありましたが、単純に再インストールしただけでは反映されませんでした。

検索で上に出てくる記事が総じて少し古いのでそのときから仕様が変わってるっぽいですね :thinking:

なおこちらは **iOS 14.5.1** で検証しました

元記事を表示

ATTダイアログ前の説明画面でアクセプト→リジェクト→アクセプトされたので記録

##はじめに
トラッキング許可のダイアログを出す手前で、事前説明を行っていたのですが、一度アクセプトされた内容を、別件で再申請した際にリジェクトされたので、これから申請される方の参考になるよう記録します。

##2021/04/04 下記画面でアクセプト

IMG_5808.JPG IMG_5809.JPG

##2021/05/05 別件でアップデートを申請したところ上記画面を理由にリジェクト

##2021/05/06 下記画面で

元記事を表示

SwiftUI トラッキング許可のポップアップ(ATTダイアログ)表示とAdmob SDKの初期化

##1. Info.plistへ、ポップアップに表示させる文面を追加

“`
NSUserTrackingUsageDescription

広告を最適化するために使用します。
なお、本アプリが個人情報にアクセスすることはありません。

“`

##2. ポップアップの手前に、説明ページを実装(任意)

【例文】
“本アプリでは、広告を表示しています。\n次の画面で「許可」を選択すると、あなたに合った広告が表示されやすくなります。\n(許可しなくても、アプリのすべての機能を利用できます)”

【サンプルコード】

“`
struct TrackingExplanationView: View {
@Binding var shouldShowTrackingExplanationView: Bool

var body: some View {
VStack {
Text(“テキスト”)

Button(action: {

元記事を表示

【Flutter】flutter/flutter.h file not found ビルドエラー(ios)の対処法について

# エラー
## 事象
先程まで何事もなくビルドできていたFlutterプロジェクトで下記のエラーが発生するようになった
“`flutter/flutter.h file not found“`

ずっとflutterコマンドでビルドしていたが、1回xcodeからビルドしたら発生するようになったかもしれない。(トリガーはいまいち不明。)

## 環境
* Flutter 2.0.5
* channel stable
* Dart 2.12.3

# エラー対処法
## その1(エラー解消せず)
**下記で改善する人もいるそう**
1. rm ios/Flutter/Flutter.podspec
2. flutter clean
3. flutter pub get
4. pod install
5. flutter run

* 参考

https://github.com/flutter/flutter/issues/70895

## その2(こちらでエラー解消)
1. ios/Runnerフォルダーをバックアップ
2. iosフォルダーを削除
3. flutter cre

元記事を表示

Flutterでの広告ID取得に関して考える (Android/iOS)

最近、iOSではiOS14.5からApp Tracking Transparency(名称が長いのでこの先はATTと略す)に対応しないと完全にIDFAの取得ができなくなりました

iOS 14.5以上サポートしているアプリではATT対応はもちろん必要ですが、サードパーティ製の広告SDKを使わずに会社独自の広告配信基盤などを持っている場合は標準ライブラリを使って広告IDを取得するケースがあると思います (基本、広告SDKが内部的に広告IDをよしなに取得してくれてるイメージ)

両OS含めてFlutterで取得する場合はどうすればいいかと気になり、調べたので簡単にまとめてみます

# 環境
* Flutter 2.0.4
* Dart 2.12.2

# 広告ID取得のパッケージ
スコア高め(Pub Point 110 / Popularity 80以上)とNull Safety対応しているかの点で以下の2つかなと思いました

* [app_tracking_transparency](https://pub.dev/packages/app_tracking_transparency)

元記事を表示

簡単なリマインダー(写経)

#はじめに

こちらの動画で学習しました。

#ソースコード

“`ViewController.swift
import UserNotifications
import UIKit

class ViewController: UIViewController {

@IBOutlet var table: UITableView!
var models = [MyReminder]()

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
table.delegate = self
table.dataSource = self
}

@IBAction func didTapAdd() {
//show add v

元記事を表示

[Swift]Typealiasでコードの可読性を高める

# はじめに

本文は、以下の記事を参考に作成しています。
[Typealias usage in Swift](Typealias usage in Swift)

# Typealiasの用途
コードの可読性を上げることが主な用途です。
変数のデータ型を宣言する際に`Double`や`Int`などを使用すると思いますが、`typealias`を使用することで、`Double`や`Int`などと同じ機能を持った**エイリアスで宣言することができます。**

### 用途① データ型の代わりにエイリアスで宣言

“`
//通常のデータ型の宣言
struct Receipt {
let totalCosts: Double
}

//typealiasでDouble型を割り当てたエイリアスDollarを作成
typealias Dollar = Double

// エイリアス`Dollar`で変数を宣言
struct Receipt {
let totalCosts: Dollar
}
“`

### 用途② extensionで機能拡張

“`
typealia

元記事を表示

iOSにプッシュ通知を送るためのメモ-APNS

タイトルの通りです。やる度に記憶が失われるので今のうちに自分用に記録しておきます。

###やることリスト

– App IDの作成
– APNS用証明書の登録
– Provisioning Profileの作成
– p12生成 (pem生成も)
– Xcodeでの設定
– おくる!!!

###番外

– シミュレータでのプッシュ通知
– 開発用と本番用の違いは?TestFlightではどうなる?

まずはじめに絶対に注意すること
**開発用と本番用は混ぜちゃダメ**ってこと
動かなくなる原因なので気を付ける。

#1. App IDの作成

####(1)Apple Developer Programにログイン
[Apple Developer Program](https://developer.apple.com/account)

####(2)Certificates, Identifiers & Profiles をクリック

####(3)Identifiersのプラスボタンをクリック

・App IDs を選択してContinue
・App を選択してContinu

元記事を表示

APNsPHP で HTTP/2 プロトコル に対応する

ここ最近の案件でiOSのプッシュ通知周りでかなりはまってしまったので(現状解決済み)
その際の解決策を共有します!

APNs【Apple Push Notification service】によるレガシーバイナリプロトコルでのプッシュ通知は、2021 年 3 月 31 日にサポートが終了します。
このため、HTTP/2 ベースの APNs である APNs Provider API に移行する必要があります。

参考 : https://developer.apple.com/jp/news/?id=c88acm2b

## ApnsPHP ライブラリを使用している場合
ApnsPHP というプッシュ通知用のライブラリを使用している方は要注意です。
正式版の ApnsPHP は、HTTP/2 プロトコルに対応していません。

でも大丈夫です!
GitHub からプレリリース版の v2.0.0-alpha を持ってきましょう。

Release HTTP/2 Protocol support.
https://github.com/immobiliare/ApnsPHP/releas

元記事を表示

iOSアプリ開発(Swift)におけるライブラリの選び方

# はじめに
アプリ開発においてサードパーティのライブラリはとても心強い存在です。自分で1から実装すると何日も掛かるような機能を、ライブラリの導入により少ない工数で簡単に実現できます。結果的に浮いた工数は新しい機能の追加や改善、リファクタリングなどにも使うことができます。自分もこれまでにいくつものライブラリを選定し、多くのライブラリに助けられてきました。

そんな心強い存在であるライブラリなのですが、今までいくつものライブラリを選定してきて感じたのは**”どうライブラリを選ぶか”**というのはとても難しく悩ましい問題だということです。
プロダクトの性質、チームメンバー、既存のコードベースなど、ライブラリを選ぶために様々な要素を考慮する必要があります。さらにややこしいのは、得てして似たような目的で使うライブラリが複数あり、どれを選ぶか判断に迷うことが多いということです。

一方で選ぶ時間は限られています。せいぜい数十分〜数時間ぐらいでしょう。対して選んだライブラリと付き合う時間は思いのほか長い傾向があります。大抵のライブラリは一度導入すると簡単には外せないからです。プロダクトの性質にもよ

元記事を表示

【Swift】RxSwift勉強してみたPart10

#はじめに
[前回](https://qiita.com/REON/items/08a19b644e2aac75eb83)
今回は、UITableViewとRxSwiftをバインドしてみたいと思います。

#カスタムセルを使わない場合
![ScreenShot 2021-05-18 1.41.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/dab95942-e020-1560-8a4e-d1d5c8fb8f5e.png)

ここでバインドしていますね。`element`に`Item`の情報が入ってきます

“`swift
items.bind(to: tableView.rx.items(cellIdentifier: “cell”)) { row, element, cell in
cell.textLabel?.text = element.name
cell.backgroundColor = element.color
}
“`

#カスタムセルを使う場合

元記事を表示

Flutterを既存のAppに組み込む

Flutterを試したい、でも既存のアプリはネイティブで構築しており、全部Flutterに置き換えたらなんか怖い。。。といった思いを持っている開発者は少なくないでしょう。今回は既存のiOS、Androidプロジェクトを維持したままアプリの一部の画面をFlutterで作成します。

>環境
OS: macOs Big Sur 11.1
flutter: 2.0.4

flutterとネイティブ間の画面遷移に伴う値渡しも実現できます。
2021-05-10 16.39.39.png    2021-05-10 16.40.39.png

  • OTHERカテゴリの最新記事