iOS関連のことを調べてみた

iOS関連のことを調べてみた
目次

AWS PinpointでiOSにプッシュ通知を送信する際のAPNS環境の違いとテストフライトの注意事項

こんにちは、開発部の天津炒飯です。

自分はステージング(STG)環境でテストフライトにプッシュ通知を送信できず、苦戦した経験があります。そこで、APNSのそれぞれの環境の違いと、STG環境でのテストフライトの注意事項を紹介したいと思います。

## APNS Product環境とSandbox環境の違い
### 1. Production環境
* **用途:** 本番環境で実際のユーザーに対してプッシュ通知を送信するために使用します。
* **証明書:** Apple Developerアカウントで取得するProduction用のAPNS証明書が必要です。
* **トークン:** 実デバイスで発行されたデバイストークンを使用します。
* **Pinpointチャンネル:** APNS
### 2. Sandbox環境
* **用途:** 開発およびテスト環境でプッシュ通知の動作を確認するために使用します。
* **証明書:** Apple Developerアカウントで取得するSandbox用のAPNS証明書が必要です。
* **トークン:** 実デバイスまたはシミュレーターで発行さ

元記事を表示

【SwiftUI】Listが1番下までスクロールした事を検知する

# 概要
SwiftUIにおいて、Listが1番下までスクロールされたことを検知するベストプラクティスを紹介します。

色々調べてみて、`GeometryReader`や`UIScrollView`を使用するやり方がありました。今回は`List`の性質を利用したやり方でやってみたいと思います。

# サンプルコードの概要
1. Listに数値を表示して、1番下までスクロールした事を検知
2. Listを更新する際に変なとこに?スクロールしないようにする

# やり方
### 1. Listに数値を表示して、1番下までスクロールした事を検知
まず、ListとForEachで適当なViewを作成します。Listには数値を表示します。

“`: ContentView
List {
ForEach(viewModel.numbers, id: \.self) { number in
Text(“Number \(number)”)
.frame(height: 100)
}
}
“`
また、今回データは以下のViewModelで定義

元記事を表示

【Flutter】文字列操作: 特定の文字列を語尾に含む場合に削除する方法

## 本記事で紹介すること

Flutterの文字列(String)において、特定の文字列を含む場合、該当の語尾を削除する方法

## 解決方法

replaceAll関数を用いて、正規表現で文末を意味する”$”を使って、文末に特定の文字列が一致するかを検索して、空文字””で入れ替える。

## 実際のコード

