- 1. Flutter/複数ファイルのダウンロードの進捗をリアルタイムで表示
- 2. 【Swift】StringをdropFirstできなかった時の解決策
- 3. 【Swift】Character型の配列をString型の配列にキャスト
- 4. XCodeでNo such module ‘XXXXX’に詰まった時の対処法
- 5. Flutterでの開発でAPIKeyを隠してGithubにあげる方法
- 6. Swift – Xibを利用してTableViewとカスタマイズcellを作成する
- 7. Flutterでバトルシップパズルを作成する4
- 8. iOSアプリの通信エラーをブレークポイントで起こす
- 9. 【iOS アプリ開発】GUIの作り方
- 10. 1週間で道路逆走ゲーム作ってみた
- 11. Bitriseを使ったライブラリの自動定期更新で楽に開発
- 12. [Xcode]Xcode13へアップデート後に発生したNavigationBarの不具合の対処法
- 13. 【iOS】Metal Best Practicesの解説(10)レンダーコマンドエンコーダー
- 14. [iOS] carthage で XCFramework に対応する
- 15. Flutter 検索バー作成
- 16. 【iOS】同サイズのWidgetをWidget Galley に並べる方法
- 17. [iOS15 Safari] Canvas2Dの文字列描画でページがクラッシュする場合がある
- 18. iOS15から追加されたiCloud+のプライベートリレーを試す
- 19. iOSDC 2021 「バックグラウンドでアプリがキルされても怖くない!アプリの状態を元に戻すリストア機能の全て」の補足
- 20. init イニシャライザ とは? 数行で解説
Flutter/複数ファイルのダウンロードの進捗をリアルタイムで表示
#複数ファイルのダウンロードの進捗をリアルタイムで表示する
今回は動画ファイルをダウンロードしていきます。
色々ググっても複数ファイルのダウンロード進捗をリアルタイムで更新する実装を見かけなかったので、僕なりに実装したものを晒します。
ダウンロード中にアプリをキルしてしまった場合、前回のダウンロードが完了したファイルについては飛ばしてダウンロードされるように実装しています。※殴り書きなので、ディレクトリ構造や状態管理はほとんど考慮していません
※とりあえず動くものを!をモットーにやってます。汚いコーディングだと思います。読みにくければすみません。。。[Githubのレポジトリーはこちら](https://github.com/489yuki/download_sample)
##1.使用パッケージの導入
https://pub.dev/packages/path_provider
https://pub.dev/packages/http
https://pub.dev/packages/rxdart
pubspec.yamlに以下を追記(バージョンは最新のものを使
【Swift】StringをdropFirstできなかった時の解決策
Swiftで文字列の最初の文字を削除したかったので、以下の処理を書いたがdropFirstが反映されない。
“`swift
str = str.dropFirst()
str = str.dropFirst(1)
str = str.dropFirst(2)
“`3行ともdropFirstが反映されない。
エラー文はこんな感じ。
`No ‘dropFirst’ candidates produce the expected contextual result type ‘String’`
ちなみにこの辺りの記事でもString型にdropFirstは適用されているが、自分の場合はなぜか反映されず。
https://qiita.com/masakihori/items/889cb5496f53cfff5b43
## 解決策
“`swift
str = String(str.dropFirst())
str = String(str.dropFirst(1))
str = String
【Swift】Character型の配列をString型の配列にキャスト
## ぶつかった課題
文字列を1文字ずつの配列にする方法として以下の手段がある。
“`swift
let a = “abcde”
let array = Array(a)
“`ただここで生成される配列は1文字の型の意味を持つCharacter型。
そのためarrayをappendしようとすると
“`
Cannot convert value of type ‘[String.Element]’ (aka ‘Array‘) to expected argument type ‘[String]’
“`
とエラーになってしまう。そのためarrayの中身のCharacter型をString型に直す必要がある。
## 解決策
map関数を使って、配列全体に処理を与えれば良いだけだった。
“`swift
let new_array = array.map{String($0)}
“`型変換を克服できずに数日悩んでいたので解決して何より。
## 参考文献
CharacterからIntに変更している記事でした。
https://qi
XCodeでNo such module ‘XXXXX’に詰まった時の対処法
・XCodeで既にpodまわりの再インストールなどを試した。
・しかし、どの手法を試しても同じエラーが出続けてビルドできない。
・各種ライブラリのインストールは確認済み
自分の場合はFirebase関連モジュールのエラーが沢山出て、てっきりFirebaseモジュールの原因?と勘違いしたが、バージョン情報をググっても特段エラーの報告は見つけられない。# TL;DR
プロジェクトを開くときに間違ってxcodeprojを開いていたのが原因でした。
“`:ダメな例
open bar.xcodeproj
“`開くプロジェクトの名前をしっかり確認しましょう。
“`:正しい例
open bar.xcworkspace
“`灯台下暗しですね。。。
Flutterでの開発でAPIKeyを隠してGithubにあげる方法
チーム開発をするときなどに、自分のコードをGithubなどにあげたい!→でもAPIKeyを隠さないと…というときがあると思います。そうした時に、これが最も手っ取り早くAPIKeyを隠す方法だと思ったので共有します。
※私が作っていたアプリが地図系なので、APIKeyの名前もそんな感じになってますが、お構いなく好きに名前つけてもらって大丈夫です()
#Android
##基本的な設定
https://www.entwicklernotizen.de/blog/how-to-handle-secret-api-keys-in-flutter-for-android-and-i-os/
“`android/app/src/main/AndroidManifest.xml“`へのAPIKeyの書き込みについてはこれを参考にしてください。ここから先のコードは、“`your_api_key“`という文字列を自分のAPIKeyに書き換えて使用してください。“`dart:android/local.properties
…
MAPS_API_KEY=your_api_key//こ
Swift – Xibを利用してTableViewとカスタマイズcellを作成する
#はじめに
恐らくtableviewなら、普通のやり方だけでいけるのに、
どうしてわざわざ手間をかけてxibを使うの?
どんなタイミングで使うの?と思う方がいると思います。シンプルな画面なら普通のやり方で大丈夫だと思いますが、
同じController画面に複数の複雑なメイン画面がある時、このように各画面をパーツ化し、それぞれ組み立てた方がわかりやすくて今後の保守性、拡張性に優しいかもしれませんので、ご参考を!
#手順
– Xibファイルを作成する
– Xib画面にUITableViewを追加する
– カスタマイズclassのファイルを作成する
– cell用のxibファイル、swiftファイルを作成する
– controller画面のUIViewのclassを定義したclassと設定する
– viewDidLoadでcellをtableviewに登録する処理を入れる各ステップに細かい手間があって抜けてはいけないので、以下説明いたします。
#Xibファイルを作成する
File -> New -> File…でXibファイルを作成する
![截圖 2021-09-23 19.
Flutterでバトルシップパズルを作成する4
## 概要
Flutterでバトルシップパズルを作成する
スクリーンサイズと向きを考慮する
効果音を入れる– [Flutterでバトルシップパズルを作成する3]
(https://qiita.com/iharakenji/items/ff65749c4b6acd1b57d2)### 実行環境
#### Mac
“`sh
$ sw_vers
ProductName: macOS
ProductVersion: 11.6
BuildVersion: 20G165
“`#### Flutter
“`sh
$ flutter –version
Flutter 2.5.1 • channel stable • https://github.com/flutter/flutter.git
Framework • revision ffb2ecea52 (5 days ago) • 2021-09-17 15:26:33 -0400
Engine • revision b3af521a05
Tools • Dart 2.14.2
“`## 修正内容
### ス
iOSアプリの通信エラーをブレークポイントで起こす
# はじめに
一般的にiOSアプリで通信エラーを起こすには
* 機内モードをオンにする
* WiFiをオフにする
* Network Link Conditionerをオンにする
* 有線LANを抜くなどの方法がありますが、再接続に時間がかかったり、確認中はチャットやメールが使えないといった問題が起きます。
そこでXcodeのブレークポイントを用いた手法をおすすめします。# 実例
APIリクエストを行う共通関数があるとします。
“`
// 通信エラー時は completion の引数に nil が渡される
func requestApi(url: URL, completion: @escaping (Dictionary?) -> Void) {
let request = URLRequest(url: url)
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
let json = try?
【iOS アプリ開発】GUIの作り方
## まえがき
フロントエンドエンジニアとして 2,3 年やってきたが、今年 4 月突如として iOS エンジニアに転向することになったエンジニアによる技術メモです。
なお筆者が初学者のため内容の正しさは保証できません。不正確な情報、また間違い等ございましたらご指摘いただけると幸いです。## GUI の作成方法
通常のWebアプリでは基本的には、HTML による構造化情報と、CSS によるスタイリングによって最終的に画面が作成されていきますが、
iOS アプリにおいてもこれと同じような構成により画面の生成が行われています。### 登場する概念
具体的な話を始める前に、このあと登場する概念について先に紹介します。
#### XIB (Xcode Interface Builder) ファイル
**.xib ファイルはその略の通り、UI 作成に関するファイルです。**
一般に xib ファイルで再利用を目的として UI 作成を行うため、フロントエンドでいうコンポーネントに近いと思います。
#### Storyboard ファイル
**.storyboard ファイル
1週間で道路逆走ゲーム作ってみた
Unity初心者が、1週間で簡単なゲームを作った過程を1日ごとにメモしてみた。
##1日目
#作りたいゲームを決め、ルールと方向性を決める
今回作りたいと思ったのは、車が道路を逆走するアクション系ゲーム。実際完成したゲームはこんな感じ。![IMG_5676.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1948530/e1ef8917-3566-56f5-eaeb-a3ec3aa00981.png)ルールに関しては、
– クリア条件
– ゲームオーバー条件
– スコア条件の三つを軸に決めた。今回は、ハイスコアを目指すエンドレスゲームにしたのでクリア条件はなく、スコアは車の進んだ距離で出す事にした。ゲームオーバー条件は5回車にぶつかるという条件にした。
##2日目
#ステージを作る
ステージとなる道路をUnityの3Dオブジェクトで作った。エンドレスゲームなので、ステージが自動生成されるようにコードを書いた。
![スクリーン
Bitriseを使ったライブラリの自動定期更新で楽に開発
Bitriseさんに賞をもらった時に、こっち書いた方がよかったかもなーと思った内容です。
#ライブラリの自動定期更新にあたって
**結論めちゃくちゃ楽になってOSの更新やSwiftの更新がある程度の規模でも10分で終わるようになりました。****お急ぎの方は「対象になりそうなプロダクト」からお読みください。**
###放置しがちなライブラリの更新は忘れられる
アプリを開発していると、ライブラリの更新があっても利用する機能が変わらないため日々の更新対応は優先順位は下がりがちです。
結果プロダクトバックログではどんどん下がり、いつしか忘れ去られる運命をたどります。###そして、静かに近づく時限爆弾の爆発
忘れ去られた結果、本来の対応とは別にframeworkの変更対応の工数が予測より増え、ビジネスチームが期待する新機能の追加や機能拡張をする時間を削られ、ロードマップをずらす時限爆弾が爆発します。例えば
– XcodeやSwiftの新しいバージョンに切り替える際のリビルド時
– サードパーティもしくはAppleのレギュレーション変更時こういった作業は元々、実施価値がビジネ
[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で返すことができ、
また、入力されているときは、初期値を設定することができます。
構造体を安全に用いるために、必要なイニシャライザになっています!###勉強したことをすぐ忘れるので、記しておきます。