iOS関連のことを調べてみた2022年07月27日

iOS関連のことを調べてみた2022年07月27日
目次

FlutterでTextField(TextFormField)を使うと、大量に再描画される

## 概要
TextFieldもしくはTextFormFieldを設置すると、大量(数十回)に再描写(build)される
※厳密には、MaterialPageRouteでpush(遷移)した先に、TextFieldを設置すると、同現象が発生する

## サンプル
“`dart
Navigator.push(
context,
MaterialPageRoute(builder: (context) => Page())
);

class Page extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
child: TextField(
// このテキストフィールドにfocusが当たると大量に再描画される
),
);
}
}
“`

## 対応方法
### その1, ページルートに設置する
ページ設計的にMaterialPageRouteでpushした先でない(つまりルート)Vie

元記事を表示

`Task.init` に渡すクロージャが暗黙的に `self` をキャプチャすることの背景と注意点

## 概要

`@escaping` なクロージャでは、クロージャの中で参照型の `self` のプロパティにアクセスするときなど明示的に `self` を書かなければいけません。これに対して、Swift Concurrency で使われる `Task.init` に渡すクロージャでは `@escaping` であるにも関わらず暗黙的に `self` をキャプチャするので `self` を書かなくてもいいという例外的な振る舞いをします。その背景と注意点についてまとめます。

この記事中での動作検証は Xcode 14 Beta 3 で行っています。

## `@escaping` なクロージャと `self`

本題に入る前に、まずは `@escaping` と `self` の関係について確認していきます。ある関数がクロージャを引数で受け取るとき、そのクロージャをその場ではなくあとで実行する可能性がある場合は引数に `@escaping` 属性をつける必要があります。具体的にあとで実行する可能性があるというのはどういうときかというと、

– 受け取ったクロージャをプロパティに保存する

元記事を表示

【SwiftUI】NavigationBarに画像を設定する

# 方法1
“`diff_swift
import SwiftUI

struct ContentView: View {
var body: some View {
NavigationView {
List {
ForEach(0..<100) { index in Text("テキスト: \(index)") } } .listStyle(.grouped) + .toolbar { + ToolbarItem(placement: .navigation) { + Image("instagram") + .resizable() + .aspectRatio(contentMode: .fit) +

元記事を表示

UITableViewCellの.disclosureIndicatorのアクセサリタイプの色適用

### 概要
– UITableViewCellで.disclosureIndicatorのアクセサリタイプを表示する際に色適用をする
–  通常のcell.tintColor設定では色適用されない※iOS13以前はできたかも

### .disclosureIndicatorの色適用
このやり方がiOS標準で表示されるものと一番近い
“` swift
let chevronColor = UIColor.red
// システムイメージの表示設定を行う,iOS13以後サポート
let chevronConfig = UIImage.SymbolConfiguration(pointSize: 14, weight: .regular)
guard let chevronImg = UIImage(systemName: “chevron.right”, withConfiguration: chevronConfig)?.withTintColor(chevronColor, renderingMode: .alwaysTemplate) else { return }
let ch

元記事を表示

FlutterでiOS開発を久々に実機で検証する時につまづく

開発も山場を迎え実機での検証を余儀なくされた時に
“`
Error: iPhone is busy: Fetching debug symbols for iPhone.
Xcode will continue when iPhone is finished. (code -10)
“`
こんなエラーに出くわす。。。

– `Mac`上の`iTunes`を閉じる。
– 端末(`iphone`)の再起動。
– `Xcode`の再起動。
– `Mac`・エディタ(`VSCode`)の再起動。

