- 1. UIImageからGIFを生成する
- 2. Unity IAPは公式APIドキュメントがないので課金処理は自前ネイティブ実装がいいかも
- 3. iOSのダウングレード手順
- 4. FirebaseCrashlyticsへのupload-symbols実行時にCould not fetch upload-symbolsのエラーが発生する
- 5. PlayFabでのプッシュ通知設定が難しすぎた
- 6. 【Swift】KVOでUserDefaultsの値の変更を監視する
- 7. UnityでSwiftの自作「Static Library」を使う
- 8. Embedded Frameworkでビルドエラーが出る場合
- 9. 肥大化したiOSアプリを課題解決のために半年弱でリアーキテクチャした話
- 10. XCTestの非同期テストで「呼び出されないこと」を検証する
- 11. App Store Connect Q & (A)
- 12. XcodeGenを用いて中規模プロジェクトをリリースした話
- 13. マルチモジュールでIBでNamedColorを使用する方法
- 14. iOSのURLスキームの脆弱性について
- 15. 【プログラミング初心者】Swift基礎~演算子~
- 16. RealityKitで直方体の6面それぞれに異なるテクスチャを貼る方法
- 17. 個人開発したアプリが1万ダウンロード突破したので振り返ってみる
- 18. 設定したフォントが実機で変わってしまう
- 19. R.swiftのスクリプトが意外に遅かったので使用箇所を1モジュールにすることでビルド速度改善
- 20. コード量を減らさずSwiftファイル数を減らしてビルド速度改善
UIImageからGIFを生成する
個人開発アプリ[TweetFly](https://itunes.apple.com/app/id1515218388?mt=8)
複数枚の画像をGIFに変換する機能がありまして、ちょっと調べてまとめました。下のGIFは`String` -> `UIImage` -> `GIF`に変換したサンプルです。
![sample_typewritter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13219/38d5469d-38e2-91b1-5a22-bd365d50d3f5.gif)“`swift
import UIKit
import ImageIO
import MobileCoreServicesclass GIFCreator {
struct GIFFrame {
var image: UIImage
var duration: Float
}static func create(with fram
Unity IAPは公式APIドキュメントがないので課金処理は自前ネイティブ実装がいいかも
# まとめ
– https://docs.unity3d.com/Manual/UnityIAP.html
– マニュアルはある。しかしAPIについての最新の説明は存在しないので自己責任でやるしかない。
– 自分でネイティブ連携するのが最強# 現状
– https://forum.unity.com/threads/where-has-unity-iap-scripting-reference-gone.660454/
– Where Has Unity Iap Scripting Reference Gone?(Unity IAPのスクリプトリファレンスどこにやった?)-https://forum.unity.com/threads/where-has-unity-iap-scripting-reference-gone.660454/#post-4543948
> Understood on the concern. As we are moving more towards Package Manager, we’ve had to adjust our doc
iOSのダウングレード手順
iOSのダウングレード手順を説明します。
`iTunes`がなくなったので、`Finder`から行います。
iOS FW(ips)を以下からダウンロードします。ダウングレードできるバージョンは、`Signed IPSWs`のみ有効です。
https://ipsw.me/
次に、`Finder`を開いて、ダウングレードしたいデバイスを選択します。
次に、macの場合は、`option(alt)`を押しながら、winの場合は`shift`を押しながら`アップデートを確認`ボタンをクリックします。
![](https://raw.githubusercontent.com/mba-hack/images/master/ios_fw_ips_downgrade_01.png)
すると、ファイルを選択できるようになるので、先ほどダウンロードした`.ips`を選択して、ダウングレードできます。
FirebaseCrashlyticsへのupload-symbols実行時にCould not fetch upload-symbolsのエラーが発生する
リリースしたアプリのクラッシュログ分析などでよく用いられるFirebaseCrashlytics。
FirebaseCrashlyticsを使用して、クラッシュログをもれなく収集するには、ライブラリ内のメソッドを使用するなどしてdsymファイルをFirebaseにアップロードする必要があるのですが、ここで表題の`Could not fetch upload-symbols`のエラーが発生しました。同じエラーが発生した人の助けになればと思います。## 結論
結論から記述すると、Firebase側のコンソール設定が完了していなかったことが原因でした。
ただ、権限の関係で本番環境のコンソールが確認できなかった、なぜかFabricのライブラリ内にあるコマンドではアップロードができてしまった、などの複数の要因から原因に気づくのにも時間がかかりました。
コンソール画面の閲覧権限がないなど、同じような事象に出くわす方もいるかと考え、今回の記事作成に至りました。## どんなことをしたか
### FirebaseCrashlyticsについて
まずFirebaseCrashlyticsにつ
PlayFabでのプッシュ通知設定が難しすぎた
UnityのバックエンドをPlayFabに任せてみようと試みていたのですが、iOSのプッシュ通知設定が難しすぎたので備忘録です。
# pemファイルのアップロードができない
PlayFabのプッシュ通知設定手順については、公式や紹介ブログがあるので詳細は割愛しますが、pemファイルをアップロードする段階で以下のようなエラーが発生してしまいます。> Invalid parameter: Reason: cannot be empty
pemの発行には問題無さそうで、まるでエラーの検討がつきません。
# 解決策
ぐぐってみると以下のフォーラムを発見。
https://community.playfab.com/questions/36895/
【Swift】KVOでUserDefaultsの値の変更を監視する
## KVOとは
KVO(Key Value Observing)の略名になります。
その名の通り、オブジェクトの値を監視する為に用いる技術です。
値の更新や削除などの変更を検知することができとても便利です!## UserDefaultsの値の変更を監視する
`UserDefaults`の値を`dynamic`で取得する“`swift
// 今回はIntの値を扱っています
extension UserDefaults {
@objc dynamic var translateLimit: Int {
return integer(forKey: keyName)
}
}
“`監視する処理
“`swift
var observer: NSKeyValueObservation?private func setKVO() {
observer = UserDefaults.standard.observe(\.translateLimit, options: [.initial, .new], changeHandler: {
UnityでSwiftの自作「Static Library」を使う
# 環境
– Unity 2018.4.23f1
– Xcode 11.5
– Swift 5
– iOS 13.4.1(iPhone 11)# 手順の概要
**「Unity」**から直接**「Swift」**のコードを呼び出すことはできないようです。。。orz
その為、下記のような形で、**「Objective-C++」**を経由する事で、**「Swift」**の関数を呼び出します。# 設定手順
## 「Swift」の「Static Library」を作成
### 「Xcode」で、プロジェクトを作成– 「iOS」→「Framework & Library」→「Static Library」を選択して、「Next」を押下
Embedded Frameworkでビルドエラーが出る場合#クリーンしてからの再ビルドでエラーが出る人
Embedded Frameworkを複数作成して開発していると、差分ビルドは成功するのにクリーン後のビルドで何故かFrameworkが無いとか、謎のビルドエラーなどが出る人向けです。
##依存関係を定義しましょう。
ターゲット -> Build PhasesからDependenciesを展開。
依存関係にあるEmbedded Frameworkを追加しておきます。これだけで解消します。
肥大化したiOSアプリを課題解決のために半年弱でリアーキテクチャした話
## はじめに
2019年に約半年弱の開発期間で公開中のiOSアプリを
リアーキテクチャーした話を備忘録としてまとめました。サービスインされているアプリを一気に作り直すケースは
ビジネス判断的にはかなり危い橋を渡っているのであまり無いとは思いますが
似たような状況で開発に臨んでいる方など、どなたかの参考になれば幸いです?## 開発の背景
* 2014年から毎年追加改修が走っているストア公開中のECアプリ案件(Objective-C)
* 画面数で見れば中規模から大規模にカテゴライズ
* iOSのバージョンについて古いものは毎年切り捨ててく方針
* 開発メンバーは毎年ほぼ総入替
* 自分は2018年頃から参加しました## 抱えていた課題・技術的負債
受託案件あるあるですが以下の課題を抱えていました。
0️⃣ ピュアObjective-C
1️⃣ 可読性の低い巨大すぎるMVC
(MassiveViewController + 非同期処理通知はNSNotificationのみ, BlocksKit等の利用無し)
2️⃣ 同じ/似たような機能を再利用せずにコピペで複数
XCTestの非同期テストで「呼び出されないこと」を検証する
# 非同期テスト
下記のようなサブスレッドを利用して結果を非同期に返すクラスがあるとします。
“`swift
class AsyncTask {
func execute(completion: @escaping (Bool) -> Void) {
DispatchQueue.global().async {
completion(false)
}
}
}
“`このクラスのテストをXCTestで書く際、以下のような実装をしてしまうと、該当のテストケースは非同期処理の完了を待たずにテストを終了させてしまいます。
“`swift
class SampleTests: XCTestCase {var asyncTask: AsyncTask!
override func setUpWithError() throws {
asyncTask = AsyncTask()
}func test() throws {
App Store Connect Q & (A)
App Store Connect に関する気になることを記載する
何か分かれば、Answerとして追記する# アップロード関係
## アップロードしたけどTestFlightに表示されない
Q.
アクティビティにはビルドとして表示されるが、TestFlightには表示されない
他のビルドバージョンは全て表示されているのにそのバージョンだけ抜けている## アップロードしたアプリはダウンロードできるのか
A.
多分できない# App Analysis
## アップデート数を確認したいのだが
A.
ウェブサイトでは項目としてなかったが、iOSアプリの方からは確認できた## アップデート数の定義は?
Q.
調べても書いていない## アップデート日じゃなくて公開日はどこに書いてある?
A.
多分、アクティビティ→App Storeバージョン→配信準備完了の日付
尚、公開予約した場合は「デベロッパによるリリース待ち」となっているはず
XcodeGenを用いて中規模プロジェクトをリリースした話
## はじめに
久しぶりの投稿。
題名の通り、期間は半年、エンジニアは二人という開発体制のプロジェクトに[XcodeGen](https://github.com/yonaskolb/XcodeGen)を導入し、先日プロジェクトをリリースしましたので、その知見を共有します。## [XcodeGen](https://github.com/yonaskolb/XcodeGen)とは?
iOSアプリをチーム開発のついて回る問題、**`project.pbxproj`ファイルがコンフリクトしまくる問題**があります。その問題解決できるツールが**XcodeGen**です。
最近取り入れてるプロジェクトは増えてきてるとはいえ、まだまだ発展途上のツールでガンガンアプデされており、機能がもりもりです。
XcodeGenは主に以下をやってくれます。(2020年6月時点)### XcodeGenがやってくれること
– コマンド一発で`.xcodeproj`を`project.yml`の設定を元に生成。
– ライブラリ依存、フレームワークも管理
– Build Configura
マルチモジュールでIBでNamedColorを使用する方法
[こちら](https://devblog.xero.com/managing-ui-colours-with-ios-11-asset-catalogs-16500ba48205) を元に対応した内容ですが、あまり日本語で書いているところが少ないと思い書くことにしました。
XcodeのAssetでnamed colorを設定してIBで下記のように色を指定できて便利です。
![alt](https://miro.medium.com/max/1104/1*O_zUaua3r0hjbyXvGLeP0A.png)
※ [↑こちら](https://devblog.xero.com/managing-ui-colours-with-ios-11-asset-catalogs-16500ba48205) の画像を参照しています
しかし、マルチモジュールの場合、IBで設定した後に以下のような警告が表示されて、Assetで定義をしていた色を変更しても色の変更が反映されないことがあります。
“`
2018-04-26 17:30:30.009855+1200 MyApp[82987:11
iOSのURLスキームの脆弱性について
# 概要
iOSのURLスキームが意外と脆弱だから気をつけた方が良いよと言う話をします。
※違うよ、とかあれば気軽にコメント頂ければ幸いです
# iOSのURLスキームについて
下記のようにURLスキームを叩くことがあると思うのですが、
“`
hoge://〜
“`これってどの情報を元にどのアプリがこのURLスキームを受けるか決めているのでしょうか。
答えとしては、どのアプリが受け取ると言う情報が入っている訳ではありません。
なので
AアプリとBアプリでそれぞれ同じプロトコル名で受け取るようにしていた場合、どちらがそのURLスキームを受け取るかわかりません
(過去に確認した挙動だと、先にインストールされている方のアプリが受け取るようです)Aアプリ
“`
hoge://〜
を受け取るように実装
“`Bアプリ
“`
hoge://〜
を受け取るように実装
“`奪い取りたいURLスキームのプロトコルなんて他の人わからないじゃんって思うかもしれませんが、
[こちら](https://resources.infosecinstitute.com/i
【プログラミング初心者】Swift基礎~演算子~
# はじめに
プログラミングで何かを処理する場合は計算を行ないます。
今回は計算を行うための方法を紹介します。## 演算子
計算をするとき、数学と同様に式が用いられます。
この式の中で`+`などの記号を使って計算しますが、この記号を**演算子(Operator)**と呼びます。
一方で演算子に計算される値を**被演算子(Operand)**と呼びます。例えば`let val = 1 + 2`の場合、`=`と`+`が演算子で1、2が被演算子です。
オペランドの型は全て同じ必要があり、`let val = 1 + 0.9`などは許容されません。演算子には色々種類があるので代表的なものを紹介していきます。
### 代入演算子
#### =
変数を値を格納するときに使用します。“`swift
let val = 1
“`
数学で使う`=`は等価を意味しますがプログラム上では代入を意味します。### 算術演算子
値の数値計算を行うための演算子です。
計算された値の型はオペランドと同じ型になります。
#### +
左右のオペランドを加算した結果を返します。“`swi
RealityKitで直方体の6面それぞれに異なるテクスチャを貼る方法
# はじめに
先月、「[iPad Pro の LiDARスキャナ を試してみた](https://qiita.com/surfinhamster/items/34001d889f514dccb705)」という記事を書きました。
その時はじめて RealityKit をいじったのですが、その後、ちょっとしたアイディアを実装してみようと思った時、RealityKit上のオブジェクトにコードのみでテクスチャを貼り付ける方法が見つからず、意外と悩んでしまいました。ようやくその方法がわかったので、備忘録を兼ねて記事とします。
2017年に「 [ARKitで立方体の6面それぞれに異なるテクスチャを貼る方法](https://qiita.com/surfinhamster/items/1630ca14b947969a5111)」という記事を書いていますが、つまり同じことを RealityKit でやってみようという話です。
# 環境環境等
– MacBook (Retina, 12inch, Early 2015)
– macOS Catalina Version 10.15.5
– X
個人開発したアプリが1万ダウンロード突破したので振り返ってみる
# 開発したアプリ
## [Shiori web for safari](https://apps.apple.com/jp/app/shiori-web-for-safari/id1480539987?l=ja)# コンセプト
『webにしおりをはさめるアプリ』というコンセプトで開発した。# 機能
**1. 記事保存機能**読んでいる最中の記事やwebサイトをスクロール位置とともに保存できる。それによって、次回開いたときに読んでいた場所からすぐに再開することができる。どこまで読んだか、とかいちいちスクロールして探す必要がない。
**2. 動画保存機能**
觀てい
設定したフォントが実機で変わってしまう
#現象
XibでSystemフォントを設定しているのに、
実機で動かすと別のフォントで表示されている。
そんなこと変えた覚えないんだが…#環境
Xcode 11.5
Objective-C
iOS 13.5#調査
フォントが変わってしまっているのは、
UITextViewを使っている所だった。#対応
フォントが変わっていないUITextViewもあったので違いを確認したら、
コード上でフォントサイズを指定していたので、
フォントが変わってしまった所も指定する様に変更したらSystemフォントで表示された!!修正例:“`textView.font = [UIFont systemFontOfSize:16]“`
#あとがき
よくよく調べてみとiOS13のバグらしい…
今回は簡単に自己解決出来たから良かったけど、
こっそり変わってるから半年ほど気づかなかったよ…
R.swiftのスクリプトが意外に遅かったので使用箇所を1モジュールにすることでビルド速度改善
# 概要
R.swiftを複数のモジュールで使用していたのですが、差分ビルドの遅い箇所を分析するとR.swiftの毎回走るコード生成のスクリプトがリソースの量に関わらず
**1箇所毎8秒程** ※差分ビルド・フルビルド関係なく
掛かっていて、何も修正していなくてもビルドする度に時間が掛かっていたのをリソースを1つのモジュールにまとめて、R.swiftのスクリプト実行を1回にすることでビルド速度改善しました。
26秒(3箇所) -> 9秒(1箇所) (-17秒)
【R.swift】
https://github.com/mac-cain13/R.swift# 環境
* R.swiftバージョン:5.1.0
* Xcode 11.x
* iMac (Quad-Core Intel Core i7 4.2 GHz, メモリ32 GB)# 実施した施策
R.swiftを使用するリソースを1つの共通モジュールに集めそこでR.swiftを使用する
他のモジュールでも使用する場合は [こちら](https://github.com/mac-cain13/R.swift
コード量を減らさずSwiftファイル数を減らしてビルド速度改善
# 概要
私の担当するアプリはSwiftファイル数がかなり多い(1モジュール内のSwiftファイル数も結構多い)のですが、
必要なコード量はそのままにSwiftファイル数を減らすことでビルド速度改善ができないかと言う話になりました。# 環境
* Xcode 11.x
* iMac (Quad-Core Intel Core i7 4.2 GHz, メモリ32 GB)# 先に結論
ビルドするマシンの環境依存の影響もあると思いますが、以下のような結果になりました。
可読性もあるのでそこまでファイル数を減らせていないですが、Swiftファイル数減少に応じて多少ビルド速度改善されました。
(一応複数回計測して平均と取っています)[削減したSwiftファイル数]
対応前
4325
対応後
3943 (-382)[ビルド時間計測結果(フルビルド)]
対応前
282秒
対応後
276秒 (-6秒程)# やった施策
## 関連性の強いコードを一つのファイルにする
例えば下記のように特定のファイルに強く依存しているenumを定義しているファイル