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

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

サイバーエージェントのインターンに参加した話

# 自己紹介
Swift歴1年ちょっとの文系大学生です。
普段はSwiftUIで個人開発をしていて、UIKitは全くの初心者です。
インターンシップに参加することに勇気が出ないよって方にインターンシップの雰囲気を伝えれたなと思います。

# [インターン詳細](https://www.cyberagent.co.jp/careers/students/event/detail/id=27497)
![27497_ext_03_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/44aba2c8-ec14-47f7-6262-55e0a96ea498.png)
期間: 9月16日〜9月18日
場所: Abema Towers
内容: 「無視できない!設計が学べるiOSハンズオン」

オフラインでの開催でした。

![IMG_1356.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a143a35

元記事を表示

【Flutter / RESTAPI】簡単なAPIをFlutterで呼び出してみた!

## 初めに
iOSやAndroidの開発を今までやってきましたが、
ここ最近はFlutterを使用して開発をしている企業も
多いのではないかと感じます。

フリーランスの案件にもちらほら見かけるので、
今更かもですが勉強しなくては。。

Dartは簡単に触ったので、お馴染みのAPI操作を
やってみました!

## 使用するAPI
郵便番号をパラメータとして使うことで、
住所の情報がJson形式で返却されるAPIを使用します。

参考:郵便番号データ配信サービス

http://zipcloud.ibsnet.co.jp/

## 環境
・Android Studio
・url_launcher: 6.1.2
・flutter_html: 2.2.1
・http: 0.13.3

## 実装
全体のソースというよりは、テンプレート見たいな感じで
順に説明します。
### 0. 事前準備
“`
// ①pubspec.yamlで使用するパッケージを入力
# The following adds the Cupertino Icons font to your application.

元記事を表示

FlutterのiOSデバッグ起動時に Null check operator used on a null value

`Flutter`のデバッグ作業中、アプリ起動時に`FirebaseAuth.instance.currentUser`の部分で`Null check operator used on a null value`のエラーが出てどうにもいかなかった時の対処法です。`flutterfire_cli`で`flutterfire configure`を試したり、`XCode`のキャッシュを削除したりする前に、

– `firebase login`で確認しても`user`の確認が取れている。
– デバッグのシュミレータでなく実機での検証は成功する。
– 周りでは動いていてコードには問題がなく、アプリケーション内部のクラッシュと判断できる。

上記に該当するのであればまず、試して頂きたいのが。![スクリーンショット 2022-09-19 16.23.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/4753a43e-3cf1-91de-926a-6583dd7daaca.png)
`Simula

元記事を表示

UICollectionViewDiffableDataSourceの挙動を理解する

## 概要

Appleはここ2,3年、UITableViewからUICollectionViewへの置き換えを進めていて、自分も今までだったらUITableViewを使うような画面も最近はUICollectionViewでリスト表示を実装するようにしています。
iPhoneならリスト表示、iPadならグリッド表示みたいな画面を構成する場合もよくあると思うので、UICollectionViewで作っておく方が何かとスケールしやすいので、そのうちUITableViewはUICollectionViewに完全置換されると思っています。
それに合わせるように出てきた`UICollectionViewDiffableDataSource`を使って実装しているのですが差分更新の挙動をしっかり理解する為に色々試してみました。
(UITableViewDiffableDataSourceもありますが、ほぼ同じです)

#### 開発環境
– Xcode 14.0
– iOS16.0

## サンプルコード

モックデータでToDo一覧を表示し、タップすると完了状態がトグルするアプリ
挙動を確認する

元記事を表示

iOSエンジニアを目指す26歳男

swiftを学び初めて10日が経過した。独学で学習を進めていたが、iOSアカデミアに入校することにした。現在、動画教材とアプリ制作のチャプターを学んでいるが、難しい。。これまでの数学や国語などの学習とは全く異種な学習だ。でもだから面白い。自分の知らない領域の知識を得られている。あとは自分次第。学習時間の確保と継続。今はこのふたつを徹底しながら、自分を高めていきたい?✨

元記事を表示

【Swift】Date型をデコード

# はじめに
いままでCodableでデコードする時にデータがあるとデコードに失敗してたのでStringでデコードしてました。

Dateでデコードする方法を学んだので記録しておきます。

# 方法
“`swift
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let weatherModel = try decoder.decode(WeatherModel.self, from: weatherData)
“`

# おわり
勉強になりました

元記事を表示

【Swift】初心者による優しいデリゲート

# はじめに
:::note warn
間違いがあるかもしれないです。
間違っていたらコメントください
:::

delegateを使ってViewに通知する方法を学んだので記録しておきます。

# 実装
“`swift:ViewController
import UIKit

class ViewController: UIViewController, SampleModelDelegate {

private let sampleModel = SampleModel()

override func viewDidLoad() {
super.viewDidLoad()

sampleModel.delegate = self

// ここでリクエスト
sampleModel.fetchAPI()
}

func sampleModel(_ sampleModel: SampleModel) {
print(“レスポンスが返ってきました”)

元記事を表示

pkgConfig を書いて NDI SDK(fat static library) をパッケージとしてアプリに組み込む

> Network Device Interface (NDI) is a high performance standard that allows anyone to use real time, ultra low latency video on existing IP video networks.

[NDI](https://ndi.tv/about-ndi/) は IP ネットワーク上でビデオやオーディオを効率よく伝達する方式のひとつです。

iOS 向けの [SDK](https://ndi.tv/sdk/#download) も公開されていてダウンロードすることができます。ライブラリはパス `/Library/NDI SDK for Apple/lib/` にプラットフォームごとにインストールされますが、実体は fat な static library です。

“`
$ file /Library/NDI\ SDK\ for\ Apple/lib/iOS/libndi_ios.a
/Library/NDI SDK for Apple/lib/iOS/libnd

元記事を表示

SwiftUI のツールバーの外観を UIBarAppearance で指定する方法に toolbarBackground で別れを告げる

## SwiftUI と `UIBarAppearance`

iOS 15 まで、SwiftUI では NavigationBar / TabBar / ToolBar などのツールバーの背景色を設定する手段がありませんでした。そのため、例えば以下のように `UIBarAppearance` を指定する方法がとられていたと思います。

“`swift
let appearance = UITabBarAppearance()
appearance.backgroundColor = .systemBackground
UITabBar.appearance().standardAppearance = appearance
UITabBar.appearance().scrollEdgeAppearance = appearance
“`

しかし、この方法はグローバルな設定を書き換えてしまうので以下の記事で書かれているような問題を引き起こすことがあります。

https://qiita.com/noppefoxwolf/items/5ba81e93bef8b91f1484

元記事を表示

画面の一部でUIHostingControllerを使っているとNavigationBarを隠したいのに隠れない問題の対応方法

下記のコードのようにナビゲーションバーを隠すためsetNavigationBarHiddenを記述しているがUIHostingControllerを使用しているとナビゲーションバーが隠れない。

“`swift
class ThirdViewController: UIViewController {

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.setNavigationBarHidden(true, animated: false)
}

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.

let hc = UIHostingContro

元記事を表示

【SwiftUI】関数の引数でBindingをとる方法

# 方法
“`swift
func showModal(isPresented: Binding) {
isPresented.wrappedValue = true
}
“`

:::note info
**型名**
`Binding<型名>`
:::

:::note info
**値の変更方法**
`wrappedValue`で元の値を取得する事ができます。
:::

# おわり
忘れたとき用にメモです

元記事を表示

次の水曜日の Date型 を取得する

### サンプルコード

“`swift
import Foundation

let calendar = Calendar(identifier: .gregorian)
let wednesdayComponent = DateComponents(weekday: 4)
let wednesday = calendar.nextDate(after: Date(), matching: wednesdayComponent, matchingPolicy: .nextTime)!

print(Date())
print(wednesday)
“`

出力結果
“`
2022-09-16 09:05:06 +0000
2022-09-21 00:00:00 +0000
“`

https://swiftfiddle.com/xxubpj4fv5gtjmgrznxrmbvybu

### 使ったAPI

[nextDate(after:matching:matchingPolicy:repeatedTimePolicy:direction:)](https://devel

元記事を表示

XCode 14でSigning for … requires a development team.を解決

FlutterでiOSをbuildするとき、はまったので、メモ

以下のコードをPodfileに追加
“`
if target.respond_to?(:product_type) and target.product_type == “com.apple.product-type.bundle”
target.build_configurations.each do |config|
config.build_settings[‘CODE_SIGNING_ALLOWED’] = ‘NO’
end
end
“`

元記事を表示

iPhone 14 ProのDynamic Islandにウィジェットを追加、Live Activityライブ・アクティビティを開始(iOS16.1以降)ActivityKit

今回は、iPhone 14 Proの新エリア「Dynamic Island」にウィジェットを追加する方法についてご紹介します。また、iOS 16.1以上のデバイスで利用可能なライブ・アクティビティを追加する方法についても説明します。

![compact-format.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/2d217bd8-e3e0-582e-1f0a-73c4639eb5ab.png)

## 利用可能な環境

iOS 16のリリースでは。ライブ・アクティビティは除外されています。

ライブアクティビティ機能は、パブリックベータテストプログラムで一般公開されているiOS 16.1でも利用可能です。

ライブアクティビティは、ロック画面に表示されます。
iPhone 14 Proでは、Dynamic Islandエリアにもライブアクティビティが表示されます。

ライブ・アクティビティはiPhoneのみです。

## Dynamic Islandの形態

Dynamic Island

元記事を表示

[Combine] 複数のAnyCancellableをまとめてstoreする

https://qiita.com/417_72ki/items/5943700dbe5d3663512a

をCombineでもやりたいよねって話。

ただし、Combineの場合 Swift Foundation の `Set` が使われており `DisposeBag.insert(_:)` に相当するfuncが存在しないので自前で用意する必要があります。

`Set` は struct なので `mutating` を付けるのがミソ。

“`swift
public extension Set where Element == AnyCancellable {
mutating func insert(_ cancellables: [AnyCancellable]) {
cancellables.forEach {
$0.store(in: &self)
}
}

mutating func insert(_ cancellables: AnyCancellable…) {
i

元記事を表示

【Flutter】import するパッケージが多くなった時の対処法

## 初めに
コーディングをしていく中で、一つのファイルでインポートするパッケージやページの数が増えてきてしまいました。
初期に書いたコードの中では、以下のように大量の import 文が並んでいるものもありました。
![スクリーンショット 2022-09-12 16.46.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609901/72fa0578-f6bc-63e0-e65e-95bea5fc3c52.png)
流石にここまで import 文が並ぶことは無いかもしれませんが、大きなプロジェクトになると大量のページやパッケージを import する機会はあると思うので、今回はその対処法を共有したいと思います。

## 記事の対象者
+ ファイル内の大量の import を無くしたい方
+ 大規模なアプリを開発中の方
+ コードを綺麗に保ちたい方

## 実装
大量の import 文を無くすためには `export` を使います。
まずは新たに 「 importer.dart 」 というフ

元記事を表示

Swift Package Managerで、Private RepositoryのRelease AssetにアップしたXCFrameworkをbinaryTargetに指定して利用する

Swift Package Manager(以下、SPM)も登場しある程度の年数が経ち、実務でも導入例が増えてきているのではないでしょうか?
しかし、有名どころのFrameworkであってもSPM非対応なものも多く残っているのが現状です。

# SPMで、XCFrameworkを活用する

SPMは、XCFramework形式のバイナリビルドに依存することが可能なので、自前のPackageの依存対象にBinary targetとして、SPM非対応FrameworkのXCFramework形式のバイナリビルドを登録することで、擬似的にSPM上で管理することが可能になります。

XCFrameworkの指定は、ローカル参照 or サーバーからバイナリーをホスティングする2択が選べます。
サーバーからバイナリをホスティングする場合は、XCFrameworkを含むZipファイルを作成し公開する必要があります。
Package.swiftは下記のようになります。

“`Package.swift
import PackageDescription

let package = Package(

元記事を表示

[Flutter]BLoC 7.0系から8.0系の破壊的変更に対応した話(mapEventToState廃止)

## はじめに
私の携わっているプロジェクトではflutter_blocを採用しており、
今回7系から8系にアップデートを行いました。

https://pub.dev/packages/flutter_bloc

元々v7.0.0を利用しておりましたが8系で1点破壊的変更が入っており、
対応に関する日本語での記事が少なかった為、今回共有をさせて頂きます。

## 破壊的変更点 (mapEventToState廃止)

v7.0.0を利用していた当初、何かしらのEventを発火させた後にBLOCクラス内では`mapEventToState`を用いて各種Eventのハンドリングを行なっておりました。
この`mapEventToState`は**v7.2.0から非推奨**になり**v8.0.0以降は廃止**となるようです。

> In bloc v7.2.0, mapEventToState was deprecated in favor of on. mapEventToState will be removed in bloc v8.0.0.
https://blocli

元記事を表示

iOSアプリ起動高速化の全て(起動時間の計測・起動時の処理・高速化のためにすべきこと)

掲題の通りこの記事ではアプリの起動時処理と高速化のためのポイントを詳しく書いていきます。

自社のアプリで起動時間に課題意識を持って、起動高速化に取り組んでいる方も多いのではないでしょうか。
そんな時に少しでも参考になれば幸いです。

**時間があまりなく改善策だけサクッとまとめて知りたい方は、文末のまとめを見ていただけるといいと思います。**

# 起動時間を計測しよう
まずは現状を確認するためにアプリの起動時間を計測しましょう。

ただ起動時間を確認するだけであれば`Firebase Performance`だったり、Xcodeの`Organizer -> Launch Time`で確認できます。ただやはり起動時間を見直したい場合はもう少し詳しく分析した計測がしたいです。
そんな時はInstrumentsのApp Launchを使用します。

元記事を表示

【SwiftUI】アラートのバグの回避策

# はじめに
iOSDCで「[SwiftUIのハマりどころと回避策](https://fortee.jp/iosdc-japan-2022/proposal/41079124-aab4-40a9-b8ee-efdac7ca4e72)」を拝見して自分的にはこうすると思った事があったので記事にしておきます。

# アラートのバグ
1つのViewに対して2つのアラートを適用している場合に外側のアラートしか表示されないバグです。
“`swift:iOS14
import SwiftUI

struct ContentView: View {
@State private var isAlert1 = false
@State private var isAlert2 = false
var body: some View {
VStack(alignment: .center, spacing: 30) {
Button(“アラート1”) {
isAlert1 = true

元記事を表示

OTHERカテゴリの最新記事