脱力駆動開発記

ゲームアプリを作るエンジニアの技術メモ

MENU

【Unity・IAP】2025-01-24頃からUnityIAP4.9.3以前を使用しているアプリはローカル検証ができなくなる

経緯

あけましておめでとうございます🎍 以前こちらの記事を投稿しました

www.stmn.tech

要約すると

  • Apple側のアップデートにより、2023/8/14以降にAppStoreConnectへ送信されたアプリは、内部的なレシートはSHA-256中間証明書で署名されるようになる
  • アプリのローカルでレシート検証をする場合は、課金ライブラリも以前のSHA-1ではなくSHA-256を前提とした検証処理に対応する必要がある
  • UnityIAPを使用している場合は、4.9.4以降のバージョンにアップデートする必要がある というものでした。

そのときの開発者のとるべきアクションのフローチャートは以下でした。

しかし2025-01-03頃にAppStoreConnectにログインすると、以下の通知が表示されました

App Storeのレシート署名に使用されるSHA-1中間証明書の有効期限は2025年1月24日に切れます。デバイス上でレシートの検証を行うアプリについては、SHA-256アルゴリズムへのサポートを実装してください。

つまり2025/1/24以降は上のフローチャートでいうところの「急ぎの対応は不要」の期限がきてしまうということですね。

Appleの一次情報も置いておきます。 https://developer.apple.com/documentation/technotes/tn3138-handling-app-store-receipt-signing-certificate-changes

対応

やることとしては前回の記事と変わらずで

  • UnityIAPの最新版にアップデートをする

だけで大丈夫かと思います。

「だけ」と言いつつ数年ぶりに開くプロジェクトだとライブラリを一つアップデートしたいだけなのにUnity本体のアップデートが必要だったりそれに伴って更に他のライブラリやアセットの更新も必要…のような連鎖が起きてしまうかと思いますが、まだ3週間あるのでがんばっていきましょう...!

以上、アプリのレシートのローカル検証をしていてかつUnityIAPv4.9.3以前をお使いの開発者の方はご注意を!という記事でした。

今年もよろしくお願いいたします。

【Stream Deck × Choosy】URLを開くときにGoogleChromeの指定のユーザーで開く

最近StreamDeckを買いました。めちゃくちゃ便利です。

背景

StreamDeckを使っていて、URLを開くときにChromeで決まったユーザーで開きたくなった
自分の場合はGoogleChromeのプロファイルを仕事用と個人用で分けていて、StreamDeckに設定しているURLは全部個人用のものだったので、常にそのプロファイルで開きたい。
でもChromeのデフォルトの仕様だと現在アクティブなユーザーとして新しく開いてしまうので、切り替えが煩わしかった

Choosyを使おう

Chromeでコマンドからプロファイルを指定して開く方法などはあったが、拡張性がなくて毎回設定するのが面倒そうだった。
調べるとChoosyというアプリを見つけた。
これは開こうとしているURLや実行元のアプリケーションに応じてルールを設定し、使用するブラウザとプロファイルを選択できるアプリです。 - 仕事で使うURLのパターンは仕事用のプロファイルで開く - Youtubeの趣味の動画は個人用のプロファイルで開く - slack経由で開くURLは仕事用のプロファイルで開く みたいなことができちゃうわけですね。

つまりこれで「StreamDeck経由で開くURLはGoogleChromeの個人用のプロファイルで開く」みたいなこともできちゃうわけです。

Choosyダウンロード

ダウンロードはこちらから。 https://choosy.app/
45日の無料トライアルがあって、その後は買い切りで10ドル。

Choosy設定画面

  • ルール追加

    • Rulesタブを選択し、左下のプラスを選択
  • ルールの詳細設定

    • 好きなTilteを入力
    • "All" of the following are true か "Any" of the following are trueを選択(続く条件が1個なのでNoneじゃなきゃどっちでもOK)
    • "Source application" "is" "Elgato Stream Deck"で設定
    • 使用するブラウザとユーザーを選択

