そういうのがいいブログ

アプリ個人開発 まるブログ

アプリ開発覚え書き

ButtonClick プライバシーポリシー

制定日:2021/05/03

このページは、Maruyu Apps(以下「私」と言います。)が提供するスマートフォンアプリ「ButtonClick」(以下「本アプリ」と言います。)における利用者情報の取扱いについて、以下のとおりアプリケーション・プライバシーポリシー(以下「本ポリシー」といいます。)を定め、公表しております。本アプリをインストールする前に本ポリシーをご確認いただき、内容をご理解の上で本アプリをご利用下さい。
なお、本ポリシーにおいて、「利用者情報」とは、お客様の識別に係る情報、通信サービス上の行動履歴、その他お客様のスマートフォンにおいてお客様と結びついた形で生成、利用又は蓄積されている情報であって、本ポリシーに基づき当社が取得するものを意味するものとします。

本アプリが利用する利用者情報

 
本アプリが利用する利用者情報は、下記の3つです。
  • アプリの広告表示のためにお客様の情報の一部を送信する可能性があります。
  • アプリではアクセス解析ツールを用いてアプリの利用状況を収集しております。
  • 問い合わせの際に利用者情報の一部を送信します。
  1. アプリの広告表示本アプリは広告表示のためにお客様の情報の一部を送信する可能性があります。広告表示は、下記2社のサービスを利用しており、本アプリは2社に利用者情報の提供を行います。それぞれのサービスが利用している利用者情報と目的については各社のサービスのプライバシーポリシーをご確認ください。

  2.アプリのアクセス解析
  本アプリではアクセス解析ツールを用いてアプリの利用状況を収集しております。

  アクセス解析Google Analyticsを利用しております。

  本アプリは画面遷移を行った際に、画面IDと利用者情報をGoogle Analytics

  に送付します。

  1. 問い合わせ
    本アプリでは問い合わせの際に利用者情報の一部を送信します。
    問い合わせはメールで行い、メール本文に下記情報が埋め込まれます。また、メールで送信されるため、メールアドレスも送信されます。
    • 名前、メールアドレス
    • 端末名、OSバージョン、その他端末情報(画面サイズ、ピクセル密度、利用可能ヒープメモリ量)
    • アドオン購入状況

利用目的

利用者情報はそれぞれ下記目的に利用されます。

  • 三者の広告の配信・表示のため
  • 当社のサービスに関連して、個人を識別できない形式に加工した統計データを作成するため
  • 本アプリに関するご案内、お問い合せ等への対応のため

【Unity】iOS14.5以降でIDFA取得するためにATT対応する方法 

追記<2023年9月>

本記事内容で対応できなくなっていました。
以下の記事を参照してください。

marumaro7.hatenablog.com

はじめに

タイトル専門用語でわけわからん!
はい、私も同じです。
とりあえず、広告収益に影響が出る恐れがあるということなので、
対応していきますっ!

IDFAとは?

IDFAはIdentifier For Advertisingの略

端末固有のIDで、これを使ってデータが収集されます。
そして、そのIDのユーザーに興味がありそうな広告を
表示するために使用されます。

なので、IDFAを取得していないと、 ガチゲーマーに美容液の広告が表示されたりするので、
広告をタップしてもらう確率が低くなると予想されています。

(ガチゲーマーは美容液使わないという話では無いですよっ!
広告をタップする確率が高いか低いかの話ですっ!)

iOS14.5から仕様変更

iOS14.4まではこのIDFAがユーザーの許可無しで取得できていました。

しかし、iOS14.5からIDFAを取得するにはユーザーの許可が必要になりました。

ATTとは?

ATTはAppTrackingTransparency の略

iOS14からIDFAの許諾をATTシステムで管理するようになりました。

「勝手にIDFA取得させねぇから!システム」と思っておけば良いと思います。
(よくわかってない)

許可リクエスト実装

IDFAを取得するために、
ユーザーへ許可を問うリクエストウインドウを表示する必要があります。
今回はその許可リクエストを実装します。

1.前提条件

Google Mobile Ads Unity Plugin v5.4.0
・広告は実装済