“`dart:main.dart
void main() {
// 例の文字列
String text1 = “bukunya”;
String text2 = “bukuku”;
String text3 = “bukumu”;
String text4 = “This is a test”;

// 文末が “nya”、”ku”、”mu” のいずれかであれば削除
String result1 = removeEnding(text1);
String result2 = removeEnding(text2);
String result3 = removeEnding(text3);
String result4 = remove

元記事を表示

ネットワーク復旧後にモバイルアプリの計装データが送信されることを確認してみた!

# 概要
モバイルアプリをNew Relicのエージェントを使ってモニタリングしている際にネットワークがオフラインになるとその間のデータはNew Relicに送付できない可能性があります。

New Relic アップデート(2024年3月)の中で、**『オフラインストレージでデータロストを最小限に』** というアップデートがあったので、今回はAndroidのエミュレーターを使ってイベントデータがネットワーク復旧後に送信されることを確認してみたいと思います!

:::note info
このアップデートの詳細はこちら
[New Relic アップデート(2024年3月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202403 “New Relic アップデート(2024年3月)”)
:::

# 手順
## 1. AndroidのアプリにNew Relicのエージェントを設定
今回はAndroid StudioのNew Projectから[Empty Activity]を作成して、New RelicのAndroidエ

元記事を表示

xcodebuildでx86向けの.appファイルを作成する

[Maestro](https://maestro.mobile.dev/)でUITestを行っている際に.appファイルを作成する必要があったためメモ

※MaestroがARM64のビルドに非対応で、x86ビルドを行った

xcodebuildを使って作成

“`
xcodebuild \
-workspace WORKSPACE_NAME \
-scheme SCHEME_NAME \
-destination ‘generic/platform=iOS Simulator’ \
-derivedDataPath ./build \
clean build
“`

`build/Build/Products/Develop-iphonesimulator/(APP_NAME).app`に.appファイルが作成される

元記事を表示

#14 Airtableを利用してiOSアプリを開発する

今回は、以前作成した地図クイズアプリを基に発展させて行います。このアプリはAirtableからデータを取得し、UITableViewに地図の名称と画像を表示します。ネットワークリクエストにはURLSessionを使用し、サードパーティライブラリのKingfisherを使ってネットワーク画像を読み込みます。

![Simulator Screen Recording – iPhone 15 Pro – 2024-05-20 at 16.52.57.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3703986/bdc48ca5-a62d-61f3-87e6-58e3197880a6.gif)

## Airtableデータベースの設定
まず、Airtableでデータベース(ベース)を作成し、必要なテーブルとフィールドを追加しました。この例では、mapInfoという名前のテーブルがあり、以下のフィールドを含んでいます:

###### areaName:エリアの名称
###### areaInfo:エリアの情

元記事を表示

@escapingについて


## はじめに
情報科学専門学校3年生のごみちゃんです!
今回は普段何気なく使っていた@escapingについてまとめてみました!

## @escapingとは
@escapingはクロージャを破棄せずに取っておいてくれる便利な機能で、非同期処理などを行う際によく書かれる

APIを叩いたり、データベースを使うときは即座に処理を終えられない可能性が出てくるので、引数に(completion: @escaping () -> Void)と記述して、completionでAPIで取得した値、またはエラーを返す

“`swift
func getUserInfo(email: String, completion: @escaping (Result) -> Void) {
if let tokenData = KeychainManager.shared.get(service: “BOOK APP”, account: em

元記事を表示

【Flutter】Patrolでテストを書く(基本編)

## はじめに

[【Flutter】Patrolでテストを書く(導入まで)](https://qiita.com/yyyy_yk/items/371c9ef67e81e39a7f58) の続きです。
実際に`patrol`で統合テストを書いて実行します。
最終的なゴールはネイティブビューをテストすることですが、まずは`patrol`で基本のテストを書いてみます。

※ [Finder](https://api.flutter.dev/flutter/flutter_test/Finder-class.html)や[WidgetTester](https://api.flutter.dev/flutter/flutter_test/WidgetTester-class.html)の基本的な使い方については触れません。

## 環境

・flutter: 3.19.6
・dart: 3.3.4
・patrol: 3.6.1
・patrol_cli: 2.7.0

## 基本のテスト

まずはFlutterプロジェクト作成時にデフォルトで用意されているDemoアプリに対してテストを書いてみ

元記事を表示

子供向けにチャットアプリを作ってみた

## はじめに
ここ数年間React Nativeを触れる機会がなかったのですが、キャッチアップのために子供が使えそうなチャットのアプリを作ってみました。普段からWebのフロントエンドもReactで実装することがほとんどなのでやはり大きく迷うことはなく、Expo(特にEASのよるビルド、デプロイ)とFirebase、React Native Paperでかなりスムーズに進んだ印象です。本記事では使用した開発スタックと少し実装面の説明、出来上がったアプリの紹介などをしたいと思います。

## 開発Stack

ざっとこのような感じです。

– [Expo](https://expo.dev/)(EAS、Expo Routerが便利)
– [Firebase](https://firebase.google.com/)(Authentication、Firestore)
– [React Native Paper](https://reactnativepaper.com/)(Material Designのコンポーネントライブラリ)
– [RevenueCat](https://www.

元記事を表示

ReactNativeの環境構築をしてみた

:::note
カスタマイズ性が高い`Developer Build`を諦めて`Expo Go`で環境構築をしています。
詳しくは「Expo Goで開発することにした経緯」をご覧ください。
:::

# React Nativeとは
ネイティブアプリのユーザインターフェイスを作る為のJavaScriptライブラリです。

# Expoとは
React Nativeのフレームワークです。
ファイルベースのルーティング、高品質のユニバーサルライブラリ、ネイティブファイルを管理することなくネイティブコードを変更するプラグインを記述する機能などの機能を提供します。

# 環境構築

:::note
Nodeをダウンロードされていない方はこちらから
https://nodejs.org/en
特にこだわりがなければLTSをダウンロードして下さい。
`node -v`でバージョンが表示されたら成功です。
“`terminal
node -v
v18.18.0
“`
:::

## プロジェクトの作成

https://reactnative.dev/docs/environment-setup

元記事を表示

【Flutter】ボタンの連打を無効にする対応メモ。onPressedの処理中は押せないボタンを作成する方法

## この記事でやりたいこと・紹介すること

:::note info
ボタンを押した後の処理を実行中は、ボタンを押せないようにするボタンを作成して、ユーザーが連打や実行中に比較的短い時間内でボタンを再度タップする動作等をしても二重で処理が発生しないようにする
:::

## 実施した概要
ボタンクラスのラッパークラスを作成して、処理中はボタンの”onPressed”パラメータにNullを渡すことでタップ動作を無効にする。

:::note info
上記の実装をすることで、容易に連打防止対応をしたボタンをコード全体で簡単に何度も使用することができます。
:::

## 実際の方法とソースコード

実際の導入方法を紹介します。

### ボタンクラスのラッパークラスを作成

ボタンクラスのラッパークラスである`WaitableElevatedButton`クラスと`WaitableOutlinedButton`クラスを作成

以下のファイルを任意の場所に作成します。

:::note info
私は、基本的にUtilディレクトリ等を作成して、その配下に以下の`waitable_butt

元記事を表示

Compose MultiplatformとAppiumの相性の悪さに絶望している

このチュートリアルを参考に
Compose Multiplatformでアプリを作って
Appiumのテストをやってみようと思ったんですよ。

https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-multiplatform-create-first-app.html

Android, iOSそれぞれのアプリの起動ができて
おおっと思いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258506/2a34e692-4493-d2f5-a4f8-acdb3945e4d9.png)

で、Appium Inspectorで中身をのぞいてみたんですよ。
そうしたら、iOSアプリのほうですが、中身に意味のあるものが無いんです。

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

元記事を表示

FlutterでiOSの独自ライセンスを自動取得/表示まで

## はじめに
とあるPJでFlutterを使用したアプリ開発中、セキュリティ診断等でiOSが独自で使用しているライブラリのライセンスの記載が不足しているとの診断結果を受け追加することに。
ですがライブラリが追加されるたびにライセンスファイルを都度追加するのは、メンテナンスコストがかかるため自動化しようということになりました。

ということで本記事では、iOSの独自ライセンスの取得方法とFlutter標準ライセンスに追加する方法までをご紹介します!

## 目次
1\. 使用ライブラリ / ツール紹介

2\. 手順
  1. ライセンスファイルの取得
  2. ライセンスファイルからライセンス本文を参照
  3. Flutter標準ライセンス一覧追加

3\. まとめ

## 使用ライブラリ / ツール紹介
① Flutterの標準ライブラリのライセンスを表示する方法

https://api.flutter.dev/flutter/material/showLicensePage.html

② iOSの独自ライセンスファイルを取得するツール
こちらはCocoaPodsを使ってコマ

元記事を表示

FlutterのPlatform Viewsの表示モードを整理する

## はじめに
FlutterはiOSやAndroidなど複数のプラットフォームで動作するUIフレームワークです。Flutterは独自のUIレンダリングの仕組みを持っており、基本的には各プラットフォームのネイティブUIを使用しないため、プラットフォーム間での動作の差異がほとんどないという特徴があります。

しかしながらマップやウェブビューなど、プラットフォームが提供しているUIをFlutterで表示したいことがあります。そのようなケースに対応するための仕組みが **Platform Views** です。

あるプラットフォーム上でそのプラットフォーム向けのUIを表示する(例えばiOSで`UIButton`を表示する)というのは当たり前なことです。しかし、それをFlutterで構築されたアプリの中で表示する場合、Flutterが独自にレンダリングするUIとプラットフォームのUIを同時に組み合わせて表示しなければならないことになります。

iOS/Androidにおけるそのような課題をFlutterはどのように解決しているのか?を整理する機会があったため、こちらの記事にまとめます。

:

元記事を表示

2次元配列と1次元配列の相互変換

ロジックとしては以下だけの模様。

“`swift
p.x = index / 3;
p.y = index % 3;
“`
どの言語であれ、競プロであれ、配列の処理は大事。

CreateMLでマルチラベル分類をしようとしたら詰まった話

## はじめに
趣味の開発でcreateMLを用いて多ラベル分類の検証を簡単に行おうとしていましたが、データを読み込む過程でハマってしまい3時間ほど時間を溶かしてしまいました。ググっても答えがパッと見当たらなかったので、備忘として残しておきます。

CreateMLによる機械学習(画像認識)のやり方は[公式ドキュメント](https://developer.apple.com/documentation/createml/creating-an-image-classifier-model)を参照して下さい。

## 前提条件
[公式ドキュメント](https://developer.apple.com/documentation/CreateML/creating-a-multi-label-image-classifier)に準い、学習データのディレクトリ構成は以下とします。
“`direct
train/
├── image1.jpg
├── image2.jpg
├── …
└── annotations.json
“`

## 問題
[公式ドキュメント](https

元記事を表示

iOS Simulator で Loaded CoreSimulatorService is no longer valid for this process のエラーが出た時の解決方法

# これなに
CoreSimulatorService がも使えないよと言われた時の対応方法

# エラー内容
Simulator 起動しようと思ったらこんなエラーが
“`zsh
Loaded CoreSimulatorService is no longer valid for this process.
Simulator services will no longer be available.
Error=Error Domain=NSPOSIXErrorDomain Code=61 “Connection refused”
UserInfo={NSLocalizedDescription=CoreSimulator.framework was changed while the process was running.
This is not a supported configuration and can occur if Xcode.app was updated while the process was running.
Service version (947

元記事を表示

Storyboardをつかわない、UITabBarControllerをルートとしたのプロジェクト作成

## はじめに
タブバーからのアプリの立ち上げ方メモ
今回のサンプルリポジトリ

https://github.com/kabikira/SampleTabBar

## できるもの
2つのタブバーで画面きりかえをする。

## ストーリーボードを使用しない設定をする
以下記事を参考にしてください。

https://qiita.com/Imael/items/e908aef1e6fc077f29fc

## ViewControllerを2つ作成
下記のよ

元記事を表示

【Flutter】PlatformException(Unexpected security result code, Code: -25299, Message: The specified item already exists in the keychain., -25299, null)

# なんかiOSだとエラーがでてくるんだけど?
Androidの方ではうまく動いていたのに、iOSの方ではうまく動かなくなった。
下のようなエラーが“`secureStorage.write(Key:key, value,value);“`のところで出てきて解決に時間がかかったので備忘録として残しておく。
“`
PlatformException(Unexpected security result code, Code: -25299, Message: The specified item already exists in the keychain., -25299, null)
“`

# エラーの調査と解決策
まったく同じエラーの内容がGitHubの[issue](https://github.com/mogol/flutter_secure_storage/issues/711)に上がっていた。
ただ、ここの内容では、インスタンスの初期化とwriteを呼び出すところを分けるとうまくいったよと書かれているのみだった。
はぁ…詰んだ…と思って、あきらめそうになっ

元記事を表示

今更ながらXcodeで開発しているiOSアプリのデバッグをiPadで行った記録

# はじめに
自分でどうやったのか人に教えるのが面倒なので,立てた記録.
それぞれのデバイスのバージョンは以下の通り.
MacOS Sonoma 14.4.1
Xcode 15.3
iPadOS 16.7

最新情報にはなってないかもので,ご注意ください.

# Xcodeの準備
iOSやiPadOS, MacOS向けのモバイルアプリケーションをビルドするために必要なXcodeを準備する!

### Xcodeのインストール
App storeでXcodeと検索してインストール

![スクリーンショット 2024-05-13 20.39.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680423/10638561-9749-6c6f-6a8f-91df0c0e80f2.png)

### iOSのインストール
今回はiPadでのデバッグを行うので,iOSをインストールしてデバック可能にする.
(MacOSは標準でインストールされているので問題ない)
最初にXcodeを起動したときに設定できるが,

元記事を表示

OTHERカテゴリの最新記事