これでStreamDeck経由でリンクを開くときは必ず個人用のプロファイルで開くようになりました。
設定しているリンクはまだ2つしかなかったけど、上手く動いてくれたのでもう少し追加してみようと思います。

ちなみに、上記の設定だとStreamDeck経由で開く場合は必ずChromeの特定のユーザーになりますが、Choosyでは複数のルールを設定できるので、先程のルールの上位ルールに追加すれば特定のパターンのみは別ユーザーにする等の挙動も可能です。

Choosyのその他の便利機能

例えばslack等でリンクを指定した際に、どのユーザー・ブラウザで開くかの選択を挟むことができます。これも地味に便利。
↓の画像のアイコンがChromeのユーザーアイコン。選択したユーザーで開けます。

以上です。
StreamDeckは拡張性が高くて時間が溶けます。 今年一番買ってよかったおすすめのデバイスです。

【Unity】Unity2022でAndoirdビルドエラー Assets Plugins Android res was removed


Unity2020のプロジェクトをUnity2022にアップデートした後に初めてAndroidビルドしたら起きた。

エラー

Exception: OBSOLETE - Providing Android resources in Assets/Plugins/Android/res was removed, please move your resources to an AAR or an Android Library. See "AAR plug-ins and Android Libraries" section of the Manual for more details.

環境

Unity2022.3.25f1

原因

Unity2021のアップデートガイドに記載がありました。
https://docs.unity3d.com/2021.2/Documentation/Manual/UpgradeGuide2021112.html

Unity2021からAndroidビルド時の
Assets/Plugins/Android/[res, assets]
の扱いが変わったようです。

  • Unity no longer copies Gradle
     project assets located in Assets/Plugins/Android/[res, assets] to the Gradle project.
    • Previously you could place Gradle resources in this folder and Unity copied them into the Gradle project. You should now use AAR or androidlib plug-ins to pass additional Gradle resources to the application.
    • If you place project assets in this folder, Unity shows a build error message.

訳

  • Unityは、Assets/Plugins/Android/[res, assets] フォルダ内にある Gradle プロジェクトのアセットを、Gradleプロジェクトにコピーしなくなりました。
  • 以前は、このフォルダにGradleリソースを置くことで、UnityがそれらをGradleプロジェクトにコピーしていました。現在は、追加のGradleリソースをアプリケーションに渡すために、AARまたはandroidlibプラグインを使用する必要があります。
  • このフォルダにプロジェクトアセットを置くと、Unityがビルドエラーメッセージを表示します。

つまり、Unity 2021.2以降では、Assets/Plugins/Android フォルダ内の res や assets フォルダにGradleリソースを直接置くことができなくなりました。代わりに、AARまたはandroidlibプラグインを使ってGradleリソースを管理する必要があります。このフォルダにプロジェクトアセットを置くと、Unityがビルドエラーを表示するようになります。

対応 (Firebaseとか使ってない場合)

Assets/Plugin/Android以下にres.androidlibというフォルダを作成
その中に既存のAssets/Plugins/Android/resを移動する

この対応を自動でやる場合は以下のコマンドをプロジェクトのルートディレクトリで実行すればOK

mkdir -p "Assets/Plugins/Android/res.androidlib"
mv "Assets/Plugins/Android/res" "Assets/Plugins/Android/AndroidManifest.xml" "Assets/Plugins/Android/res.androidlib"

対応(Firebase等つかってる場合)

一部のGoogle系のSDKを使用している場合は、Assets/Plugin/Android/AndroidManifest.xmlが自動で生成されてしまうので、最初の対応だとビルド時に競合する。

mkdir -p "Assets/Plugins/Android/res.androidlib"
mv "Assets/Plugins/Android/res" "Assets/Plugins/Android/res.androidlib"

までは一緒