2.コード実装

コード実装の流れは下記です。
1.Objective-Cの言語でリクエストウインドウを表示する処理を書く
2.C#にて↑で作った処理を呼び出す

2-1.Objective-Cの処理

2-1-1.拡張子mmのファイルを作成する

テキストエディットで適当にテキストファイルをデスクトップに作ります。

ファイルの名前を「RequestIDFA.mm」に変更します。
ファイル名は何でも良いですが、拡張子を「.mm」にして下さい。

2-1-2.リクエストウインドウを表示する処理を書く

「RequestIDFA.mm」に処理を書いていきます。

#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <AdSupport/AdSupport.h>

extern "C" void _requestIDFA() {
    if (@available(iOS 14.5,*)) {
        [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
            // Tracking authorization completed. Start loading ads here.
            // [self loadAd];
          }];
    }
}

2-1-3.Unityにファイルを追加

Unityにファイルを追加します。
Assets>Plugins>iOSに今回作成した「RequestIDFA.mm」を追加して下さい。

2-2.Unity(C#)での処理

2-2-1.スクリプト作成

C#スクリプトを作成します。
今回は「IDFA」という名前で作りました。
スタート関数でリクエストウインドウを呼び出す内容となっています。

<コード変更 2021年10月1日>
iOS15では起動直後にリクエストウインドウを表示しようとしても表示されません。
そのため、1秒遅延させて表示する内容に変更しました。
(Invoke関数を使って1秒遅延させただけです。)

<追記 2022年1月17日>
カメラ権限など他の権限ウインドウも同時に開くようですと、
リクエストウインドウが表示されない場合があります。
その場合は、任意のタイミングで呼び出すと良いでしょう。

<追記 2022年5月24日>
Unityエディター上で動作させるとエラーが出るので(エラーが出るだけで動作上問題無し)
Unityエディターの場合は動作させないように分岐を追加

using UnityEngine;
using System.Runtime.InteropServices;

public class IDFA : MonoBehaviour
{

#if UNITY_EDITOR//Unityエディターの場合の処理

    //何もしない

#elif UNITY_IOS//Unityエディターでない かつ iOSの場合に処理

    //RequestIDFA.mm で定義しているObjective-C(iOSで使用されている言語)の関数を以下のようにC#側で定義する
    [DllImport("__Internal")]//iOSのプラグイン読み込み 参考 https://docs.unity3d.com/ja/2018.4/Manual/NativePlugins.html
    private static extern void _requestIDFA();//外部で実装されるメソッドを宣言 参考 https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/extern

#endif//Unityエディターでない かつ iOSの場合の処理範囲終わり


    private void Start()
    {
        Invoke("DelayIDFA", 1);//1秒遅らせてDelayIDFA()の呼び出し (iOS15では遅延させないと表示されないため)
    }


    private void DelayIDFA()
    {
#if UNITY_EDITOR//Unityエディターの場合の処理

        //何もしない

#elif UNITY_IOS//Unityエディターでない かつ iOSの場合に処理

        _requestIDFA();//IDFAリクエストの実行

#endif//Unityエディターでない かつ iOSの場合の処理範囲終わり

    }

}



ほんの少しコードを短くする場合は下記

using UnityEngine;
using System.Runtime.InteropServices;

public class IDFA : MonoBehaviour
{
#if !UNITY_EDITOR && UNITY_IOS
    //RequestIDFA.mm で定義しているObjective-C(iOSで使用されている言語)の関数を以下のようにC#側で定義する
    [DllImport("__Internal")]//iOSのプラグイン読み込み 参考 https://docs.unity3d.com/ja/2018.4/Manual/NativePlugins.html
    private static extern void _requestIDFA();//外部で実装されるメソッドを宣言 参考 https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/extern
#endif

    private void Start()
    {
        Invoke("DelayIDFA", 1);//1秒遅らせてDelayIDFA()の呼び出し (iOS15では遅延させないと表示されないため)
    }

    private void DelayIDFA()
    {
#if !UNITY_EDITOR && UNITY_IOS
        _requestIDFA();//IDFAリクエストの実行
#endif
    }
}

2-2-2.空のオブジェクトに割付け

作成した「IDFA」のコードを空のオブジェクトに割り付けます。
空のオブジェクトの名前も「IDFA」にしました。

2-2-3.ビルド

ビルドしてUnity-iPhone.xcodeprojを開いて下さい。

一応ビルド手順
marumaro7.hatenablog.com

3.Xcodeでの設定

Xcodeでは
1.Info.plistに「Privacy - Tracking Usage Description」を追加
2.「AppTrackingTransparency.framework」を追加
を行う必要があります。

3-1.Info.plistに「Privacy - Tracking Usage Description」を追加

Unity-iPhone
>info.plist (Xcodeバージョン13.0では表記がinfoになっています。)
>「+」ボタン(マウス カーソルをInformation Property Listに合わせると出現します)
>「Privacy - Tracking Usage Description」と入力し追加
>追加した「Privacy - Tracking Usage Description」のValueに説明書きを追加
例:あなたの好みに合わせた広告を表示するために使用されます
Valueに入力しないと例外処理とされてしまうようなので必ず入力しましょう

文章の多言語化はこちらの「アプリ名ローカライズ iOS編」の要領で
NSUserTrackingUsageDescription = "日本語";
とすればできます。 marumaro7.hatenablog.com

NSUserTrackingUsageDescriptionの入力例
(画像には文末のセミコロンの入力できてませんのでお忘れなく!)

3-2.「AppTrackingTransparency.framework」を追加

>Unity-iPhone
>UnityFramework
>「+」ボタン
>AppTrackingTransparency.frameworkを追加

4.動作確認

iOS14.5以降にだけ表示されます。

もし表示されない場合
端末の
>設定
>プライバシー
>トラッキング
>Appからのトラッキング要求を許可
>オン
になっていることを確認してください。

<2022年2月 追記>
テスト広告を表示するには、
ATTウインドウの「許可」を押さないと表示されませんのでご注意ください。

自動で設定

「3.Xcode」での設定は
Unity側の設定で自動化することができます。

以下を参考にすると良いです。

dolphinetech.com

以下引用

ここでは、プロジェクトビルド後に自動でframeworkを追加し、
info.plistを編集してくれる方法(というかスクリプト)を書いていきます

Assets > Editor にファイルを一つ作ってください(Editorフォルダがない場合は作成してください)

私は、「AddElementsInfoplist」としました

作成したファイルに以下かのような処理(クラス名以外)を実装してください

#if UNITY_IOS
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using UnityEngine;
public class AddElementsInfoplist
{
    [PostProcessBuild]
    public static void OnPostProcessBuild(BuildTarget buildTarget, string buildPath)
    {
        // Info.plist に Privacy - Tacking Usage Description(NSUserTrackingUsageDescription)を追加する(ステップ2)
        string infoPlistPath = buildPath + "/Info.plist";
        PlistDocument infoPlist = new PlistDocument();
        infoPlist.ReadFromFile(infoPlistPath);
        PlistElementDict root = infoPlist.root;
        root.SetString("NSUserTrackingUsageDescription", "あなた様の好みに合わせた広告を表示するために使用されます!!!!");
        infoPlist.WriteToFile(infoPlistPath);
        
     // PBXProjectクラスというのを用いてAppTrackingTransparency.frameworkを追加していきます(ステップ3)
        string pbxProjectPath = PBXProject.GetPBXProjectPath(buildPath);
        PBXProject pbxProject = new PBXProject();
        pbxProject.ReadFromFile(pbxProjectPath);
        string targetGuid = pbxProject.GetUnityFrameworkTargetGuid();
        pbxProject.AddFrameworkToProject(targetGuid, "AppTrackingTransparency.framework", true);
        pbxProject.WriteToFile(pbxProjectPath);
    }
}
#endif

これでUnityでビルド後、自動的にframeworkの追加とInfo.plistの編集が行われているはずです!

おわりに

言語化がわからなかったので、
Twitterで助けを求めたらすぐ助けていただきました。
JOEさんありがとうございます。


<追記> iPhoneをiOS14.5にしたら下記の対応が必要です。 marumaro7.hatenablog.com



最後に宣伝させてください。
アプリ開発を始めて丸2年が経ち、
節目としてなにか形にしたいと思い、Udemy講座を出しました!
www.udemy.com

ブログ限定割引リンクは私のプロフィールページにあります。
アプリ開発収益化を時短したい方向けの講座となっております。

Unity本を出版しました!

突然ですが、Unity本を出版しました!
こちらを読むことで、スクリプトの基礎固めができます!
現在、kindle unlimitedで読み放題設定中です。今のうちにどうぞ!


もっと早く教えてほしかった!Unity C#入門

参考

qiita.com dolphinetech.com hirokuma.blog blog.be-style.jpn.com qiita.com qiita.com developers.google.com

<追記 2021年10月1日>

stackoverflow.com qiita.com

iOS14.5のテストビルドにはmacOS Big SurとXcode12.5が必要です。

はじめに

iOS14.5のテストビルドに少しつまづいた話です。

教訓

最初に今回の教訓だけ言います。
Xcode12.5はこのリンクからアップデートしましょう!

Xcode

Xcode

  • Apple
  • 開発ツール
  • 無料
apps.apple.com

iOS14.5テストビルドに必要なもの

iOS14.5テストビルドに必要なものは以下です。

macOS Big Sur(ビッグサー)
・Xcode12.5

なので、macOSがCatalina(カタリナ)なのであればOSのアップデートが必要です。
その後にXcodeをバージョンアップする必要があります。

ちなみに、
iPhoneをiOS14.5にアップデート後は、
古いXcodeバージョンでビルドしようすると怒られます。

f:id:marumaro7:20210501053410p:plain

問題:Xcodeをアップデートしたのにビルドできない

XcodeをデスクトップのAppStoreから検索してアップグレードしました。

だがしかし!

同じエラーが出てビルドができませんでした!

f:id:marumaro7:20210501053410p:plain

Xcodeのアップデート情報を見ると、

サポートはiOS14.4までとなっています・・・

Xcodeは、もうこれ以上アップデートできない・・・

え?詰んだ?\(^o^)/

iOS14.5に対応しているXcode12.5が実はあった!

ネットを徘徊していると
ここにiOS14.5に対応しているXcode12.5がありました!

Xcode

Xcode

  • Apple
  • 開発ツール
  • 無料
apps.apple.com

Xcode12.5がリリースされたのが4日前とのことだったので
ストアに反映されていなかっただけのようです。

おわりに

無駄にXcodeのアップデートしちゃった


最後に宣伝させてください。
アプリ開発を始めて丸2年が経ち、
節目としてなにか形にしたいと思い、Udemy講座を出しました!
www.udemy.com

ブログ限定割引リンクは私のプロフィールページにあります。
アプリ開発収益化を時短したい方向けの講座となっております。

「逆翻訳 翻訳時短」 プライバシーポリシー

制定日:2021/04/04

このページは、Maruyu Apps(以下「私」と言います。)が提供するスマートフォンアプリ「逆翻訳 翻訳時短」(以下「本アプリ」と言います。)における利用者情報の取扱いについて、以下のとおりアプリケーション・プライバシーポリシー(以下「本ポリシー」といいます。)を定め、公表しております。本アプリをインストールする前に本ポリシーをご確認いただき、内容をご理解の上で本アプリをご利用下さい。
なお、本ポリシーにおいて、「利用者情報」とは、お客様の識別に係る情報、通信サービス上の行動履歴、その他お客様のスマートフォンにおいてお客様と結びついた形で生成、利用又は蓄積されている情報であって、本ポリシーに基づき当社が取得するものを意味するものとします。

本アプリが利用する利用者情報

 
本アプリが利用する利用者情報は、下記の3つです。
  • アプリの広告表示のためにお客様の情報の一部を送信する可能性があります。
  • アプリではアクセス解析ツールを用いてアプリの利用状況を収集しております。
  • 問い合わせの際に利用者情報の一部を送信します。
  1. アプリの広告表示本アプリは広告表示のためにお客様の情報の一部を送信する可能性があります。広告表示は、下記2社のサービスを利用しており、本アプリは2社に利用者情報の提供を行います。それぞれのサービスが利用している利用者情報と目的については各社のサービスのプライバシーポリシーをご確認ください。

  2.アプリのアクセス解析
  本アプリではアクセス解析ツールを用いてアプリの利用状況を収集しております。

  アクセス解析Google Analyticsを利用しております。

  本アプリは画面遷移を行った際に、画面IDと利用者情報をGoogle Analytics

  に送付します。

  1. 問い合わせ
    本アプリでは問い合わせの際に利用者情報の一部を送信します。
    問い合わせはメールで行い、メール本文に下記情報が埋め込まれます。また、メールで送信されるため、メールアドレスも送信されます。
    • 名前、メールアドレス
    • 端末名、OSバージョン、その他端末情報(画面サイズ、ピクセル密度、利用可能ヒープメモリ量)
    • アドオン購入状況

利用目的

利用者情報はそれぞれ下記目的に利用されます。

  • 三者の広告の配信・表示のため
  • 当社のサービスに関連して、個人を識別できない形式に加工した統計データを作成するため
  • 本アプリに関するご案内、お問い合せ等への対応のため

【Unity】テキストのコピー機能を実装する方法

モバイル端末でインプットフィールドのテキストを
うまくコピーできなかったのでメモ

実装方法

下記スクリプトの関数をボタンに割り当てる

using UnityEngine;
using UnityEngine.UI;

public class CopyText : MonoBehaviour
{
    [SerializeField] private Text copyTarget_text;//コピーするテキストをアタッチ

 //この関数をボタンに割り当て
    public void CopyTextButton()
    {
        GUIUtility.systemCopyBuffer = copyTarget_text.text;
    }
}

参考

kan-kikuchi.hatenablog.com

【Unity】スクリプトから影を消す

参考記事の影を消す設定
スクリプトから実行するのに時間がかかったのでメモ

参考

tsubakit1.hateblo.jp

スクリプト

using UnityEngine.Rendering;
private SkinnedMeshRenderer skinnedMeshRenderer;
                //SkinnedMeshRendererを取得
                 skinnedMeshRenderer = gameObject.GetComponent<SkinnedMeshRenderer>();                
                skinnedMeshRenderer.shadowCastingMode = ShadowCastingMode.Off;//ライティング>投影>オフに変更 using UnityEngine.Rendering;が必要
                skinnedMeshRenderer.receiveShadows = false;//ライティング>影を受ける>オフ

【Unity】iOS実機確認中のXcode エラー UnityGfxDeviceWorker (32): EXC_RESOURCE RESOURCE_TYPE_MEMORY (limit=1450 MB, unused=0x0)

エラー内容

開発中のアプリで新機能を実装してiPhone8実機確認中(Xcodeにログが出る状態)にエラー発生
2回同じ内容で試して最初の文字だけ違っているが、たぶん同じ内容
端末は固まったり、落ちる

Xcode上のエラー内容
UnityGfxDeviceWorker (32): EXC_RESOURCE RESOURCE_TYPE_MEMORY (limit=1450 MB, unused=0x0)

Thread 1: EXC_RESOURCE RESOURCE_TYPE_MEMORY (limit=1450 MB, unused=0x0)

調査内容

・ネットで調査>メモリが単純に少ないというコメント発見
・モデルを外部から読み込んだ時に発生する
・私が所持しているAndroid端末はメモリ4GBで同じ処理をしても落ちない
・iPhone8のメモリは2GB

原因はおそらくメモリ不足
iPhoneiPadのメモリを調査したところ
最近の端末は3GB以上なので2GB以下は制約をつけてリリースすることにした。

メモリサイズ取得 hiyotama.hatenablog.com

引用元: 【最新版】iPhone/iPadのメモリ(RAM)容量一覧【歴代全機種】 | iPadBoy

f:id:marumaro7:20210322073248p:plain

f:id:marumaro7:20210322073603p:plain

おわりに

3GB、4GB、6GBでどうなるか試したい
どの端末を買うかが悩ましい・・・