個人アプリ開発で月収5万円目指す

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

アプリ開発覚え書き

厳選!私が実際に役に立ったUnity,iOS おすすめ動画講座【随時追加】

f:id:marumaro7:20200624224539p:plain

はじめに

みなさんプログラミングの勉強どうやって進めていますか??

私のおすすめは断然これ!


Udemy です。

友人から教えてもらったのですが、一流講師の講座が時間を選ばず受けられます。

セール時には1000円台から受講できるので本を買うより安くコスパ最強です。

エンジニアにマンツーマンで教えてもらおうと思うと、
1時間2500円が相場なので、それを考えると定価で購入してもお得だと思ってます。
とはいうものの、副業するならコストはできるだけ抑えたいので購入はセール時が狙い目です。

質問し放題に加えて、30日間返金保障なので安心して購入できます。

Udemyというか動画教材の欠点としては、
あとで見返すときに「確認したいところがわからない」
ということがあるので、Qiitaやブログなどでメモを残しておくと良いかもしれません。

Udemyでは細かくセクションごとに分かれ探しやすくなっていますが、
それでも不思議、私は探す笑

私が実際に役に立ったUdemyのおすすめ講座を紹介します。

Unity教材

Unity ゲーム開発:インディーゲームクリエイターが教える C#の基礎からゲームリリースまで【スタジオしまづ】

Unity ゲーム開発:インディーゲームクリエイターが教える C#の基礎からゲームリリースまで【スタジオしまづ】

【感想】
Unity教材で迷ったらこれで間違いなし! marumaro7.hatenablog.com ↑こちらの記事でも紹介しましたが、Unityの基礎だけでなく、
超つまづきやすいAndroidiOSのリリース手順まで解説しています。
なんですかこれ、、、神ですか?

Unity3D入門の決定版!RPG開発の基本をUnityインストラクターと共に進めるハンズオンコース【スタジオしまづ】

Unity3D入門の決定版!RPG開発の基本をUnityインストラクターと共に進めるハンズオンコース【スタジオしまづ】

【感想】
Unityで3Dをやりたいならこれ!
基礎から学ぶので初心者でも安心♪

Unityゲーム開発入門:Unityインストラクターが教えるマリオ風2Dアクションゲームを作成する方法【スタジオしまづ】

Unityゲーム開発入門:Unityインストラクターが教えるマリオ風2Dアクションゲームを作成する方法【スタジオしまづ】

【感想】
自分でマリオみたいなゲームが作れる幸せ!
マリオメーカーよりも自由に!

[初心者向け] Blender 2.8でアニメーションを作成して Unity で動かすまでの30分講座

[初心者向け] Blender 2.8でアニメーションを作成して Unity で動かすまでの30分講座

【感想】
3Dモデルに命を吹き込む!
Unity×Blenderで制作の幅が広がります。
Blenderのインストールは事前に必要です。

Unity2Dパズルゲーム開発入門:Admob広告実装と高速にスマホゲームを量産する実践テクニック講座【スタジオしまづ】

Unity2Dパズルゲーム開発入門:Admob広告実装と高速にスマホゲームを量産する実践テクニック講座【スタジオしまづ】

【感想】
とにかく量を作る!
なるほど量産テクニックです。

Unityインストラクターが教えるシャドウバースのような本格2Dカードゲーム開発コース【スタジオしまづ】

Unityインストラクターが教えるシャドウバースのような本格2Dカードゲーム開発コース【スタジオしまづ】

【感想】
Unityのチュートリアルをなにかしらやったことある人向けです。
カードゲームの基礎はここに。

iOS教材

【iOS13対応】未経験者がiPhoneアプリ開発者になるための全て iOS Boot Camp

【iOS13対応】未経験者がiPhoneアプリ開発者になるための全て iOS Boot Camp

【感想】
ベストセラーだけあって初心者でもわかりやすい
Firebaseとの連携も解説されているのが個人的に嬉しいポイントです。

おわりに

Unity教材全部スタジオしまづやないか!と思いました?
だってわかりやすいんだもの、、、

【Unity】ローカルプッシュ通知を実装する Android & iOS

はじめに

プッシュ通知には
・サーバーを介さないローカルプッシュ
・サーバーを介するリモートプッシュ
があります。

今回はローカルプッシュを実装していきます。

環境

Unityバージョン2020.3.2f1
Mobile Notifications 1.3.2

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

Unityが用意してくれているパッケージ「Mobile Notifications」を使用します。

取り込み方法
→ウインドウ
→パッケージマネージャー

プッシュ通知 パッケージマネージャー

→パッケージの種類をUnityレジストリに変更(Unityのバージョンによっては名前が違うかもしれません。)
→mobileで検索
→Mobile Notifications
→インストール
プッシュ通知 パッケージマネージャー