Assets/Plugin/Android/AndroidManfest.xmlは残したまま、
Assets/Plugins/Android/res.androidlib/AndroidManifest.xmlに以下の内容で生成

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="custom.android.res" android:versionCode="1" android:versionName="1.0">
</manifest>

その他

ブログをobsidianで書くようにしたので、タイトルにスラッシュを含められない
本来なら
Unity2022でAndoirdビルドエラー Assets/Plugins/Android/res was removed にしたかった
まあいいか

参考: https://support.unity.com/hc/en-us/articles/115005875443-Providing-Android-resources-in-Assets-Plugins-Android-res-is-deeeeeprecccateddd https://yuumekou.net/unity-error-rrreport-1/ https://forum.unity.com/threads/exception-obsolete-providing-android-resources-in-assets-plugins-android-assets-was-removed.1171829/#post-8651706

【Unity×Firebase】Firebase11.8.0のSDKでXcodeビルドエラー (Undefined symbol~~,Linker command failed~~)が出たときの対応

環境

  • Unity
    • 2022.3.10f1
  • Xcode
    • 14.3.1
  • Firebase SDK
    • 11.9.0
  • ExternalDependencyManager
    • 1.2.177

Xcode上のビルドエラー

Undefined symbol: absl::lts_20220623::variant_internal::ThrowBadVariantAccess()
Undefined symbol: absl::lts_20220623::optional_internal::throw_bad_optional_access()
Linker command failed with exit code 1 (use -v to see invocation)

原因

既にgithubのissueに追加されていた。

github.com

2024/3/28時点でまだ中の人も調査中とコメントしている。
Firebaseの一連のSDKとFirebaseFirestoreInternalの特定のバージョンの組み合わせでエラーが起きてしまっているので、FirebaseFirestoreInternal側を固定してあげれば解決したとの書き込みがある。

対応

とりあえずの対応

  • Pods/Podfileに以下を追記
pod 'FirebaseFirestoreInternal', '10.22.'

Podfileのどの行に追加するんだ、となると思うので追加した後の自分のPodfileも記載

source 'https://cdn.cocoapods.org/'

platform :ios, '12.0'

target 'UnityFramework' do
  pod 'AppLovinSDK', '11.9.0'
  pod 'Firebase/Analytics', '10.22.0'
  pod 'Firebase/Auth', '10.22.0'
  pod 'Firebase/Core', '10.22.0'
  pod 'Firebase/Crashlytics', '10.22.0'
  pod 'Firebase/Firestore', '10.22.0'
  pod 'Firebase/Functions', '10.22.0'
  pod 'Firebase/Messaging', '10.22.0'
  pod 'Firebase/RemoteConfig', '10.22.0'
  pod 'Firebase/Storage', '10.22.0'
  pod 'PurchasesHybridCommon', '8.2.1'
  pod 'FirebaseFirestoreInternal', '10.22.'
end
target 'Unity-iPhone' do
end
use_frameworks! :linkage => :static

post_install do |installer|
  installer.generated_projects.each do |project|
      project.targets.each do |target|
          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
      end
    end
end

この状態でPodsフォルダがある階層(Pods以下ではなく、Podsフォルダがある階層以上)に移動して、
pod install コマンドを実行。
もしエラーが出たら、Podfile.lockを削除して再度実行。

これでビルドすれば通るはず。

自動化対応

近日中にFirebase側で対応されると思うが、それまで毎回手動でPodfileを修正するのも手間なので、自動で修正されるようにしておく。

External Dependency Manager for Unity(EDM4U)が導入済みの前提。

github.com

EDM4Uではカスタムの設定ファイルを配置できる。

https://github.com/googlesamples/unity-jar-resolver?tab=readme-ov-file#config-file

  • 任意の階層のEditorフォルダ以下
  • **Dependencies.xml という命名のxmlファイル があれば、EDM4U側が依存関係を記述したファイルと認識してくれる。

