ミッドランドブログ

長めのお知らせ、紹介記事を掲載します

【Flutter】Flutterで作成したアプリをSteamでリリースする #1 環境設定編

Steamworks パッケージを利用してFlutterアプリケーションをSteamにリリースする方法です

 

※ リリースするだけなら動作するアプリをSteamPipeでアップロードすれば問題ありません。

※ readmeに’Steamworks SDK wrapper written in a darty way to be used in dart projects’の記述がありました。念のためご注意ください

 

steamworksパッケージを使用しました。(この記事を作成した時点でvar 0.4.6)

pub.dev

 

steamworksとは別にsteamworks_genというパッケージも存在するようです。興味のある方はこちらもご確認ください

gamesinflutter.com

 

#1 環境設定編

 

1. Windowアプリプロジェクトを作成する

※steamworks var 0.4.6ではWindowsのみサポート

 

2. Steamでアプリを登録

 

3. steamworksパッケージをインストール

steamworksパッケージをインストール

 $ dart pub add steamworks

 

4. steamライブラリ(steamから提供されるもの)をプロジェクトルートにコピー

steam_api64.dll
libsteam_api.so
libsteam_api.dylib

github.com

 

最新版SDKを使用したい場合は、最新版SDKの中から該当するファイルを見つけてコピー

 

5. steam_appid.txt作成

steam_appid.txt作成しプロジェクトルートに設置
ここにSteamのアプリIDを書き込みます

 

 

Flutterを利用したSteamのアプリです

作成した画像はゲームの素材としてもご利用いただけます!

store.steampowered.com

 

 

midland.hatenadiary.jp

 

midland.hatenadiary.jp

 

midland.hatenadiary.jp

 

【Flutter】デスクトップアプリを作成するとAssetsの内容がそのまま出力されてしまう話

「flutter build windows」でビルドしたところ、Release\data\flutter_assets\assetsフォルダにAssetsとして指定した内容がそのまますべて出力されてしまいました。

ファイル名もそのまま、普通に開くことができます。

 

 

これには驚きました。
ビルドのオブションなどで難読化することはできないようで、ここら辺を隠したい場合自力で作る必要があるようです。

 

windowsアプリはベータ版じゃないですよね?

ロードマップを見てもそこら辺のことは何も言及されていません。今更ですが不安になってきました。

https://github.com/flutter/flutter/blob/master/docs/roadmap/Roadmap.md

 

ということでここら辺をうまくパッケージ化出来たら需要があるかもしれません

【アプリ開発者用】Googleの「ポリシーに関するお知らせ」を読んでみる(2024年7月17日掲載分)

これはGooglePlayでアプリを公開していてGoogleポリシー変更などに興味がある方に向けた記事です。
2024 年 7 月 17 日に掲載された「ポリシーに関するお知らせ」にふわっとした解釈を付けてみました。
※記載内容には筆者の勘違いなどが含まれる場合があります。ご注意ください

Chromeの翻訳機能を利用しています

 

support.google.com

 

 

金融商品およびサービス、健康、VPN、政府に関するサービスを提供するデベロッパーは、組織として登録する必要があります。これは、機密性の高い重要なサービスの透明性を高め、継続性を確保するためです。この更新は、まず新しいデベロッパー アカウントに展開される予定です。既存のデベロッパーの皆様には、今年中に詳しい情報をお知らせする予定です。

金融、健康、VPN、政府のアプリは個人アカウントで登録できなくなるようです。地味に影響が大きそうですね

 

スパムと最低限の機能に関するポリシーを更新し、アプリが、Google Play カタログに関する引き上げられた基準を満たし、質の高い機能とコンテンツの優れたユーザー エクスペリエンスによってユーザー エンゲージメントを高められるようにします。

>よくある違反の例
>インストールされないアプリ
>インストールしても読み込まれないアプリ

起動しない系の不具合は優先して対応する必要がありそうです

 

