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

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

[Xcode]Xcode13へアップデート後に発生したNavigationBarの不具合の対処法

## 投稿経緯
業務で開発中のアプリが、Xcode13ヘアップデートした際に、`NavigationBar`のUIが崩れると言う不具合が発生しました。現状解消されているので共有したいと思います。

## 環境
macOS BigSur バージョン 11.6
Swift バージョン 5.5
Xcode バージョン 13.0

## 症状
`pushViewController`で遷移した先のNavigationBarに遷移元のNavigationBarのUIと遷移後のUIのふたつともが表示されUI崩れが発生するという不具合です。

## 対処法
どうやら`iOS15`ではラージタイトルだけでなくすべてのナビゲーションバーに`scrollEdgeAppearance`が適用されるようになったようで、iOS15未満と同じ挙動にするにはscrollEdgeAppearanceを指定する必要があるようです。

具体的に必要なコードは以下の通り?

“`swift
let appearance = UINavigationBarAppearance()
appearance.background

元記事を表示

【iOS】Metal Best Practicesの解説(10)レンダーコマンドエンコーダー

[Metal Best Practices](https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/MTLBestPracticesGuide/index.html#//apple_ref/doc/uid/TP40016642-CH27-SW1)は、iOS/MacOS/tvOSのAPIであるMetalを用いた設計のベストプラクティスガイドです。

本稿では、何回かに分けてこのガイドを読み解き、コード上での実験を交えて解説していきます。
読んでそのまま理解できそうなところは飛ばしますので、原文を読みながら原文のガイドとしてご利用下さい。
また、iOSの記事なので他のOS(MacOS, tvOS)についての記載は割愛します。

他の記事の一覧は、初回記事よりご覧下さい。

https://qiita.com/TokyoYoshida/items/521619d6d8dd8d8ef9e4

### [Render Command Encoders (iOS and tvOS)(レンダーコマ

元記事を表示

[iOS] carthage で XCFramework に対応する

##現象
xcode 13 も正式リリースされ、carthage で入れるライブラリをビルドしたところ、以下のエラーが発生しました。
>XXXX have the same architectures(arm64) and can’t be in the same fat output file.

##詳細
xcode 12 以降では M1CPU(ARM64系)のMac上のエミュレーターに対応したため、iOS 用とエミュレータ用で2つの arm64 が存在することになり、carthage のビルドに失敗することがあります。
 
以前は Carthage 本家に、以下のようにスクリプトで対応する方法がありました。
https://github.com/Carthage/Carthage/blob/master/Documentation/Xcode12Workaround.md
しかし今回、xcode 13 ではこの方法ではビルド出来ず、上記のエラーが発生しました。

##解決法
対応としては、framework ファイルではなく、XCFramework をビルドすることによって解決で

元記事を表示

Flutter 検索バー作成

#背景

以前書いた記事
[flappy_search_barの使い方](https://qiita.com/mkurom/items/e94b60eea15d4239ac43)
で使用したライブラリーがDISCONTINUEDになったことと、やりたかったことができない部分があったので、自作してみた。

#環境

PC : macOS Big Sur(インテルCPU)
エディター : Visual Studio Code
Flutter : 2.2.1

#状態管理
provider + changenotifier

#コード

“`main.dart
import ‘package:flutter/material.dart’;
import ‘package:provider/provider.dart’;

import ‘search_bar/my_app.dart’;
import ‘search_bar/search_controller.dart’;