今回Podfileに追記した内容を自動で追加するようにするには、以下のようなファイルをEditorフォルダ以下に追加しておけばOK

CustomFirebaseDependencies.xml

<?xml version="1.0" encoding="utf-8"?>
<dependencies>
    <iosPods>
        <iosPod name="FirebaseFirestoreInternal" version="10.22.0"/>
    </iosPods>
</dependencies>

これでビルドすれば自動でPodfileに追記されいる。

以上

【Unity】TextMeshProのDynamicなフォントアセットの差分が毎実行時に出るのをなくす

TextMeshProのTMP_FontAssetでAtlasPopulationModeがDynamicなやつは動的にテクスチャを生成するけど、動的に切り替わるコンテンツ部分にそのフォントを使用するとエディタで実行するたびにテクスチャの中身が変わり、git上で差分が出る。

なんか気になるので毎回綺麗にしたい。

やったこと

  • エディタでPlayModeが終わるたびにTMP_FontAssetのClearFontAssetData()を呼ぶ

このスクリプトをEditorフォルダ以下に置いておけばOK.

でなくなった。

以上

(もし設定だけでなんとかなるスタンダートな方法とかあれば是非X(https://twitter.com/stamina_tech)とかで教えていただけると幸いです!

【NFCタグ】名刺が必要な状況でNFCタグで事なきを得ようとした話

背景

  • 急遽名刺が必要そうな会に行くことになったけど、用意する暇がなかった
  • とりあえず手間が無く自己紹介できればいいので代替手段を探した

やったこと

NFCタグをスマホの裏に貼っつけて、そこに相手がスマホをかざすと自分のプロフィールページに飛ばすようにすれば良いかなと思いました。

書込み可能な空NFCタグ(シール)はすぐに手に入るのか?と思い調べる。

Amazonでは1枚20円~50円で10~30枚セットとかで売られてる。

ただ、ヨドバシカメラやビックカメラのリアル店舗では置いてない。

欲しいのは今すぐなんだ...!

で結局色々調べて道中にあったビックカメラに売ってたこれを買いました

www.biccamera.com

ダメ元で買ったが書き込みできそうだったので、NFCToolsというアプリでこのブログ上部のWORKSのページに飛ぶように書き込みました。

NFC Tools

NFC Tools

wakdev無料posted withアプリーチ

で、そのタグを自分のバキバキのスマホケースの裏に貼り付けまし。

これで準備OK。

実戦

先方から名刺を受け取って、かわりに自分はケースバキバキのスマホを取り出して「ここにあなたのスマホをかざしてください」みたいなコミュニケーションを人数分行った。

相手は4人いたが全員問題なく読み込めた。

初対面の人達だったので、うまく読み込みなかったら空気が地獄になりそうだったが、大丈夫だった。

その後楽しく歓談しましたとさ。

NFCタグは最適解だったのか?

最初QRコードも検討しましたが、

  • こちらがQRコードを表示する
  • 相手がQRコードを読み取るアプリを起動する
  • 読み取ろうと苦戦する

というのでどんだけスムーズにいっても10秒はかかるだろうなと思った。

その点NFCタグは一人あたり5秒くらいでスムーズに済んだので良かったんじゃないでしょうか。

調べたら同じことを過去にやっている方はたくさんいました。

trap.jp

note.com

商品化も

調べたらNFCを活用した名刺も商品化しているようでした。

prairie.cards

知らなかったよ

その他の使い道

  • かざすと相手の画面に自分宛のPayPayの送金画面を一瞬で表示させるようにできる?ので、飲み会の会計とかで役に立つこともあるかも
  • かざすとYoutubeの特定のリンクへ遷移させられるので、自分の一押しの曲のリンクとかを仕込んでおくと布教に役に立つこともあるかもしれない
  • まあlit.link(リットリンク)のようなプロフィールまとめのサービスに飛ばすリンクを仕込んでおくのが無難かも

まとめ

NFCってなんの略?

おわり