設定

設定画面を開いてAndroidiOSの個別のプッシュ通知設定をしていきます。

設定画面は
→編集
→プロジェクト設定
→Mobile Notifications
で見れます。

プッシュ通知

Android設定

Androidの設定は次の3つです。

プッシュ通知

・ReSchedule on Device Restart
 有効:デバイスの再起動後にスケジュールされた通知を保持する。
 無効:スケジュールされた通知はデバイスの再起動後に削除される。

 今回は無効で運用します。


・Use Custom Activity
 有効にすると

ユーザーが通知をタップしたときに開くアクティビティを上書きできます。

 とのことなのですがよくわかりませんね。
 任意の画面を開くということですかね?
 特に使用しないので無効にして運用します。

・Notifications Icons
 通知されたときの画像を登録します。
 登録する画像は2種類あり用途とサイズは以下です。
 追記 ※このサイズで作成する必要はありません。表示されるサイズになります。

 Smallアイコン
  用途:ステータスバーに表示されるアイコン
     ( 透明部分をくりぬいた白い画像が表示されます。) 
  サイズ:48×48

 Largeアイコン
  用途:プッシュ通知欄に表示されるアイコン
  サイズ:192x192



 <アイコン設定方法>
 使用する画像は、プロジェクト内に保存されている必要があります。
 Spritesフォルダなどを作って保存しておいて下さい。  


 そして、取り込んだ画像のインスペクター上で
 「読み込み/書き込み有効」にチェックを入れて適用して下さい。
 ※これをしないとアイコン画像設定時に怒られます。

 

 今回はこのように設定しました。
 アイコンのIdentifierについては、
 コード上でわかりやすくするため次のように設定しています。
 Smallアイコン:ic_stat_notify_small
 Largeアイコン:ic_stat_notify_large

 

iOS設定

iOSの設定は次の3つです。

・Request Authorization on App Launch
 有効:アプリの起動時に承認リクエストウインドウを表示する
 無効:アプリの起動時に承認リクエストウインドウを表示しない

 Androidではプッシュ通知の許可は不要ですが、
 iOSはユーザーの許可がないとプッシュ通知を送ることができません。
 そのため、承認リクエストウインドウを出して
 プッシュ通知を許可するかどうかを選択してもらう必要があります。

 アプリ起動時に承認リクエストウインドウを表示して問題無いので
 今回は有効にして進めます。

 例:承認リクエストウインドウ
 



・Enable Push Notifications
 有効:Xcode上でプッシュ通知機能の宣言を追加する
 無効:Xcode上でプッシュ通知機能の宣言を追加しない

 リモートプッシュをする際には、
 Xcodeでプッシュ通知を使用することを宣言する必要があります。
 ローカルプッシュでは無効にしておきます。

 Xcode上の宣言設定  



・Include Core Location Framework
 特定の場所の範囲に入ったら通知するような時に使用します。
 今回は使用しないのでオフにしておきます。


 公式ドキュメント(翻訳)

iOSNotificationLocationTriggerを使用するには、[ CoreLocationフレームワークを含める]オプションを有効にする必要があります。このオプションは、フレームワークXcodeプロジェクトに追加します。CoreLocation

コード実装

次の2種類のスクリプトを作成して実装していきます。
1.「ローカルプッシュ通知送信クラスのスクリプト
2.「ローカルプッシュ通知の条件を与えて呼び出すスクリプト

1.ローカルプッシュ通知送信クラスのスクリプト作成

「LocalPushNotification」という名前でスクリプトを作成します。

#if UNITY_ANDROID
using Unity.Notifications.Android;
#endif
#if UNITY_IOS
using Unity.Notifications.iOS;
#endif
using System;


// ローカルプッシュ通知送信クラス
public static class LocalPushNotification
{
    