SDK 要件ページを更新し、スパイウェアとフォアグラウンド サービスに関して、SDK に起因するポリシー違反の例を追加します。

>粗悪な SDK コードが原因で上記以外のポリシーに違反する恐れがある点も重要です。SDK がポリシーに準拠してアプリデータを扱っていることを確認する責任はアプリ デベロッパーにあります。すべてのポリシーの全文を確認し、最新の更新について常に把握するようにしてください。

出元が怪しいAssetsやSDKの使用は注意が必要ですね。特に広告や測定系

 

マルウェアに関するポリシーを更新し、アプリ デベロッパーは、サードパーティ コードのプロバイダが悪意のあるソフトウェアを配布していると認識された場合、そのコード(SDK など)をアプリから削除する必要があることを明確にします。

これもSDKに関する記述です
近いうちに一斉BANがあるのでしょうか

 

個人ローンに関する権限ポリシーを更新し、給与のオンデマンド支払い(EWA)アプリケーションはその適用対象であり、機密情報に関わる権限へのアクセスが禁止されていることを明確にします。

だそうです

 

不適切なコンテンツに関するポリシーの範囲を明確にし、ニコチンを含むすべての製品(タバコ以外のニコチン製品やニコチンパウチなど)を対象とするとともに、年齢制限および安全保護対策を条件として禁煙補助薬として販売されている製品についての例外を追加します。

だそうです

 

違反措置の適用プロセス ページの内容を明確にし、違反措置に関する説明を追加します。

>削除
>アプリは、そのアプリの以前のバージョンとともに Google Play から削除され、ユーザーはダウンロードできなくなります。
>削除されても Google Play デベロッパー アカウントの状態にすぐには影響はありませんが、複数回削除されるとアカウントが停止される場合があります。

>停止
>アプリは、そのアプリの以前のバージョンとともに Google Play から削除され、ユーザーはダウンロードできなくなります。
>アプリの不承認または削除が繰り返された場合だけでなく、重大なポリシー違反や、複数のポリシー違反により停止となることがあります。
>販売 / 配布停止の対象になると、Google Play デベロッパー アカウントの状態が良好ではなくなります。違反警告を複数回受けると、個人アカウントや関連する Google Play デベロッパー アカウントが停止されることがあります。

削除より停止の方が罪が重いようです

 

システム サービスの SMS や通話履歴に関する権限グループの使用に例外を追加します。詳細はこちら

>システム サービスは、コアシステム機能をサポートするプリインストール ソフトウェアです。
>プリインストール アプリまたはバンドルアプリを提供する携帯通信会社、システム オン チップ(SOC)ベンダー、相手先ブランド製品製造企業(OEM)は、パートナー センターにログインして詳細を参照し、ソフトウェアがシステム サービスとして適格であり、データ セーフティ フォームへの記入の免除を申請できるかどうかを判断できます

だそうです。何を言っているのかよくわかりません

 

銀行および証券会社のアプリがデバイス上で金融取引に関する通話を安全に行えるように、CALL_LOG 権限グループの例外リストを更新します。

だそうです

 

2024 年 8 月 31 日以降、新規アプリとアプリのアップデートの送信は、Android 14(API レベル 34)を対象にする必要があります

だそうです

 

(READ_MEDIA_IMAGES と READ_MEDIA_VIDEO)をリクエストできるアプリの数を減らすため、写真と動画の権限に関するポリシーを導入しました。2024 年 10 月 31 日から、アプリの機能に直接関係のある目的でのみ、アプリは写真と動画にアクセスできるようになります。こうしたファイルに一度だけアクセスする必要があるアプリや、頻繁にアクセスする必要がないアプリでは、Android の写真選択ツールなどのシステムの選択ツールをご使用いただく必要があります。

公開しているアプリの設定を一度確認しようと思います

 

2024 年 8 月 31 日以降、アプリがヘルスコネクトの権限へのアクセスをリクエストする場合、従来の申請フォームではなく、Google Play Console で申告していただくことになります

