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

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

【SwiftUI】バッジの見た目を変更する

# はじめに
iOS17から`badgeProminence`というバッジの見た目を変更するメソッドが追加されていたので使ってみました

# 実装
### standard
“`diff_swift
List(0..<10) { index in Text(index.description) .badge(index) } .badgeProminence(.standard) ```

### decreased
“`diff_swift
List(0..<10) { index in Text(index.description) .badge(index) } .badgeProminence(.decreased) ``` iOS17以降から使えるObservationについて

## はじめに
iOS17以降から`Observation`という新たな状態監視のFrameworkが使用できるようになりました。
しかし、状態監視のFrameworkとしてはすでに`Combine`が存在しています。
今回は新たに登場した`Observation`と`Combine`を比較しながら、`Observation`について見ていきます。

## `Observation`について
まずは、`Observation`と`Combine`の書き方を比較していきます。
今回はボタンをタップすると表示されている数字がインクリメントしていくViewをそれぞれ作成して比較していきます。

### `Combine`による状態監視
`CounterViewState`は`ObservableObject`を実装し、`@Published`を付与したプロパティの値を監視しています。
`CounterView`は`StateObject`を使って`CounterViewState`を監視可能なオブジェクトとしてインスタンス化することで、`CounterViewState`の状態が変化した際に

元記事を表示

モバイルアプリのアクセシビリティ対応(スクリーンリーダー、VoiceOver)