    // Androidで使用するプッシュ通知用のチャンネルを登録する。    
    public static void RegisterChannel(string cannelId, string title, string description)
    {
#if UNITY_ANDROID
        // チャンネルの登録
        var channel = new AndroidNotificationChannel()
        {
            Id = cannelId,
            Name = title,
            Importance = Importance.High,//ドキュメント 重要度を設定するを参照 https://developer.android.com/training/notify-user/channels?hl=ja
            Description = description,
        };
        AndroidNotificationCenter.RegisterNotificationChannel(channel);
#endif
    }




    
    /// 通知をすべてクリアーします。   
    public static void AllClear()
    {
#if UNITY_ANDROID
        // Androidの通知をすべて削除します。
        AndroidNotificationCenter.CancelAllScheduledNotifications();
        AndroidNotificationCenter.CancelAllNotifications();
#endif
#if UNITY_IOS
        // iOSの通知をすべて削除します。
        iOSNotificationCenter.RemoveAllScheduledNotifications();
        iOSNotificationCenter.RemoveAllDeliveredNotifications();
        // バッジを消します。
        iOSNotificationCenter.ApplicationBadge = 0;
#endif
    }




    
    // プッシュ通知を登録します。    
    public static void AddSchedule(string title, string message, int badgeCount, int elapsedTime, string cannelId)
    {
#if UNITY_ANDROID
        SetAndroidNotification(title, message, badgeCount, elapsedTime, cannelId);
#endif
#if UNITY_IOS
        SetIOSNotification(title, message, badgeCount, elapsedTime);
#endif
    }



#if UNITY_IOS
    // 通知を登録(iOS)
    static private void SetIOSNotification(string title, string message, int badgeCount, int elapsedTime)
    {
        // 通知を作成
        iOSNotificationCenter.ScheduleNotification(new iOSNotification()
        {
            //プッシュ通知を個別に取り消しなどをする場合はこのIdentifierを使用します。(未検証)
            Identifier = $"_notification_{badgeCount}",
            Title = title,
            Body = message,
            ShowInForeground = false,
            Badge = badgeCount,
            Trigger = new iOSNotificationTimeIntervalTrigger()
            {
                TimeInterval = new TimeSpan(0, 0, elapsedTime),
                Repeats = false
            }
        });
    }
#endif



#if UNITY_ANDROID
    
    // 通知を登録(Android)   
    static private void SetAndroidNotification(string title, string message, int badgeCount, int elapsedTime, string cannelId)
    {
        // 通知を作成します。
        var notification = new AndroidNotification
        {
            Title = title,
            Text = message,
            Number = badgeCount,

            //Androidのアイコンを設定
            SmallIcon = "ic_stat_notify_small",//どの画像を使用するかアイコンのIdentifierを指定 指定したIdentifierが見つからない場合アプリアイコンになる。
            LargeIcon = "ic_stat_notify_large",//どの画像を使用するかアイコンのIdentifierを指定 指定したIdentifierが見つからない場合アプリアイコンになる。
            FireTime = DateTime.Now.AddSeconds(elapsedTime)
        };

        // 通知を送信します。
        AndroidNotificationCenter.SendNotification(notification, cannelId);
       
    }
#endif
}



コピペで大丈夫です。
Androidのアイコンの指定は下記の部分で行なっています。
・「Androidのアイコン設定で登録したIdentifierの文字列」
・下記の「SmallIcon」または「LargeIcon」に代入する文字列
が異なっているとデフォルトのアイコンが表示されてしまいますので注意して下さい。

 //Androidのアイコンを設定
            SmallIcon = "ic_stat_notify_small",//どの画像を使用するかアイコンのIdentifierを指定 指定したIdentifierが見つからない場合アプリアイコンになる。
            LargeIcon = "ic_stat_notify_large",//どの画像を使用するかアイコンのIdentifierを指定 指定したIdentifierが見つからない場合アプリアイコンになる。

2.ローカルプッシュ通知の条件を与えて呼び出すスクリプト作成

「LocalPushTest」という名前でスクリプトを作成しました。(名前はなんでも良いです。) このコードでは3つのプッシュ通知を登録しています。

using UnityEngine;

public class LocalPushTest : MonoBehaviour
{   
    //Unityが用意した関数(名前は固定)
    //「アプリを開始した時」、「Homeボタンを押した時」、「Backボタンを押した時(ボタンはAndroidのみに存在)」、「OvewViewボタンを押した時(ボタンはAndroidのみに存在)」に実行
    private void OnApplicationFocus()
    {
        SettingPush();//プッシュ通知の設定
    }


    //プッシュ通知の設定
    private void SettingPush()
    {
        // Androidチャンネルの登録
        //LocalPushNotification.RegisterChannel(引数1,引数2,引数3);
        //引数1 Androidで使用するチャンネルID なんでもいい LocalPushNotification.AddSchedule()で使用する
        //引数2 チャンネルの名前 なんでもいい アプリ名でも入れておく
        //引数3 通知の説明 なんでもいい 自分がわかる用に書いておくもの 
        LocalPushNotification.RegisterChannel("channelId", "PushTest", "通知の説明");

        //通知のクリア
        LocalPushNotification.AllClear();

        // プッシュ通知の登録
        //LocalPushNotification.AddSchedule(引数1,引数2,引数3,引数4,引数5);
        //引数1 プッシュ通知のタイトル
        //引数2 通知メッセージ
        //引数3 表示するバッジの数(バッジ数はiOSのみ適用の様子 Androidで数値を入れても問題無い)
        //引数4 何秒後に表示させるか?
        //引数5 Androidで使用するチャンネルID 「Androidチャンネルの登録」で登録したチャンネルIDと合わせておく
        //注意 iOSは45秒経過後からしかプッシュ通知が表示されない        
        LocalPushNotification.AddSchedule("プッシュ通知一つ目", "45秒経過", 1, 45, "channelId");
        LocalPushNotification.AddSchedule("プッシュ通知二つ目", "60秒経過", 2, 60, "channelId");
        LocalPushNotification.AddSchedule("プッシュ通知三つ目", "75秒経過", 3, 75, "channelId");
    }

}