だそうです

 

Google Play ファミリー向け自己認定広告 SDK プログラムへの新規申請の受け付けは、2024 年 10 月 31 日までであり、その後は申請できないことにご注意ください。申請期間は 2025 年に再開されます。ガイドラインは後日こちらで発表いたします。現在の参加者と参加者に対するプログラムのコンプライアンス要件は変更されません。

初めてこのプログラムを知りました。
将来子供向けアプリを作る可能性がある場合は申請したほうがいいのでしょうか。
https://support.google.com/googleplay/android-developer/answer/9900633?hl=ja

 

Android 14 以降を対象に USE_FULL_SCREEN_INTENT 権限を使用しているアプリの場合、アプリに権限が付与されたコア機能があり、自動付与の対象かどうかを示すために、Google Play Console で申告を完了することが必要になりました。2024 年 10 月 31 日以降、承認されていないアプリは、新規インストール時に、ユーザーに権限付与を依頼するプロンプトを表示し、拒否された場合はエクスペリエンスを適切に調整する必要があります。

>広告スパムと認証情報フィッシングを回避するため、Android 14 以降では、全画面通知を送信するデフォルトの USE_FULL_SCREEN_INTENT 権限を付与できる対象が、通話機能とアラーム機能があるアプリに制限されています。
>Android 14 にインストールされているすべてのアプリは、USE_FULL_SCREEN_INTENT 権限がデフォルトで有効になっています。インストール時に Google Play ストアは通話機能とアラーム機能がないアプリの全画面インテント(FSI)権限を取り消します。
>Android 13 以前を搭載したスマートフォンにインストールされているアプリの場合、USE_FULL_SCREEN_INTENT 権限は引き続きデフォルトで有効になっています。

広告SDKがこの権限を勝手に追加するのでしょうか?
よくわかりません

 

いずれかのアプリに影響が及ぶ場合に備えて、ポリシーの更新を入念に確認してください。今回の変更に準拠する方法について詳しくは、以下をご覧ください。

だそうです

 

 

midland.hatenadiary.jp

【Flutter】デスクトップアプリのTextFieldでフォーカスが外れた時にonSubmittedが呼ばれなかった話

FlutterのwindowsアプリでTextFieldを使おうとしたとき、フォーカスが外れたタイミングでonSubmittedが呼ばれずに困りました。

windowsアプリの場合、入力完了後Enterキーを押さないとonSubmittedイベントが発生しないようです。

onChangedで代用しようかと思いましたが、想定した挙動になりません。
GTP先生に聞いたところFocusNodeを使えとの回答が

とりあえずこんなコードでフォーカスが外れたタイミングを入力完了として扱えるようになりました。

 


import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FocusExample(),
    );
  }
}

class FocusExample extends StatefulWidget {
  @override
  _FocusExampleState createState() => _FocusExampleState();
}

class _FocusExampleState extends State {
  final FocusNode _focusNode = FocusNode();
  final TextEditingController _controller = TextEditingController();

  @override
  void initState() {
    super.initState();
    _focusNode.addListener(_onFocusChange);
  }

  @override
  void dispose() {
    _focusNode.removeListener(_onFocusChange);
    _focusNode.dispose();
    _controller.dispose();
    super.dispose();
  }

  void _onFocusChange() {
    if (!_focusNode.hasFocus) {
      // フォーカスが失われた
      final text = _controller.text;
      print('入力内容: $text');
      _somethingProcess(text);
    }
  }

  void _somethingProcess(String text) {
    // 必要な処理
  }
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Focus Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: TextField(
          controller: _controller,
          focusNode: _focusNode,
          onSubmitted: (text) {
            _somethingProcess(text);
          },
          decoration: InputDecoration(
            labelText: 'Enter text',
          ),
        ),
      ),
    );
  }
}

  
  
  

 

 

 

 

 

Unity IAPをアンインストールしてもcom.android.vending.BILLING権限が消えなかった話