# はじめに
以前に[プロジェクトで行ったVoiceOver対応(読み方の変更)](https://qiita.com/repepe2en/items/42c8dc1e679a31c96c24)を投稿しましたが、今回はアプリ全体で行った対応について、目標にしているところとその対応方法をまとめて備忘録としてまとめます。

自分の参加しているプロジェクトでは[Apache Cordova](https://cordova.apache.org/)というモバイルアプリ開発向けのフレームワークをベースに開発を行っています。
技術的には3割ほどネイティブの実装で他はwebの技術を利用しています。
なので、iOS,Androidとタグにありますが、この記事ではHTML,TypeScriptでの対応方法です。

# 方針

[Web Content Accessibility Guidelines (WCAG) 2.0](https://waic.jp/translations/WCAG20/Overview.html)に準拠したアプリの実現。
[WAI-ARIA](https://develope

元記事を表示

Web Share API で、canvasに描画した画像と、指定したハッシュタグをTwitterの投稿にコピーペーストする

## 使用想定シーン
画像合成して特定のハッシュタグでつぶやくキャンペーンの時に、サーバーや端末に合成画像を保存させずにコピーペースト操作でハッシュタグと画像をツイートしてもらう。

### html
“`


“`

### script
“`
const previewCanvas = document.getElementById(‘js-previewCanvas’);
const previewImage = d

元記事を表示

【SwiftUI】ScreenTimeAPIで特定のアプリを一定時間全く使用できないよう制限する

本記事ではScreenTimeAPIを用いて、他のアプリの使用を制限する方法を紹介します。

## はじめに

作業をしている途中に、つい息をするようにXを開いてしまい、集中が途切れてしまうことは誰にでもあると思います。
AppleにはScreenTimeAPIという機能が用意されており、他のアプリを制限できるようカスタマイズすることが可能です。

## ScreenTimeAPIとは

WWDC2021にはScreenTimeAPIが発表され、`FamilyControls`、`ManagedSettings`、`DeviceActivity`という3つの新しいフレームワークが導入されました。

– **Family Controls**
ScreenTimeAPIへのアクセスを認証。アプリやウェブサイトを識別するために使われる透過トークンを提供して、ユーザープライバシーを保護する。

– **ManagedSettings**
ScreenTimeで設定可能な制限を適用し、アプリの使用制限や、Webサイトのフィルタリング等の、アクティビティを制限すること可能。

今回は上記2つのフ

元記事を表示

【Swift】特定の要素の次の要素、前の要素を取得する

# はじめに
やりたいことはタイトルの通りです。
1番前にいる時に前の要素を取得しようとすると、1番後ろの要素を取得したいです
1番後ろにいる時に前の要素を取得しようとすると、1番前の要素を取得したいです

# 実装
“`swift
struct XXX {
let id: String
}

let array: [XXX] = [XXX(id: “000”), XXX(id: “001”), XXX(id: “002”), XXX(id: “003”), XXX(id: “004”)]

let selectedItem = XXX(id: “003”)

func currentItemIndex(selected: XXX, in array: [XXX]) -> Int? {
if let index = array.firstIndex(where: { $0.id == selected.id }) {
return index
} else {
return nil
}
}

func previousI

元記事を表示

非日本語圏日本語フォント問題、SwiftUIにおける対処事例(2023年中旬)

デバイスの言語設定で日本語を選択していないような場面において、日本語文章のフォントが想定外のものになる現象は多くのデバイスで発生する。

![例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3564662/c5929b30-7929-3770-da82-ba9ad7fb94f6.png)

今回は2023年中旬にAppleプラットフォーム向けアプリに実施したSwiftUIにおける対処事例を紹介する。

# 参考
2015年に公開された下記のブログポストを参考にした。このポストでは「本現象の解説」と「UIKit環境におけるNSAttributedStringを用いた解決策」を示している。また、本現象のことを「中華フォント現象」と呼んでいる。

https://qiita.com/usagimaru/items/46c27c42e862fb8aba7e

# 対象アプリ

https://apps.apple.com/app/id1620268476

![アプリ.png](https://qiit

元記事を表示

古いバージョンのXcodeをインストールする方法

以下のURLから対象のXcodeのバージョンを見つけてファイルをダウンロードする
https://developer.apple.com/download/all/?q=Xcode

元記事を表示

SwiftUI ProgressViewのカスタマイズでできること・できないこと

# はじめに
本記事で取り上げるカスタマイズの内容はユースケースが限定的ですが、誰かしらのためになれば嬉しいです。
Horizontalな進捗バーを扱います。

# 標準のスタイル
`value`に0.0〜1.0を指定すると、進捗バーを実装できます。

“`swift
ProgressView(value: 0.5)
“`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/2ad4be00-0075-8c3d-6a01-0db5a34454eb.png)

# バーの色を変える
`tint(_:)`を使うとバーの色を変えることができます。

“`swift
ProgressView(value: 0.5)
.tint(.green)
“`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/b3693810-eb92-96fd-4d88-41791d486

元記事を表示

[iOS] Firebase Authenticationで匿名認証してからAppleIDと紐付ける方法

iOSアプリでは初回登録時にログインを必須にするとリジェクトされてしまい、初回ユーザーはログインなしで使ってもらうようにする必要がでることがあります。

これについてはFirebaseの[匿名認証](https://firebase.google.com/docs/auth/ios/anonymous-auth?hl=ja)を使うことで対応できます。

ただこれだけだと機種変時にデータが受け継がれないので、あとでなんらかのアカウントと紐づけできるようにしておく必要があります。ここではAppleIDでの連携について説明します。

## 環境
– Xcode14
– Firebase 10.14.0

## 匿名認証

[公式ドキュメント:Apple プラットフォームで Firebase 匿名認証を行う](https://firebase.google.com/docs/auth/ios/anonymous-auth?hl=ja)

### Firebaseコンソール側
– Firebase コンソールの [Authentication] セクションで、[Sign-in method] の

元記事を表示

Flutterってどうなん?実際に商用アプリ開発で使ってみた感想

これまで3年ほどWebエンジニアとして働いており、いろいろあって今年からFlutterでモバイルアプリを開発しています。

Flutterを使い始めて半年が経ったので実際に使ってみて感じたいいと思ったところとイマイチだと思ったところを紹介したいと思います。

# Flutter とは?

Flutter は 複数のプラットフォームに対応したオープンソースなフレームワークです。現在では、Android・iOS・Web・Windows・MacOS・Linuxに対応しており、単一のコードで複数のプラットフォーム上で動作可能なアプリケーションを作成することができます。

https://flutter.dev/

# 実際に使って感じたいいところ、イマイチなところ

## いいところ

### 学習コストは意外と高くない

Flutterでは、Dartという言語を使います。

https://dart.dev/

個人的な感想としては、Javascript, Typescript に似ているなーと思っています。
なので、Webをずっと触っていた私はすんなりと入ることができました。

型定義がで

元記事を表示

【SwiftUI】PhotosPicker使ってみた

# はじめに
PhotosPickerを使ったことがなかったので次回からスムーズに使えるように`PhotosPicker`の最小単位を記録しておきます。

# 実装
### 写真を1枚選択する
“`swift
import SwiftUI
import PhotosUI

struct SwiftUIView: View {
@State private var selectedPhoto: PhotosPickerItem?

@State private var uiImage: UIImage?

var body: some View {

VStack {
if let uiImage {
Image(uiImage: uiImage)
.resizable()
.scaledToFit()
.padding(20)

元記事を表示

【Xcode Cloud】Run Build Tool Plug-insを追加すると失敗する

# はじめに
Xcodeにプラグインを追加したらXcode Cloudが失敗するようになったので解決方法を記録しておきます。

# やりかた
① 「ci_scripts」というフォルダを作成します
![スクリーンショット 2023-09-23 19.29.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/8eb31105-1945-14a0-0375-064cc26c935d.png)

② 「ci_post_clone.sh」というスクリプトを作成します
![スクリーンショット 2023-09-25 14.41.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/662a3b98-ccfd-a11c-5f81-1274ec54aa73.png)

③ 「ci_post_clone.sh」を以下のように編集します
“`ci_post_clone.sh
#!/bin/zsh

defau

元記事を表示

[Swift] PRをマージした時にSwiftFormatを実行するGithub Actionsを作成する

PRがmainにマージされた時にSwiftFormatを実行したら思ったより便利だったので、備忘録として残しておきます。

# 実装
SwiftFormatを実行するためにMintを使用しています。

“`yml
name: Format

on:
push:
branches:
– main

jobs:
format:
name: SwiftFormat
runs-on: macos-13
env:
MINT_PATH: mint/lib
MINT_LINK_PATH: mint/bin
steps:
– uses: actions/checkout@v4

– name: Select Xcode 15.0
run: sudo xcode-select -s /Applications/Xcode_15.0.app

– name: Install mint
run: brew install min

元記事を表示

[iOS] Localizable.strings からString catarogsに移行する

# はじめに
`Localizable.strings`使って多言語対応していたものをXcode15から使える`String catarogs`に移行してみました。

https://developer.apple.com/documentation/Xcode/localizing-and-varying-text-with-a-string-catalog

# 環境
Xcode 15.0

# 内容

まずは既存の`Localizable.strings`を`Migrate to String Catalog`していきます

`Localizable.strings`を選択してMigrate

React Native入門 プロジェクト作成まで

## はじめに
React Nativeの環境構築の手順や、基礎知識について、メモ代わりに書いていきます。

## React Nativeとは
以下の記事から抜粋しました。

React Nativeとは?~特徴やメリットデメリット、事例を紹介~

React Nativeとは、Facebook社が開発したアプリケーションフレームワークでクロスプラットフォームのひとつです。React Nativeを用いることでiOS、Android、Windows、macOSなど、異なるプラットフォームのアプリを同時開発することができます。なお、React Nativeの開発言語にはJavaScriptが用いられています。

Reactは、UIを構築するためのJavaScriptライブラリで、2012年にFacebookのソフトウェア・エンジニアが開発したものになります。社内で開発された後には、Facebook.comやInstagram.com等にも導入されています。

つまり、React NativeはスマホアプリをReactの記法で開発できる、クロスプ

元記事を表示

【SwiftUI】iOS16.4以降のsheetを完全に理解する

# はじめに

# 基本実装
本記事で扱うサンプルコードの全コードです。
今後はここから端折っていくので試す方はこちらのコードに追加してください。
“`swift
import SwiftUI

struct Sample1View: View {
@State private var isPresented = false
var body: some View {
Button {
isPresented = true
} label: {
Text(“表示”)
}
.sheet(isPresented: $isPresented) {
Sample2View()
}
}
}

struct Sample2View: View {
@Environment(\.dismiss) private var dismiss
var body: some View {
Button

元記事を表示

【SwiftUI】モーダル表示の却下

# この記事は何?

SwiftUIアプリの[シートやポップオーバー表示を取り消す方法](https://developer.apple.com/documentation/swiftui/dismissaction)について、Appleの開発者向けドキュメントを独自に解説する。

> Swiftを基礎から学ぶには
自著、工学社より発売中の「[まるごと分かるSwiftプログラミング](https://amzn.asia/d/7YPWJwl)」をお勧めします。変数、関数、フロー制御構文、データ構造はもちろん、構造体からクロージャ、エクステンション、プロトコル、クロージャまでを基礎からわかりやすく解説しています。

# dismissプロパティ

`Dismiss`環境値を使用して、特定の`環境`に対してこの構造体のインスタンスを取得する。
次に、インスタンスを呼び出すと、表示の取り消しを実行する。
インスタンスを呼び出すときにSwiftが呼び出す`callAsFunction()`メソッドを定義するため、インスタンスを直接呼び出す。

このアクションを使用して、次のことができる。

元記事を表示

iOS URLのQueryに使うvalueをパーセントエンコーディングする

# まとめ
URLのQueryのvalue用のCharacterSetを作成して、`addingPercentEncoding`を使ってパーセントエンコーディングを行います。

# はじめに

例えば、パーセントエンコーディングしたいクエリを含んだURLを生成したいと思います。
今回はURLComponentsでURLを組み立ててみることにします。
クエリはパーセントエンコーディングしたいので、`addingPercentEncoding`で`urlQueryAllowed`を設定してURLを生成してみました。

“`swift
var c = URLComponents()
c.scheme = “https”
c.host = “example.com”
c.path = “/book”
c.query = “title=独習C++”.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)

let myUrl: URL = c.url!

print(myUrl) // https://example.com

元記事を表示

[SwiftUI] sheetを快適に高速開閉するためのハック

# はじめに
SwiftUIのsheetを閉じるとき、sheetが完全に閉じきるまで、次のsheetを開くことができません。
再度開くには、前のsheetが完全に閉じてからもう一度開くボタンを押す必要があるため、せっかちなユーザーはうんざりするかもしれません。

![sheet_before.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875930/f1bf7691-c7e6-e3b1-d8d2-b529870c92ec.gif)

また、タイミングによっては、sheetが自動で無限に開閉を繰り返してしまうというバグも発生するらしいです(そうなったらAppをkillするしかないとか)(手元では再現できず…)

こんな(ニッチな?)問題を解決するためのpropertyWrapperを実装してみました。

# 実際の動作
sheetが完全に閉じる前にOpenボタンを押すと、閉じた瞬間に自動で次のsheetが開きます。

![sheet_after.gif](https://qiita-image-sto

元記事を表示

OTHERカテゴリの最新記事