詳しくはコード内に書きましたので、概要だけ書きます。

プッシュ通知の設定関数「SettingPush()」で行っている処理は3つです。
1.Androidのチャンネルの登録 (儀式みたいなものと思っています。)
2.通知のクリア
 (予約されているプッシュ通知やアイコン上に表示されているバッジマークを消します。)
3.プッシュ通知の登録

そして、SettingPush()で設定された処理を
OnApplicationFocus()で呼び出しています。

OnApplicationFocus()の関数はUnityが用意した関数で下記の場合に実行されます。
・アプリを開始した時
・Homeボタンを押した時
・Backボタンを押した時(ボタンはAndroidのみに存在)
・OvewViewボタンを押した時(ボタンはAndroidのみに存在)

詳しくはこちら
qiita.com

SettingPush()の関数をスタート関数で実行するだけでもプッシュ通知は呼ばれますが、
アプリバックグラウンド起動中にプッシュ通知がきてアプリを開いても
プッシュ通知がリセットされません。
また、バッジ設定をしていた場合ずっとバッジのアイコンが残ったままになってしまいます。

3.オブジェクトに割り当ててビルド

空のオブジェクトを作成し「LocalPushTest」のスクリプトを割り当ててビルドして下さい。 f:id:marumaro7:20210711170625p:plain

結果

AndroidiOSにて、 アプリを開いて45秒後、60秒後、75秒後に通知が来ます。

Android
f:id:marumaro7:20210711171009p:plain:w400

iOS
f:id:marumaro7:20210711171054p:plain

おわりに

指定日時に送るときにはこちらが参考になりそうです。

qiita.com

参考

shikaku-sh.hatenablog.com

qiita.com

docs.unity3d.com

grtlab.com

greenkour.hateblo.jp

DanceDreamMV 利用規約

利用規約

この規約は、お客様が、MaruyuApps(以下「当社」)が提供するこのアプリ上で提供するサービス(以下「本サービス」)をご利用頂く際の取扱いにつき定めるものです。本規約に同意した上で本サービスをご利用ください。

第1条(定義)
 本規約上で使用する用語の定義は、次に掲げるとおりとします。
(1)本サービス:当社が運営するサービス及び関連するサービス
(2)本コンテンツ:本サービス上で提供される文字、音、静止画、動画、ソフトウェアプログラム、コード等の総称(投稿情報を含む)
(3)利用者 本サービスを利用する全ての方
(4)コイン:本サービスのサービス及び有償コンテンツと交換可能な仮想通貨です
(5)登録利用者:本サービスの利用者登録が完了した方
(6)ID:本サービスの利用のために登録利用者が固有に持つ文字列
(7)パスワード:IDに対応して登録利用者が固有に設定する暗号
(8)個人情報:住所、氏名、職業、電話番号等個人を特定することのできる情報の総称
(9)登録情報:登録利用者が本サービスにて登録した情報の総称(投稿情報は除く)
(10)知的財産:発明、考案、植物の新品種、意匠、著作物その他の人間の創造的活動により生み出されるもの(発見または解明がされた自然の法則または現象であって、産業上の利用可能性があるものを含む)、商標、商号その他事業活動に用いられる商品または役務を表示するもの及び営業秘密その他の事業活動に有用な技術上または営業上の情報
(11)知的財産権:特許権実用新案権、育成者権、意匠権著作権、商標権その他の知的財産に関して法令により定められた権利または法律上保護される利益に係る権利

第2条(本規約への同意)
1 利用者は、本利用規約に同意頂いた上で、本サービスを利用できるものとします。
2 利用者が、本サービスをスマートフォンその他の情報端末にダウンロードし、本規約への同意手続を行った時点で、利用者と当社との間で、本規約の諸規定に従った利用契約が成立するものとします。
3 利用者が未成年者である場合には、親権者その他の法定代理人の同意を得たうえで、本サービスをご利用ください。
4 未成年者の利用者が、法定代理人の同意がないにもかかわらず同意があると偽りまたは年齢について成年と偽って本サービスを利用した場合、その他行為能力者であることを信じさせるために詐術を用いた場合、本サービスに関する一切の法律行為を取り消すことは出来ません。
5 本規約の同意時に未成年であった利用者が成年に達した後に本サービスを利用した場合、当該利用者は本サービスに関する一切の法律行為を追認したものとみなされます。

