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

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

SwiftUI のモディファイアの順序による結果の相違

# はじめに
SwiftUI は、ビューに対してモディファイアをメソッドチェーン形式で追加していくという統一的な操作ができるので、とてもわかりやすいですよね。
時にはモディファイアが多すぎて、見通しが悪くなることはありますが…。

簡単に扱えるモディファイアですが、順序には注意する必要があります。

# 検証環境
– macOS Monterey 12.6
– Xcode 14.0.0

# 実験
“Text“ に、“frame()“, “padding()“, “border()“ の 3 つのモディファイアを設定してみます。
設定順序の組み合わせは 3! 通りあります。

## サンプルコード
それぞれ、枠線を付けた同じサイズの “VStack“ 内に上記 3 つのモディファイアの順序を変えた “Text“ を配置しています。

“`swift
import SwiftUI

struct ContentView: View {
var body: some View {
VStack {
Text(“モディ

元記事を表示

【Swift】プロトコルを拡張して実装を任意化する

# 通常
“`swift
import UIKit

class ViewController: UIViewController, SampleDelegate {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .red
}
func sample() {
print(“サンプル”)
}
}

protocol SampleDelegate {
func sample()
}
“`
`sample()`を実装しないと下の画像のようにXcodeに怒られます
![スクリーンショット 2022-10-16 18.28.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/31381ebc-6278-3057-e43b-c52970ab2757.png)

# デフォルト実装
“`swift
import

元記事を表示

[Flutter] MacOSで_ClientSocketException: Connection faild が出たときの対応