GooglePlayのポリシー違反対応の為、In App Purchasing(Unity IAP)パッケージを削除してアップロードしたところ、com.android.vending.BILLING 権限が消えずリリースできませんでした。

※「ご対応のお願い: サポートされているバージョンの Google Play Billing Library に移行してください」の件です

 

 

 

プロジェクトファイルをBILLINGでgrepしたところ、インポートしている古いパッケージ(GooglePlayGames)の中に下の行が入ったファイルが見つかりました。

<uses-permission android:name="com.android.vending.BILLING"></uses-permission>

 

上記の行をコメントアウトしたところ無事リリースできました。

 

【Flutter】機内モードでテストをしていたらgoogle_fontsでフォントが読み込めなかった話

機内モードに設定したままgoogle_fontsを使用した文字列を表示するテストしていました。

そうしたら以下のエラーが発生し、正しくフォント表示ができませんでした。

 

Error: google_fonts was unable to load font AmaticSC-Regular because the following exception occurred:
Exception: Failed to load font with url https://fonts.gstatic.com/s/a/06a80a564c495610f0e552c7088d9b2cba6293c27d1338e0be693a6c51ef7819.ttf: ClientException with SocketException: Failed host lookup: 'fonts.gstatic.com' (OS Error: No address associated with hostname, errno = 7), uri=https://fonts.gstatic.com/s/a/06a80a564c495610f0e552c7088d9b2cba6293c27d1338e0be693a6c51ef7819.ttf

ロードしたフォントはキャッシュされるようで、一度でもロードしていればその後機内モードで使用しても問題無いようです。

 

よく考えたら「そりゃそうだよな」という話ですね。

ネットワークへの接続が保証されない状況でgoogle_fontsを使用するアプリは、ユーザーに何らかの警告をした方がいいかもしれません。

 

pub.dev

Applovinのアカウントが停止になった話

以前利用していたApplovinをもう一度利用したくなったので、久しぶりにApplovinにアクセスしてみました。

※数年前一か月程度Applovinの広告を利用していました。

 


メールボックスを漁ってみたら昨年の12月に次のようなメールが届いていました

 

As part of our ongoing efforts to maintain the security and integrity of our platform, we regularly review and monitor user accounts.
Unfortunately, your account no longer meets our activation requirements and as a result has been disabled. This action is taken to safeguard your account and any associated data from unauthorized access.
If you believe this update was made in error or if you wish to reactivate your account, please reach out to account-approval@applovin.com.

当社のプラットフォームのセキュリティと整合性を維持するための継続的な取り組みの一環として、当社は定期的にユーザー アカウントを確認および監視しています。
残念ながら、あなたのアカウントはアクティベーション要件を満たしていないため、無効化されました。この措置は、アカウントおよび関連データを不正アクセスから保護するために行われます。
この更新が誤って行われたと思われる場合、またはアカウントを再アクティブ化したい場合は、account-approval@applovin.com までご連絡ください。

 

Admobのアカウント停止の話はよくありますがApplovinでも停止されることがあるようです。

停止の理由は説明してくれないタイプのようです。長期間の放置がアウトだったのかなと考えていますが、理由は今ひとつわかりません。

とりあえず指定のメールアドレスにアカウントの再開希望の連絡を入れることにしました。

返信があったら追記をしようと思います。

 

追記:

指定のメールアドレスに連絡を入れた後下記のようなメールが届きました

In order to activate your account, you must have an application published on the App Store or Play Store that adheres to the AppLovin Terms of Service and Policies for Publishers. If you meet these requirements, please send your AppLovin account email and links to your most downloaded applications to account-approval@applovin.com from your developer email listed on your app's page in the app store.

 

指示通りストアに表示しているアドレスからメールを送ると、確認用のリンクが送られこれにアクセスをした後無事再有効化がされたようです。

問題の理由は結局よくわかりませんが「Minimum Content Requirements」の「Remains under construction.」あたりかなという気はしています。

 

www.applovin.com