第3条(規約の変更)
1 当社は、利用者の承諾を得ることなく、いつでも、本規約の内容を改定することができるものとし、利用者はこれを異議なく承諾するものとします。
2 当社は、本規約を改定するときは、その内容について当社所定の方法により利用者に通知します。
3 前本規約の改定の効力は、当社が前項により通知を行った時点から生じるものとします。
4 利用者は、本規約変更後、本サービスを利用した時点で、変更後の本利用規約に異議なく同意したものとみなされます。

第4条(アカウントの管理)
1 利用者は、利用に際して登録した情報(以下、「登録情報」といいます。メールアドレスやID・パスワード等を含みます)について、自己の責任の下、任意に登録、管理するものとします。利用者は、これを第三者に利用させ、または貸与、譲渡、名義変更、売買などをしてはならないものとします。
2 当社は、登録情報によって本サービスの利用があった場合、利用登録をおこなった本人が利用したものと扱うことができ、当該利用によって生じた結果ならびにそれに伴う一切の責任については、利用登録を行った本人に帰属するものとします。
3 利用者は、登録情報の不正使用によって当社または第三者に損害が生じた場合、当社および第三者に対して、当該損害を賠償するものとします。
4 登録情報の管理は、利用者が自己の責任の下で行うものとし、登録情報が不正確または虚偽であったために利用者が被った一切の不利益および損害に関して、当社は責任を負わないものとします。
5 登録情報が盗用されまたは第三者に利用されていることが判明した場合、利用者は直ちにその旨を当社に通知するとともに、当社からの指示に従うものとします。

第5条(個人情報等の取り扱い)
個人情報及び利用者情報については、当社が別途定める「DanceDreamMVプライバシーポリシー」に則り、適正に取り扱うこととします。

第6条(禁止行為) 
本サービスの利用に際し、当社は、利用者(以下「利用者」)に対し、次に掲げる行為を禁止します。当社において、利用者が禁止事項に違反したと認めた場合、利用停止、投稿削除等、当社において必要と判断した措置を取ることができるものとし、利用者はこれを異議なく同意するものとします。
(1)当社または第三者知的財産権を侵害する行為
(2)当社または第三者の名誉・信用を毀損または不当に差別もしくは誹謗中傷する行為
(3)当社または第三者の財産を侵害する行為、または侵害する恐れのある行為
(4)当社または第三者に経済的損害を与える行為
(5)当社または第三者に対する脅迫的な行為
(6)コンピューターウィルス、有害なプログラムを仕様またはそれを誘発する行為
(7)本サービス用インフラ設備に対して過度な負担となるストレスをかける行為
(8)当サイトのサーバーやシステム、セキュリティへの攻撃
(9)当社提供のインターフェース以外の方法で当社サービスにアクセスを試みる行為
(10)一人の利用者が、複数の利用者IDを取得する行為
(11)上記の他、当社が不適切と判断する行為

第7条 (コンテンツの取り扱い)
1 利用者は、本サービスのコンテンツを当社の定める範囲内でのみ使用することができるものとします。
2 本サービスで提供される全てのコンテンツに関する権利は当社が有しており、利用者に対し、当社が有する特許権実用新案権意匠権、商標権、著作権、その他知的財産権の実施または使用許諾をするものではありません。
3 利用者は、当社の定める使用範囲を超えていかなる方法によっても複製、送信、譲渡(利用者同士の売買も含みます)、貸与、翻訳、翻案、無断で転載、二次使用、営利目的の使用、改変、逆アセンブル、逆コンパイルリバースエンジニアリング等を行う事を禁止します。
4 前項に関わらず、退会等により利用者が利用者資格を喪失した場合は、提供されたコンテンツの使用権も消滅するものとします。

第8条(有料コンテンツ)
1 本サービス内の一部については、対価を支払うことにより有料コンテンツを購入することができます。有料コンテンツの金額、決済方法その他の事項は、別途当社が定め、本サービスまたは当社ウェブサイトに表示します。
2 当社は、本サービスにおいて無償または有料とされているコンテンツについて、当社の裁量でその価格を変更することがあります。
3 有料コンテンツは、利用者本人の登録情報に対してのみ使用が許諾されます。

