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

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

[Xcode] ここ数年、春先から最新のiOS SDKビルドじゃないとバイナリアップロードができなくなっている問題の解説と、プロダクトマネジメント上で必要な考慮

Xcode 11 / iOS 13で以下のような話題が上がりまして…
[[速報] 2020年4月の審査から、iOS 13 SDK(Xcode 11.xでのビルド)が必須になる(追記あり)](https://qiita.com/y-some/items/4d5df3606145a3a36522) – Qiita

Xcode 12 / iOS 14でも同じでした。
→2021年4月26日以降、iOS 14 SDK(Xcode 12.xでのビルド)が必須に
[App Storeへの提出に関するアップデート](https://developer.apple.com/jp/news/?id=ib31uj1j) – Apple Developer ニュースとアップデート

ここ数年の流れを踏まえると、プロダクトマネジメントの観点で、以下のような認識を持つ必要があります。

– 毎年9月にiOSとXcodeのメジャーアップデートがあり、翌年4月以降、最新メジャーVerのSDKでビルドしないと**ビルドをAppleのサーバーにアップロードできない=審査提出できない(バグ対応ですら)。**
– Xco

元記事を表示

iPhone 5sをiOS 10.3.3へダウングレード

iOS 12.4.5状態だったiPhone 5sをiOS 10.3.3へ落としたときのメモ.
当然の事ながらオフィシャルにはできない事を脆弱性を突いて行なう脱獄系なので,**自己責任**です.

# 最終的にやったこと

Mac (Sierra)にて

https://ipsw.me/

IPSW Downloadsから
iPhone→iPhone 5s (GSM)→iOS 10.3.3 (14G60)
でiPhone_4.0_64bit_10.3.3_14G60_Restore.ipswを落とし,DFUモードでiPhoneを繋いでVieuxを走らせた.

https://github.com/MatthewPierson/Vieux

# 経緯
ホンダのカオパネという32bitアプリが更新されず,64bitしか動かないiOS 11以降では動作しなくなっている.
とうの昔にサポート終了してるので仕方ないが,(とは言えサポート終了はiOS 11リリース後なので対応してほしかった所)
I-O DATAのNVSPH-1経由でインター

元記事を表示

OpenGL ES(iOS)でMSAAを利用する方法

iOSでOpenGL ESを使用する際にMSAAを利用する方法です。
筆者環境は下記の通り。

* OpenGL ES3.0
* XCode 12.4
* MacBook Air (M1, 2020)
* Swift5.0

検証端末は下記の通り。

* iPad(第6世代)
* iOS 14.4.2

厳密な計測はしていませんが、筆者が作っているアプリ的には60FPSを維持できているので、そこまで速度低下は気になっていません。

# MSAA用のバッファの準備

オンスクリーンで表示するフレームバッファとは別にMSAA用のフレームバッファとレンダーバッファを準備します。

“`swift
// MSAAバッファを作成する
class func createMSAABuffer(width: Int, height: Int) {
glGenFramebuffers(1, &sampleFramebuffer);
glBindFramebuffer(GLenum(GL_FRAMEBUFFER), sampleFramebuffer);

元記事を表示

【Flutter】入れ子のリストでbuilderを効かせる

この記事で解決する問題

入れ子のリスト(リストの中にあるリスト)を使う際に、builderがうまく機能しない。

builderだと画面に見える部分のみ生成されるが、なぜか最初にすべて生成され、読み込みに時間がかかる。

なぜ機能しないのか

親がスクロール系のウィジェットのとき、子のリストが独立してスクロールできないようにNeverScrollableScrollPhysicsを使用できる。

だが、これを使用しているとbuilderがスクロールしていない判定になり、buiderの特徴であるダイナミックなローディングが効かないため、一気に読み込むことになってしまう。

解決策と使用例

●CustomScrollViewを使用する

![20210523_120424[1].gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1188685/9bfc85e3-50f7-850d-4a9a-f40f7d5de318.gif)

CustomS

元記事を表示

Life Cycle:SwiftUI Appで作成した時にFirebaseを初期化する方法

# はじめに
Xcode12よりプロジェクト作成時に、追加されたLife CycleのSwiftUI Appを選択してプロジェクト作成した後、`Firebase.configure()`をどう記述すればわからなかったので調べた結果を残します。

![スクリーンショット 2021-05-23 11.50.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/3ea41a67-da54-07d5-1a46-67a6b0087a1f.png)

# Firebaseの公式ドキュメントによると
[Firebaseの公式ドキュメントを確認](https://firebase.google.com/docs/ios/setup?hl=ja#initialize-firebase)すると

> FirebaseApp 共有インスタンスを構成します。通常はアプリの
> application:didFinishLaunchingWithOptions: メソッドで行います。

と書かれていますが、実際にA

元記事を表示

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
– ScrollView→ScrollView…ScrollView(.vertical)とすると縦、(.horizontal)とすると横

# 画面遷移
Androidではタッチすると次の画面にいきたいViewにClickListnerをセットして、その中で新しいActivityの

元記事を表示

アクセシビリティを保ちながら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

元記事を表示

OTHERカテゴリの最新記事