void main() {
runApp(
MultiProvider(
provide

元記事を表示

【iOS】同サイズのWidgetをWidget Galley に並べる方法

#WidgetBundle
WidgetBundleを利用することで、同サイズのWidgetや異なる種類のWidgetをWidgetGallery上に並べることができます。

##通常のWidget表示
通常は下記のようにWidgetクラスを継承した構造体に対してmain属性を指定し、以下で言うTestWidgetをエントリーポイントに指定します。この方法ではIntentConfigurationのコンテントに指定したViewのみをWidgetGalleryに表示することしかできません。また**systemSmall、systemMedium、systemLarge**のサイズごとにしかWidgetGalleryに表示できず、同サイズのWidgetを並べることはできません。

“`swift
@main
struct TestWidget: Widget {
var body: some WidgetConfiguration {
IntentConfiguration(kind: “Test”, intent: ConfigurationIntent.sel

元記事を表示

[iOS15 Safari] Canvas2Dの文字列描画でページがクラッシュする場合がある

# クラッシュする条件
* iOS 15 で Safari などの AppleWebKit エンジンを使用しているブラウザ。
* Canvas2D で ASCII 文字以外を描画しようとしている。
* フォント設定値が `20px -apple-system` のように、文字の大きさと `-apple-system` が隣接している。

# 問題のコード
“`main.js
let ctx = canvas.getContext(“2d”);
ctx.font = “20px -apple-system”;
ctx.fillText(“日本語文字列”, 20, 20);
“`

# 解決方法
`20px normal -apple-system` のように、文字の大きさとフォント名の間に必ずフォントウェイト指定を挟むようにする。

# その他
html2canvas もこの問題に巻き込まれるので、この場合は CSS に対して上の解決方法を適用すると良い。

元記事を表示

iOS15から追加されたiCloud+のプライベートリレーを試す

# プライベートリレーとは?
iOS15から提供が開始されたiCloud+の機能の一つになります。(9/21時点ではベータ版)
有効にすることで、Safariを利用したWebサイトの閲覧履歴や接続元情報(IPアドレス)が匿名化されます。

https://developer.apple.com/jp/support/prepare-your-network-for-icloud-private-relay/

– wwdc
– https://developer.apple.com/videos/play/wwdc2021/10096/

今回はこの機能について実際に試してみようと思います。

# プライベートリレーの仕組み
## OFF
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/7fbad363-45fb-ee21-6092-c33b239f362a.png)

## ON
– Ingress ProxyとEgress Proxyが仲介役となることでServe

元記事を表示

iOSDC 2021 「バックグラウンドでアプリがキルされても怖くない!アプリの状態を元に戻すリストア機能の全て」の補足

#はじめに
iOSDC 2021 Day2、[バックグラウンドでアプリがキルされても怖くない!アプリの状態を元に戻すリストア機能の全て](https://fortee.jp/iosdc-japan-2021/proposal/32884426-2602-445f-a456-42cd1b9838e7)について登壇させていただきました。
トーク賞を取ろうと色々な手段でコメントをもらえる策を講じていたのですが届かず。残念。

後日動画がYouTubeにアップロードされる予定なので、動画が公開されたら更新します。

以下は伝えてなかったことや質問やコメントについての補足になります。

## SceneDelegate NSUserActivityのUserInfoについて

NSUserActivityのUserInfoは`[AnyHashable : Any]` となっていますが、入れられる値の型はドキュメントにあるとおり、 `NSArray, NSData, NSDate, NSDictiona

元記事を表示

init イニシャライザ とは? 数行で解説

#init とは?
イニシャライザのことであり、構造体・クラスに初期値を設定する処理。

実際に定義した、構造体・クラスを使うときに、
初期値が設定されていないと、使えないようにすることができる。

「おー便利。初期値が設定されていないと、処理が行えないことがありますもんね。」

#失敗可能性イニシャライザってなんぞや
initに「?」をつけて、

““
init?
““
で定義できて、初期値が設定されてなかったときに、
結果をオプショナル型のnilで返してくれる役割があります。

構造体・クラスを使うときに、初期値が入力されていなかったときに、nilで返すことができ、
また、入力されているときは、初期値を設定することができます。
構造体を安全に用いるために、必要なイニシャライザになっています!

###勉強したことをすぐ忘れるので、記しておきます。

元記事を表示

[swift] sqliteベースでオブジェクトデータベースを作ってみた

世間はiOSDC一色のようですが、辺境地でまったり独自で変な研究をしたのですが、一旦研究をフリーズさせる事にしたので、これまでの成果を記録に残す意味で、ここに記します。

最近、別件で技術的な難問に取り組んでいたのですが、その解決方法にオブジェクトデータベースを使えばいいのではないかと考え始め、試行錯誤した末に独自にオブジェクトデータベースを作ってみようと思い色々試していました。が、本来の技術的な難問は別の方法で解決でできるかもと思い始めたので、このプロジェクトを中断しようと思ったのですが、プロジェクト自体は面白そうなので、将来このプロジェクトに戻ってきた時の為の自分への記録とする事とします。

このプロジェクトが前進する毎に、なんか劣化版Realmを研究開発しているみたいで、モチベーションが下がります。が、テーマとしては面白いと考えているので、気分は持ちようです。

`NSObject`はなんだかんだ言ってやはり優秀です。この`NSObject`のアーカイバと`SQLite3`を活用すれば面白そうなオブジェクトデータベースができそうだと思いました。コードはここから取得可能です。

h

元記事を表示

iOSDC Japan 2021楽しかった!!? ?

今回は技術というより、iOSDC Japan 2021に参加してみて
単純に楽しかった!!? ? ?
というので記事を書こうと思います。

一応登壇させて頂いたのですが、

https://fortee.jp/iosdc-japan-2021/proposal/f4eeade3-e50b-4a49-91dc-22bbba321ecb

そんなことより、iOSDCの多くの方の参加者・スタッフ・スポンサー・スピーカー(4つのS)によって
こんなに楽しい雰囲気になるんだなと思いました。

イベントも色々あり、実行委員長が突然セグウェイに乗って登場したり、

![スクリーンショット 2021-09-20 3.15.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308423/9b2dd259-4693-dbc1-5076-a25c9516c93f.png)

LTで機器トラブルか何かで接続が切れてしまった、[ころころ](https://twitter.com/corori_22) さんの
再チャレンジをみん

元記事を表示

PAYJPで入力されたクレジットカード情報を取得する(iOS,Swift)

PAYJPを導入したiOSアプリで入力されたクレジットカード情報を取得する方法を見つけるのに苦戦した。

## PAYJPで入力されたクレジットカード情報が必要になる機会

・CardFormViewControllerに入力された名前をバリデーションする
・SDKのUIを使わずに直接トークンを生成する
・カードフォームを利用せずトークン化してバリデーションを行う

といった場合に必要になる。

## PAYJPで入力されたクレジットカード情報を取得するコード(Swift)

決済処理を行うファイルにて「import PAYJP」をして以下のコードを記述。
*CardFormViewControllerの実装コードは省略しています。

“`swift

func cardFormViewController(_ formController: CardFormViewController, didProduced token: Token, completionHandler: @escaping (Error?) -> Void) {

print(token.card.i

元記事を表示

iOSのショートカットアプリでPythonコードを実行する方法

# 概要

iOSのショートカットアプリはURL (データスキーム) にJavaScriptを埋め込み、「WEBページの内容を取得」を使うことでJavaScriptを実行できます。これと[Brython](https://brython.info/)を組み合わせたらPythonコードを実行できましたので、手順をまとめます。

この方法で作成したショートカットはApple Watchでも動作しました。

# 手順
### 1. Python実行用の汎用ショートカットを作成する
下記のショートカットを作成して、名前を「Python実行」にしてください。
![Python実行_ショートカット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759601/ccad1c2b-79d9-0ed8-80cd-b2084b368692.png)

「テキスト」は下記を入力してください。

“`html