第9条(コインの取り扱い)
1 当社は、本サービスにおいて利用者がコインを購入した場合、当社がキャンペーンを実施する場合その他の場合に、当社の定める方法により、利用者にコインを付与します。コインの購入単位、価格、有効期間、その他のコインの付与条件は、当社が定め、本サービス上に表示します。
2 コインの消費については、有料コインから消費されるものとします。
3 当社は、利用者が取得したコインについて、法令上必要な場合を除き、一切払い戻しを行いません。法令に基づきコインを払い戻す場合の払戻方法および条件は、別途当社が定める方法で掲示するものとします。

第10条(換金行為の禁止等)
本サービス内で取得した一切のコンテンツまたは仮想通貨については、直接、第三者による仲介又はインターネットオークション等その手段を問わず、売買その他、金銭その他現実世界における対価を授受する形でのあらゆる譲渡、譲受、貸与、借用等する行為(いわゆるRMTリアルマネートレード】を含みますが、これに限られません。また、本サービス内におけるユーザーの行為に対して金銭その他、現実世界における対価を授受することも含みます。)を禁止いたします。

第11条(免責)
1 当社は、本サービスの内容変更、中断、終了によって生じたいかなる損害についても、一切責任を負いません。
2 当社は、利用者の本サービスの利用環境について一切関与せず、また一切の責任を負いません。
3 当社は、本サービスが利用者の特定の目的に適合すること、期待する機能・商品的価値・正確性・有用性を有すること、利用者による本サービスの利用が利用者に適用のある法令または業界団体の内部規則等に適合すること、および不具合が生じないことについて、何ら保証するものではありません。
4 当社は、本サービスが全ての情報端末に対応していることを保証するものではなく、本サービスの利用に供する情報端末のOSのバージョンアップ等に伴い、本サービスの動作に不具合が生じる可能性があることにつき、利用者はあらかじめ了承するものとします。当社は、かかる不具合が生じた場合に当社が行うプログラムの修正等により、当該不具合が解消されることを保証するものではありません。
5 利用者は、AppStore、GooglePlay等のサービスストアの利用規約および運用方針の変更等に伴い、本サービスの一部又は全部の利用が制限される可能性があることをあらかじめ了承するものとします。
6 当社は、本サービスを利用したことにより直接的または間接的に利用者に発生した損害について、一切賠償責任を負いません。
7 当社は、利用者その他の第三者に発生した機会逸失、業務の中断その他いかなる損害(間接損害や逸失利益を含みます)に対して、当社が係る損害の可能性を事前に通知されていたとしても、一切の責任を負いません。
8 第1項乃至前項の規定は、当社に故意または重過失が存する場合又は契約書が消費者契約法上の消費者に該当する場合には適用しません。
9 前項が適用される場合であっても、当社は、過失(重過失を除きます。)による行為によって利用者に生じた損害のうち、特別な事情から生じた損害については、一切賠償する責任を負わないものとします。 
10 本サービスの利用に関し当社が損害賠償責任を負う場合、当該損害が発生した月に利用者から受領した利用額を限度として賠償責任を負うものとします。
11 利用者と他の利用者との間の紛争及びトラブルについて、当社は一切責任を負わないものとします。利用者と他の利用者でトラブルになった場合でも、両者同士の責任で解決するものとし、当社には一切の請求をしないものとします。
12 利用者は、本サービスの利用に関連し、他の利用者に損害を与えた場合または第三者との間に紛争を生じた場合、自己の費用と責任において、かかる損害を賠償またはかかる紛争を解決するものとし、当社には一切の迷惑や損害を与えないものとします。
13 利用者の行為により、第三者から当社が損害賠償等の請求をされた場合には、利用者の費用(弁護士費用)と責任で、これを解決するものとします。当社が、当該第三者に対して、損害賠償金を支払った場合には、利用者は、当社に対して当該損害賠償金を含む一切の費用(弁護士費用及び逸失利益を含む)を支払うものとします。
14 利用者が本サービスの利用に関連して当社に損害を与えた場合、利用者の費用と責任において当社に対して損害を賠償(訴訟費用及び弁護士費用を含む)するものとします。

第12条(広告の掲載について)
利用者は、本サービス上にあらゆる広告が含まれる場合があること、当社またはその提携先があらゆる広告を掲載する場合があることを理解しこれを承諾したものとみなします。本サービス上の広告の形態や範囲は、当社によって随時変更されます。

第13条(サービスの終了)
1 当社は、利用者への適宜の方法で通知することにより、本サービスを終了することができるものとします。
2 利用者は、本サービスが終了した場合、有料コンテンツを利用する権利一切を失い、以後、当該有料コンテンツを利用できなくなることをあらかじめ異議なく同意するものとします。
3 当社は、本サービスが原因を問わず終了した場合、これに起因して生じた利用者または第三者が被った損害について、一切責任を負わないものとします。