で上手くいかない場合は、
![スクリーンショット 2022-07-26 17.32.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/aae7078c-1523-50a0-9071-16f8add19ef1.png)
`Xcode`で端末を接続し直して、
![スクリーンショット 2022-07-26 17.33.18.png](https://qiita-image-store.s3.ap-n

元記事を表示

【Swift5】Realmでデータを保存する

# Realmとは
– モバイル版のデータベース管理システム
– 公式ドキュメントは[こちら](https://www.mongodb.com/docs/realm-legacy/docs/swift/latest/)
# メリット
– ライブラリRealmSwiftを使用すると、アプリのモデルレイヤーで高速かつ効率的に記述できる。
– Realm Stadioアプリでデータベース管理ができる。
– データの保存、削除、検索などデータを操作しやすい
– アプリ内にデータを保存しているので、オフラインでも動くし、サーバーの負荷軽減にもつながる。

# デメリット
– Structやenumが使えない。書き方に工夫が必要。
– Realm特有の仕様があるから思わぬとこでハマる。List型とか

# Realmの導入
– pod installする
“`
pod ‘RealmSwift’
“`

# 実装
– 今回は、PersonモデルとPokemonモデルを用意し、Personモデルに入っているPokemonモデルの配列にHitokageとZenigameとFusigidaneのデ

元記事を表示

【Flutter】iOS実機にてReleaseビルドが通らない場合の対処法

# 開発環境
OS: MacOS
Flutter: 3.0.4
Flutter Channel: Stable
Dart: 2.17.5
Android Studio: Artic Fox | 2020.3.1 Patch4

# エラーメッセージ
~~~
Automatically signing iOS for device deployment using specified development team in Xcode project: XXXXXXX
Running pod install…
Running Xcode build…
Xcode build done. 8.3s
Failed to build iOS app
Error output from Xcode build:

** BUILD FAILED **

Xcode’s output:

Writing result bundle at path:
/var/folders

元記事を表示

(超簡単)SwiftでAPIを叩いてサーバーから情報を取得する方法 

# はじめに
SwiftでAPIを叩いてサーバーから情報を取得する方法を解説していきます。
後半にはサンプルコードを記載しています。
# この記事の対象者
・iOSアプリからAPIを叩いてサーバーから情報を取得する方法を知りたい方
・APIを叩いて情報を取得するサンプルコードが欲しい方
・汎用性の高く使いやすいAPI通信の実装方法の
# 開発環境
・Swift5
・Xcode 13.4.1
・iOS  15
#解説手順
1、今回取得する施設データ(JSON形式)
2、サーバーから取得した情報を格納するクラスを作成
3、サーバーにリクエストを送信しレスポンスを受信
4、サンプルコード
## 1、今回取得する施設データ(JSON形式)
こちらが今回APIから取得するJSON形式のデータです。
“`swift
//サーバーにある施設情報(仮)
let homeData_json = {“status”:true,”homes”:[{“homeId”:”4”,”homeName”:”A施設_1ち”,”homeType”:”2″,”homeImage”:”/img/s-study.png”},

元記事を表示

バックグラウンド時やアプリ未起動時でもプッシュ通知をハンドリングする方法

プッシュ通知の受信イベントをバックグラウンド時にハンドリングする方法を調べても、サイレントプッシュ通知の記事ばかりが上がってきて、やり方を見つけるのに苦労したので記事にしました。
# 結論
Notification Service Extension を使う!
UNNotificationServiceExtensionのdidReceiveにOSLogを仕込んで確認したら、アプリ未起動時など状態に関わらずプッシュ通知をハンドリングできていました。(ここに通知を受信したときにやりたいことを書けばOK)

### 補足
Notification Service Extension は、通知をAPNsから受信してからユーザーに見せる前にペイロードを編集したりできるapp extensionです。

実装方法については[こちら](https://dev.classmethod.jp/articles/user-notifications-framework-13/)を参考にさせていただきました?

元記事を表示

iOSアプリの機密情報(API Key/Secrets etc.)をセキュアに管理する [Arkana]

# はじめに

iOSアプリにおいて、サードパーティSDKなどから提供されるAPI KeyやSecretsなど、機密情報をどのようにセキュアに管理するといいでしょうか。
単純に実装するとハードコーディングや、設定ファイルなどに記述し、リポジトリにpushするようになってしまうと思いますが、セキュリティの観点からはアプリと同じリポジトリにpushするのはよろしくありません。

例えばリポジトリに閲覧権限を持っている場合、API Keyを使ってAPIサービスの実行ができてしまったり、[CIツールなどでソースコードを外部からアクセスさせている場合、CIツールへ不正アクセスされ漏洩する可能性](https://about.mercari.com/press/news/articles/20210521_incident_report/)や、[ipaファイルからリバースエンジニアリングツールを使って文字列を抽出される可能性](https://nshipster.com/secrets/)もあります。
そのため、例えプライベートリポジトリだったとしても、機密情報の扱い方を考える必要性があります。

元記事を表示

(Swift)(PencilKit)PencilKitを使いページング機能付きお絵描きアプリの実装方法

# はじめに
PencilKitを使ったお絵描きアプリの実装方法の記事はよく見かけるがページング付きのお絵描きアプリの記事は見かけません。あと実際に実務で開発した時に苦労したので、忘備録として投稿してます。
# この記事の対象者
・PencilKitを使ったお絵描きアプリを実装したい方
# このアプリでできること
・一つの画面で描画しながらページングできる
・次へボタンで新しいページを作成
・キャンバスに背景色/背景画像を指定
・キャンバスの描画情報と背景色/背景画像を合成して、1枚の画像に変換
・ToolPickerの出し入れ
またのちほど書いていきます

元記事を表示

Firebaseプロジェクトの作成(Flutter)

## 概要
FlutterアプリとFirebaseを接続するための準備をします。
Firebaseの設定~Flutterプロジェクトのビルドが通るようになるまで

### 前提
デフォルトのカウントアプリを改変して作っているので、
諸々名前が違かったらごめんなさい!
メモ程度でしかないので、ご参考までに〜

## Android
![スクリーンショット 2022-06-30 18.13.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/ea1c6e5c-6ae0-13ae-c8a5-e70778cf7166.png)

/{PROJECT_NAME}/android/app/src/main/AndroidManifest.xml
にある
“`

“`

PACKAGE_NAMEをコピーし、

元記事を表示

TestFlightで毎回表示される「輸出コンプライアンスがありません」の設定を省略する方法

# 目次
[1.やりたいこと](#1-やりたいこと)
[2.解決策](#2-解決策)
[3.まとめ](#3-まとめ)

# 1. やりたいこと
AppStoreでTestFlightをアップロード後、毎回「輸出コンプライアンスがありません」が表示され、
下記のような質問事項に毎回答える必要があるため、これを省略したい。

スクリーンショット 2022-06-22 14 34 18
スクリーンショット 2022-06-22 14 34 18

元記事を表示

TB(D)RにおけるGPU時間の計測に関する注意; スマホ?でdraw callのGPU時間は計測できない

クリックベイトサムネイル:
![RenderDoc Event Browser](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100016/b975b455-1140-3bd8-4341-b9ece3e5c56c.png “RenderDoc Event Browser; スマホで Duration の値に意味はない”)
これだけでは何の説得力も無いので, ここではこれらGPUアーキテクチャの動作をはじめ, ドライバの開発者の発言やソースコードの引用を含めた様々な根拠や状況証拠などを挙げて論証する.

# TL;DR

##### 結論
モバイル端末のGPUにおいて, render pass 内のGPUタイムスタンプは, 何らかの意味をなす値を持たない:
– draw call(s) ごとのGPU時間の計測を考えることはできない; そのように呼べる実行の単位そのものが, 存在しない.
– 意味をもって計測できるグラフィクスパイプラインのGPU時間の最小の単位は render pass (≈レンダーターゲット

元記事を表示

【Flutter】インテグレーションテストでスクリーンショットを自動で取得する。

Flutterを使って個人で以下のスマホ向けのおみくじアプリ(大御心アプリ)を開発・運用しています。

Screenshot_home.png
Screenshot_fortune_1.png
Screenshot_fortune_2.png【Xcode】”XXXXXX”をインストールできませんでした

# はじめに
![スクリーンショット 2022-07-24 18.58.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/359e04e6-07d6-a0c8-dfe4-fe0808aeb6aa.png)
“`
あとでやり直してください。
“`
“`
Watch-only apps cannot be contained in companion apps installed on the companion.
“`

SwiftUIレイアウト一本勝負をやっていたところ上のような状態になってしまってシュミレーターでビルドできなくなってしまいました。
発生条件と解決方法を記事にしておきます。

# 発生条件
① シュミレーターでApple Watchをビルド
② 起動しているApple Watchを停止する
③ iPhoneでビルド ← ここで発生

# 解決方法
「Product」を選択し、「Clean Build Folder」を押します。
![スクリーンショット 2022-

元記事を表示

iOSでアプリ内課金を実装する(サーバーサイド)

# はじめに

個人的な備忘として、iOSアプリでアプリ内課金を実装する際のHowToやノウハウを残しておく。

**動いていることは確認しているが、あまり洗練されている気がしない。。。**
**[App Store Server Notifications](https://developer.apple.com/documentation/appstoreservernotifications) を利用すれば、多分、もう少し良い具合に実装できそう。**
**ベストプラクティスだとは思わないで頂けると。。。**

# 処理

以下、時系列に従って実装の概要・勘所を説明する。

## 1. アプリ内課金を実施する

割愛(サーバーから商品情報取得したり、App Storeで決済したり)

## 2. アプリでレシートを取得する

アプリ側の実装として、以下のコードを参考にApp Storeからレシートを取得する。
取得したレシートは、サーバーへ送信し、検証・商品提供を行う。

“`swift
// エラーハンドリングは割愛
let url = Bundle.main.appSt

元記事を表示

(Swift) (MultipeerConnectivity) Bluetooth等でiOSの端末間の通信(P2P通信)を実装する方法

#目次
# [1.はじめに](#1-はじめに)
端末間通信(P2P)をするアプリを開発する際にめちゃくちゃ苦労したので、今後はこの機能をスムーズに開発するために概要から実際のサンプルコードをここに残します。
この記事を見ればMultipeerConnectivityライブラリを使っての端末間通信のアプリを開発できるようになると思います。
この記事では近距離通信の機能を実装していきます

# [2.この記事の対象者](#2-この記事の対象者)
・BluetoothやWi-Fiを使って端末間の通信アプリを開発したい方
・MultipeerConnectivityを使って何らかの通信アプリを開発したい方
・MultipeerConnectivityのサンプルコードを使いたい方
# [3.接続手順](#3-接続手順)
1、端末間通信をサポートするMultipeerConnectivityライブラリを導入
2、[MCPeerID](https://developer.apple.com/documentation/multipeerconnectivity/mcpeerid)を発行(端末を識別す

元記事を表示

【Xcode】シュミレーターAppleWatchの言語変更方法

# はじめに
https://qiita.com/SNQ-2001/items/c72bca5e8c1eefe9cd29

↑これの続きです。

今回はシュミレーターAppleWatchの言語の変更方法です。

# 現状
iPhone – 日本語
AppleWatch – 英語
![スクリーンショット 2022-07-22 23.35.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/faf2608e-0a7d-9b3b-101d-7f2830826562.png)

# 問題点
「5分前」と表示するところが「5 minutes ago」と表示されてしまってレイアウトが崩れています。
|✅日本語|❌英語|
|-|-|
|![twitter_FYFEpZfacAETTAa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e8db841f-1d8f-7227-8855-b9f7e9e02e50

元記事を表示

Windows11へios-webkit-debug-proxyをインストールして、chrome://inspect/で iOS Safariデバッグする。

# はじめに
iOSデバイスで動作しない、Javascriptがある。Windows,MacOS,Androidの各デバイス、ブラウザでは動作するのに、iOSデバイスでのみChromeでもSafariでもだめだ。さて、デバッグしたいのだが・・・iPhoneのブラウザでデバッグ情報ってどこに出てくるの?

これが、ことの始まり。対応策としては、掲題の方法があるとのことで試してみた。

# セットアップ
セットアップ方法については、先達に従う。説明丸投げ。
https://zatta.link/web/debug-ios-safari-with-windows.html

執筆時点で64bitWindowsのPoweshellでの操作においては、64bit 1.8.8 がインストールされた。
“`
PS C:\Users\microsoftaro> scoop install ios-webkit-debug-proxy
Installing ‘ios-webkit-debug-proxy’ (1.8.8) [64bit]

..
“`

注意点としては、Windowsに npm

元記事を表示

OTHERカテゴリの最新記事