## 経緯
Flutterアプリを作る際に、
[サンプル](https://docs.flutter.dev/cookbook/networking/fetch-data “Fetch data from the internet”)を参考にしながら
APIからJSONの値を取得して、その値をそのまま表示するサンプルを作るときに躓きました。

## 内容
`package:http/http.dart` を使って get をすると以下のようなエラーが出ました。

“`
_ClientSocketException (Connection failed)
“`

Exceptionの内容は以下の通り。(xxx.comは仮)

“`
Exception has occurred.
SocketException (SocketException: Connection failed (OS Error: Operation not permitted, errno = 1), address = xxxx.com, port = 443)
“`

## 対応
Flutterの[Ma

元記事を表示

【Swift】MintでLicensePlistを使う

# はじめに
以前、[CocoaPodsを使用してLicensePlistを導入する記事](https://qiita.com/SNQ-2001/items/dc6433f63799ef76dd04)を書きました。
しかし、個人的にxcworkspaceが作られるのが好きではないでの最近はmintを使用してLicensePlistを導入しています。
今回はmintを使ってLicensePlistを導入する方法を記事に記録しておきます。

# 今回使用するサンプルプロジェクト
![スクリーンショット 2022-10-15 21.16.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d21acd7c-c01c-0855-8b5b-6194273734e7.png)

# やりかた
### Mintfile
“`:ターミナル
cd プロジェクトフォルダ
“`
Mintfileを作成します
“`:ターミナル
touch Mintfile
“`
Mintfileを開きます
“`:ター

元記事を表示

【Swift】公式ドキュメントのSequenceプロトコルを読む

# この記事は何?
SwiftのSequenceプロトコルについて、解説したものです。
[開発者ドキュメント](https://developer.apple.com/documentation/swift/sequence)より

# 宣言

“`swift
protocol Sequence
“`

# 概要

シーケンスは、1つずつ連続して取得できるリスト形式の値です。
シーケンスの要素を反復処理する代表的な方法は、`for-in`ループです。

“`swift
let oneTwoThree = 1…3
for number in oneTwoThree {
print(number)
}
// Prints “1”
// Prints “2”
// Prints “3”
“`

これによって、どんなシーケンスに対しても、多くの操作方法を実行できるようになります。
例えば、シーケンスに特定の値が含まれているかどうかを確認するために、「値が一致するか、シーケンスの最後に到達する」まで、各値を順次チェックできます。
次の例では、昆虫の配列に「蚊

元記事を表示

iOS・Android兼用Appアイコンを作成する (Flutter)

# はじめに
“`Flutter“`でiOS / Android両対応アプリを作成した時に、“`AppIcon“`の作成に一番時間を取られたので作業ノウハウをまとめました。

## どこに時間を取られたのか?
**iOS**
1024 x 1024 px[^1]の画像を用意すれば良いです。

**Android**
“`Android 8“`から導入された“`Adaptive Icon“`[^2]によって、画像中央の直径“`66 dp“`の“`セーフゾーン“`を残して周囲が切り取られる場合があるので、予め構図を考えておかないと意図しないアイコン表示になってしまいます。


:weary:
Swiftポケットリファレンスのメモ

### Swiftポケットリファレンスを読んだ後のメモ
[本のリンク](https://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E6%96%B0%E7%89%88-Swift%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-POCKET-REFERENCE/dp/4774196177/ref=asc_df_4774196177/?tag=jpgo-22&linkCode=df0&hvadid=295704876452&hvpos=&hvnetw=g&hvrand=11315013947549265090&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009225&hvtargid=pla-526262305170&psc=1&th=1&psc=1)
### iOSのレイア構造

| 名前 | 概要|フレームワーク|
| :—: | :—:

元記事を表示

Lambda (Node.js) から SNS 経由で IOSデバイス にプッシュ通知

# はじめに
LambdaからSNS経由でアプリをインストールしたIOSデバイスにプッシュ通知する方法についてまとめました。

# 事前構築
– プッシュ通知用証明書(p12)は、発行済とする
– IOSデバイスのデバイストークンは、取得済みとする
– 参考記事
– https://kahoo.blog/howto-aws-sns-ios-push-notification/

# SNS作成
SNSでプッシュ通知の設定をします。
## プラットフォームアプリケーションの作成
`プラットフォームアプリケーションの作成`をクリックします。
![スクリーンショット 2022-10-14 16.00.24.png](https://qiita-image-store.s3.ap-northeast-1.amazon

元記事を表示

構造体(Struct)について死ぬほど簡単にまとめてみた #1

## はじめに
長いソースコードを長時間眺めていると(お決まりの)ゲシュタルト崩壊を起こし、構造体やそのスコープ内でやっている処理など訳分からんくなるときが多々ある。そんなとき、構造体の基礎中の基礎をしっかり思い出し、冷静に対応することの大切さをしみじみと実感したので2〜3記事程度でまとめることとする。前提として、どの記事・参考書よりも短く簡潔に触れていこうと思うので、めっちゃ詳しく勉強したい人は今すぐこのブラウザを閉じてくれ。

## 対象者
この記事は下記のような人を対象にしている。

– (~~ワイのような~~)センスのないエンジニア
– プログラミング初学者

## 構造体とは
構造体とは設計図であり、インスタンス化(PCのメモリにぶっ込む)をして初めて使用することができる。また、インスタンス化とは実体化ともいう。
上記を踏まえて、超大まかに要点だけ絞っていうと二つにまとめることができる。
1. プロパティ(変数や定数)、メソッド(関数)、イニシャライザ(初期化関数)をひとまとめにしたもの
2. 入力(引数)、出力(戻り値)の役割を担うもの

## 詳細
・ インスタンス化を

元記事を表示

【Swift】MintでSwiftGenを導入する

# はじめに
SwiftGenを初めて使ってみたので忘れないように記録しておきます。

# SwiftGenとは
公式からはこのように説明されていました
>SwiftGen is a tool to automatically generate Swift code for resources of your projects (like images, localised strings, etc), to make them type-safe to use.

英語は苦手なので日本語も載せておきます
>SwiftGenは、プロジェクトのリソース(画像やローカライズされた文字列など)に対してSwiftコードを自動生成し、タイプセーフで利用できるようにするツールです。

***どういうことか?***
通常、画像を表示させようと思ったら以下のようになります。
“`swift
Image(“share”)
“`
しかし、SwiftGenを使用すれば以下のように書くことができます。
“`swift
Image(Asset.share.name)
“`

これは便利ですね

# 今回

元記事を表示

【Swift】文字列にNGワードが含まれているか配列で確認するコード

入力値にNGワードが含まれているか配列で確認するコード

## 前提
NGワードの文字列の配列があり、
入力値などの、とある文字列がそれらを1つ以上含んでいるか確認したい

一見`contains`を使えば良さそうにも思えるが、NGワードの配列の要素を1つづつ確認するには繰り返し処理を使わなければならない。

## 解決策

`allSatisfy`を使う

“`swift
// NGワードの配列
var prohibited_words : [String] = []

// 入力値など
var value = textLabel.text

if self.prohibited_words.allSatisfy({ !value.contains($0) }){
// NGワードが1つも含まれていなかった場合の処理
}
else{
// NGワードが1以上含まれていた場合の処理
}
“`
`allSatisfy`は配列の全ての値が条件を満たすか判定するメソッド

https://developer.apple.com/documentation/swift/ar

元記事を表示

スコープ内外のお決まりについて(グローバル変数を添えて)

## はじめに
業務で扱う長いソースコードを長時間見ているとゲシュタルト崩壊を起こし、スコープ内外のお決まりについてすっかり忘れ、凡ミスをするという失態をおかした。そのため、非常に簡単ではあるが改めてスコープの範囲についてまとめる。

## 対象者
この記事は下記のような人を対象である。

– (~~ワイのような~~)センスのないエンジニア 
– プログラミング初学者

## 結論
– スコープにはアクセスできる範囲とできない範囲がある。
– {} ← スコープとはコレのことである。
– スコープ外にアクセスするにはグローバル変数などにする必要がある。
## 詳細
– スコープ内の変数や定数はスコープ内でのみアクセス可能
スコープ内の定数numはスコープ内でのみアクセス可でき、print関数で出力可能。それとは逆にスコープ外でのアクセスやprint関数で出力しようとも出力は不可能である。(スコープ外だと定数numは破棄される)
“`swift:Swift
for i in 1…10 {
//スコープ内の定数
let num = i
print(num)
}

元記事を表示

【Flutter】share_plusがiPadで機能しない

公式に書かれている通りに実装したけど、 AndroidやiPhoneでは機能するのにiPadでは機能しない。

しかも長文の謎のエラーを吐く。

“`
[LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don’t want.
Try this:
(1) look at each constraint and try to figure out which you don’t expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(Note: If you’re seeing NSAutoresizingMaskLayoutConstraints that you don’t understand, refer to

元記事を表示

【Xcode14】iPadを非対応にする

# はじめに
Xcode14から色々と操作が変わって「これってどうやってやるんだ?」ということが割とあるので毎回記事にできたらなと思います。
今回はXcode14でiPadを非対応にしたいという記事です。

# やりかた
① プロジェクトを選択します
② ターゲットを選択します
③ 「Build Settings」を選択します
④ `Targeted Device Families`と検索欄に入力します
⑤ 背景が緑色の欄をタップします
![スクリーンショット 2022-10-13 20.34.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/dc6b01bd-001f-ffa0-7adb-bc7be7237379.png)

⑥ 「iPhone」を選択します
![スクリーンショット 2022-10-13 20.43.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d48488b7-

元記事を表示

iOSシュミレーターの実機(デバイス)を変えての検証

現在35モデル以上のデバイスを抱える`iPhone`ですが、`Flutter`で開発しているとディスプレイの大きさによって画像の調整が必要になるなど、それぞれで検証しないといけない状況がやってきます。`2022/10`現在の`iOS 16.0`で対応している実機だと、小さいサイズで`iPhone SE(第3世代)`の`4.7インチ`大きいサイズで`iPhone 14 Pro Max`の`6.7インチ`と2インチ(5.08cm)もの差があります。なので`4.7 / 5.4 / 6.1 / 6.7`の4機種を検証に当てると良いかと。

|機種|ディスプレイ(縦横)|
|:———–|————:|
|iPhone 8|4.7インチ(11.938cm)|
|iPhone SE(第3世代)|4.7インチ|
|iPhone 12 mini|5.4インチ(13.716cm)|
|iPhone 8 Plus|5.5インチ(13.97cm)|
|iPhone X|5.8インチ(14.732cm)|
|iPhone 13|6.1インチ(15.494cm)|
|iPhon

元記事を表示

【旧版】iOS(iPhone/iPad) 監視モードとDEPとVPPとABMについての個人的メモ

※この記事は2021/12/25版のバックアップです。

# はじめに

最初に書いてから数年経過しているので、古い情報が混じっている場合があります。
また、元は個人的メモなのでいい加減な書き方になっています。
「もっと詳しく(まともに)書け」といった項目があれツッコミをどうぞ。

この内容は、iOSの監視モードおよび、DEPとVPPについてまとめたものです。
Apple School Managerについては触れていません。
MDMについては、具体的な製品名にはあまり触れず、機能概要のみの記載に留めます。
特定MDM/EMMのトラブルシュートとかは書いてません。Intuneとか。
MDMのUser Enrollmentについても触れていません。

Androidで似たようなことをやりたい場合は「[Android Enterprise](https://qiita.com/garupon/items/844770b1eb48ac004ced)」と「[Zero Touch](https://www.android.com/intl/ja_jp/enterprise/management/

元記事を表示

iOS16を旧Xcodeでビルドする!

# こんな方向け
– まだXcode13を使ってるけど、iOS16を持つ実機でビルドしたい。
– 新しいバージョンXcode14のDeviceSupportからiOS16用のDeviceSupportフォルダをXcode13に入れたけど、ビルドできない。

## 解決できるエラー
“`This operation can fail if the version of the OS on the device is incompatible with the installed version of Xcode. You may also need to restart your mac and device in order to correctly detect compatibility.“`

## 開発環境
macOS: Monterey 12.5 Intel
Xcode: 13.2.1
iOS: 16.0.3

# 結論
– iOS16から[DeveloperMode](https://developer.apple.com/jp/news/?id=r1sz7dke)と

元記事を表示

【Swift】一部だけ丸かどにする

# やりかた
“`swift
label.layer.cornerRadius = 10
label.clipsToBounds = true
label.layer.maskedCorners = [.layerMinXMinYCorner, .layerMinXMaxYCorner, .layerMaxXMinYCorner, .layerMaxXMaxYCorner]
“`
|左上|左下|右上|右下|
|-|-|-|-|
|.layerMinXMinYCorner|.layerMinXMaxYCorner|.layerMaxXMinYCorner|.layerMaxXMaxYCorner|

# おわり
割と使うので覚えておきたいです

元記事を表示

ライブラリを使わずネット接続状況を取得してみよう

## はじめに
端末が「ネットに接続されているとき」はスタンプを送信して〜や「ネットに接続されていないとき」はアラートを表示して〜みたいなことをしたいときが来る(はず)。そんなとき、NWPathMonitorを使用すればライブラリを使わずネットの接続状況を取得できる。

## 対象者
この記事は下記のような人を対象にしている。

– 駆け出しエンジニア
– プログラミング初学者

## 結論
NWPathMonitorとは、ネットワークの変更を監視して対応するためのオブザーバーである。
また、`func start(queue: DispatchQueue)`を使用することでパスの変更を監視することが可能。

## 詳細
1. ネットワーク状況を監視するための `NWPathMonitor()`とパス配信するイベントキュー`DispatchQueue.global(qos: .background)`を宣言する。
1. パスモニターを開始し、ネットワークパスの更新を監視できるようにする。
1. ネットワークパスが更新されたら行いたい処理を記述する。

“`swift:Swift
im

元記事を表示

iOS16でのHealthKit データ出力 (export.xml) のバグ回避

iPhoneではAppleWatchなどで収集したHealthKitのデータを、xmlファイルとしてダウンロードする事ができる。

:::note
HealthKitのデータをダウンロードする方法
1. **ヘルスケアアプリ** を開く
1. (概要のページの)右上のサムネイルを押す
1. 開いた画面の下の方にある **すべてのヘルスケアデータを書き出す** を押す。
1. データを書き出して良いか聞かれるので、**書き出す** を押す。
1. **ヘルスデータを書き出し中** と表示するので、しばらく待つ。
1. **書き出したデータ**を保存するダイアログが表示されるので、AirDropやメール等で保存する。データはZIPでアーカイブ・圧縮されている。
:::

ところがiOS16[^1]ではこのxmlファイル(`export.xml`)の属性リスト宣言に誤りがある為、正しく読み込めない事がある。10/12/2022現在iOSの最新バージョンは16.0.2だが、まだ直っていない。
属性リストを直せば問題なく読み込めるので、patchを作成した。

“`patch:export1

元記事を表示

OTHERカテゴリの最新記事