第14条(権利譲渡の禁止)
1 利用者は、予め当社の書面による承諾がない限り、本規約上の地位および本規約に基づく権利または義務の全部または一部を第三者に譲渡してはならないものとします。
2 当社は、本サービスの全部または一部を当社の裁量により第三者に譲渡することができ、その場合、譲渡された権利の範囲内で利用者のアカウントを含む、本サービスに係る利用者の一切の権利が譲渡先に移転するものとします。

第15条(分離可能性)
本規約のいずれかの条項又はその一部が、消費者契約法その他の法令等により無効又は執行不能と判断された場合であっても、本規約の残りの規定及び一部が無効又は執行不能と判断された規定の残りの部分は、継続して完全に効力を有するものとします。

第16条(当社への連絡方法)
本サービスに関する利用者の当社へのご連絡・お問い合わせは、本サービスまたは当社が運営するwebサイト内の適宜の場所に設置するお問い合わせフォームからの送信または当社が別途指定する方法により行うものとします。

第17条(準拠法、管轄裁判所)
1 本規約の有効性,解釈及び履行については,日本法に準拠し,日本法に従って解釈されるものとする。
2 当社と利用者等との間での論議・訴訟その他一切の紛争については、当社の所在地を管轄する裁判所を専属的合意管轄とします。

2021年1月1日 施行

【Unity】AdMob GoogleMobileAds-v5.4.0 を v6.0.0に上げた際のエラー対応

環境

macOS 11.3
Google Mobile Ads Unity Plugin v6.0.0
Xcode 12.5
Unity 2020.3.2f1

はじめに

AdMobのプラグイン
GoogleMobileAdsの新しいバージョン6.0.0が半年ぶりくらいにでました。
そして、 v5.4.0からv6.0.0へ上げたら大量のエラーが出たので対応した話です。

https://pbs.twimg.com/media/E18jEzLUYAQKpHQ?format=jpg&name=large

結論 まだバージョンを上げてはいけない

だいたいのエラーは取り除けましたが、下記のエラーが発生しています。
これはプラグイン起因のようで、iOSのビルドが通らない状態です。
(Androidは実機で問題なく広告表示できることを確認しました。)

なので、プラグインのアップデートを待ちたいと思います。

github.com

対応

エラーの読み込み方法の変更

×旧:args.Message
◯新:args.LoadAdError

//バナー読み込み失敗 となった時に起動する関数
    public void HandleAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
    {    
        //×旧:args.Message
        //◯新:args.LoadAdError
        Debug.Log("バナー読み込み失敗" + args.LoadAdError);//args.LoadAdError:エラー内容 
    }

テストデバイス設定の削除

アダプティブバナーのサンプルコードに下記がありますが、
AddTestDeviceは使えなくなっているので削除します。
(テストデバイスの設定はadmobの設定画面から行えますので無くても問題ないです。)

AdRequest adRequest = new AdRequest.Builder()
            .AddTestDevice(AdRequest.TestDeviceSimulator)
            .AddTestDevice("0123456789ABCDEF0123456789ABCDEF")
            .Build();

変更後

AdRequest adRequest = new AdRequest.Builder().Build();

エラーの型変更

リワード広告のサンプルコードではこのようになっています。

//旧 v5.4.0
 //リワード読み込み失敗 となった時に起動する関数
    public void HandleRewardedAdFailedToLoad(object sender, AdErrorEventArgs args)
    {
        Debug.Log("リワード広告読み込み失敗" + args.Message);//args.Message:エラー内容 
    }

変更
・AdErrorEventArgs→AdFailedToLoadEventArgs
・args.Message→args.LoadAdError

//新 v6.0.0
 //リワード読み込み失敗 となった時に起動する関数
    public void HandleRewardedAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
    {
        Debug.Log("リワード広告読み込み失敗" + args.LoadAdError);//args.LoadAdError:エラー内容 
    }

不要なデータを削除

1.データ削除

v6.0.0を入れた新規プロジェクトと見比べたところ、
いろいろとゴミがありました。
一旦GoogleMobileAdsとPluginsを消して入れ直したらエラーが解消されました。

f:id:marumaro7:20210522094718p:plain

2.アプリIDの再設定

アプリIDの情報も一緒に消えてしまうのでアプリIDを再設定してください。
また、Unityを開き直した際、アプリIDは保存されないため再度入力が必要です。
→アセット
Google Mobile Ads
→Settings
f:id:marumaro7:20210522095046p:plain

3.iOSプラグイン再設定

ATT対応でiOSプラグインにファイルを追加している場合は再追加をお忘れなく! marumaro7.hatenablog.com

iOS設定

下記2点の変更が必要です。
・Cocoapods integrarionを
 Xcode Project - Add Cocoapods to the Xcode projectへ変更
 (元から設定していても、データを消したせいかデフォルトに戻っていました。)
・Link frameworks staticallyを有効

→アセット
→External Dependency Manager
iOS Resolver
→設定

f:id:marumaro7:20210522110046p:plain

CocoaPodsのアップデート

ここまでの設定するとコード上のエラーはなくなります。
しかし、ビルド後、下記のエラーが出るようになりました。

エラー抜粋

Analyzing dependencies [!] GoogleAppMeasurement requires CocoaPods version >= 1.10.0, which is not satisfied by your current version, 1.9.1.


依存関係の分析[!] GoogleAppMeasurementにはCocoaPods
バージョン> = 1.10.0が必要ですが、これは現在のバージョン 1.9.1では満たされていません。

ということでCocoaPodsのバージョンを上げました。

marumaro7.hatenablog.com

おわりに

アプリIDが保存されないうちは前バージョンのv5.4.0が無難ですね。
(自動設定することもできるようですが、いじりたくない)


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

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

参考

github.comdevelopers.google.com

guides.cocoapods.org qiita.com

なんもわからん状態からCocoaPodsのアップデートをした

はじめに

UnityでビルドしたところCocoaPodsのバージョンが低いとエラーが出ました。
前知識がない状態から 恐る恐るアップデートをした履歴です。

ターミナルから行うので、自己責任でお願い致します。

CocoaPodsとは

guides.cocoapods.org

CocoaPodsは、Xcodeプロジェクトのライブラリ依存関係を管理します。

アップデート方法

1.ターミナルを起動

ターミナルから操作する必要があるらしいので、ターミナルを起動します。

Finder>アプリケーション>ユーティリティ>ターミナル

ターミナルを起動すると、起動した時間とコンピューター名が勝手に表示されます。

ターミナルについては、こちらで勉強しました。
techacademy.jp

f:id:marumaro7:20210523002853p:plain

2.更新するコマンドを入力する

ターミナルに下記コマンドを入力してエンターキーを押します。

sudo gem install cocoapods

ターミナルの画面 f:id:marumaro7:20210523003946p:plain

管理者パスワード(パソコンのログインに使っているパスワードでいけました。)
を求められるので入力します。
注)パスワード入力の際、どこにも表示されません。

ターミナルで sudo コマンドを使うには管理者パスワードが必要 - Apple サポート

ターミナルでパスワードを入力する際、画面には何も表示されません。
間違ったパスワードを入力したり、パスワードを何も入力しなかった場合は、
コマンドは実行されず、もう一度やり直すように案内されます。

f:id:marumaro7:20210523040652p:plain

パスワードを入力してエンターキーを押すと、動きだすのでしばらく待ちます。
停止したら完了です。

(参考)完了後の画像 f:id:marumaro7:20210523004558p:plain

おわりに

ビルドし直したところ、無事CocoaPodsのエラーは消えました!

参考

guides.cocoapods.org support.apple.com

ButtonClick プライバシーポリシー

制定日:2021/05/03

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

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

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

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

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

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

  に送付します。

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

利用目的

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

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

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

はじめに

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

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のファイルを作成する

テキストエディットで適当にテキストファイルをデスクトップに作ります。 f:id:marumaro7:20210429170709p:plain

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

f:id:marumaro7:20210429172154p:plain

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];
          }];
    }
}

f:id:marumaro7:20210502093330p:plain

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

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

f:id:marumaro7:20210429173916p:plain

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

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

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

using UnityEngine;
using System.Runtime.InteropServices;

public class IDFA : MonoBehaviour
{

#if UNITY_IOS//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//iOSの処理範囲終わり


    private void Start()
    {
#if UNITY_IOS//iOSの場合だけ処理

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

#endif//iOSの処理範囲終わり
    }

}

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

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

2-2-3.ビルド

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

f:id:marumaro7:20210430133248p:plain

一応ビルド手順
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
>「+」ボタン(マウス カーソルをInformation Property Listに合わせると出現します)
>「Privacy - Tracking Usage Description」と入力し追加
>追加した「Privacy - Tracking Usage Description」のValueに説明書きを追加
例:あなたの好みに合わせた広告を表示するために使用されます
Valueに入力しないと例外処理とされてしまうようなので必ず入力しましょう

f:id:marumaro7:20210429180154p:plain

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

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

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

>Unity-iPhone
>UnityFramework
>「+」ボタン
>AppTrackingTransparency.frameworkを追加
f:id:marumaro7:20210429161836p:plain

4.動作確認

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

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

f:id:marumaro7:20210501094550p:plain

自動で設定

「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

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

参考

qiita.com dolphinetech.com hirokuma.blog blog.be-style.jpn.com qiita.com qiita.com developers.google.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

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