openCACAO / cocoa-issues

接触確認アプリ COCOA に関するIssues用レポジトリです
Creative Commons Zero v1.0 Universal
8 stars 0 forks source link

【Android】接触確認アプリCOCOAのローカル通知は機能してないと思われる 件 #8

Open teriha8t8 opened 4 years ago

teriha8t8 commented 4 years ago

https://developers.google.com/android/exposure-notifications/exposure-notifications-api ここには This guide shows you how to use the Exposure Notifications API to build Android apps that notify users of possible exposure to confirmed COVID-19 cases. と書いてあるのに、AndroidはなぜOSが通知を出しているのかは謎。

ZIPの配信が始まって間もなく7月6日にアプリのプッシュ通知がなかったのにアプリを見たら接触情報があった旨のTweetがあった。 「COCOAのプッシュ通知が機能してないのかアプリ立ち上げたら、、、、」 https://twitter.com/rocaz/status/1280067610369855493 (このTweetはAndroidから)

iOSはアプリが通知を出すのは確認されていたが、Androidは不明のまま。 8月初旬にAndroidはアプリではなくOSが通知を出しているのがやっと判明。 TweetにはOSの通知画像が添付されている。 https://twitter.com/ogi_ohashi/status/1289924497919754246?s=20 (このTweetはAndroidから)

これより前、Android版は7月19日に通知を受け取った人がでたが、アプリかOSかどちらの通知だったかは不明。

7月中、Androidはローカル通知の状況が不明のため接触情報を見落としていた人がいてもおかしくはないが、AndroidはそもそもZIPを受信していない端末が圧倒的だったはずなので、接触情報の見落としはなかっただろう…という希望的観測に。

Androidにインストールされた接触確認アプリCOCOAはローカル通知を持っているが、通知を出したことがないと思われる。 Androidの実装は本来どうあるものなのかが不明。

moonmile commented 4 years ago

cocoa の実装的には Xamarin.ExposureNotification の中身で、バックグラウンドで ExposureNotification::UpdateKeysFromServer を呼び出しています。

https://github.com/xamarin/XamarinComponents/blob/master/XPlat/ExposureNotification/source/Xamarin.ExposureNotification/ExposureNotification.shared.cs#L84

この中で、iOS と Android で処理がわかれていて、

https://github.com/xamarin/XamarinComponents/blob/master/XPlat/ExposureNotification/source/Xamarin.ExposureNotification/ExposureNotification.shared.cs#L106-L116

#if __IOS__
                    // On iOS we need to check this ourselves and invoke the handler
                    var (summary, info) = await PlatformDetectExposuresAsync(downloadedFiles, cancellationToken);

                    // Check that the summary has any matches before notifying the callback
                    if (summary?.MatchedKeyCount > 0)
                        await Handler.ExposureDetectedAsync(summary, info); // ★ iOS の場合
#elif __ANDROID__
                    // on Android this will happen in the broadcast receiver
                    await PlatformDetectExposuresAsync(downloadedFiles, cancellationToken); // ★ Android の場合
#endif

という方式になっています。で、Android の broadcast receiver を受けるには AndroidManifest.xml に追加が必要なんだけど、

現状で、Covid19Radar/AndroidManifest.xml at master · openCACAO/Covid19Radar 記述がないのと、

History を見ると 6/25(v.1.1.1 より前?)にいったん消しているんですよね。

Remove from manifest · openCACAO/Covid19Radar@0fcec1d

これが原因で通知を受けていないと思います。詳細は、もう少し Xamarin.ExposureNotifications.ExposureNotification の中身を追わないと駄目そうですが。

moonmile commented 4 years ago

了解です。削除したときのコメントに呼応するのが CallbackService.android.cs みたいですね。 この通知を何とか試したいですね、ちょっと考察。

teriha8t8 commented 4 years ago

気になるTweet。 https://twitter.com/tamaaiko/status/1302227529814609923

このTweetでは「アプリを開かないとわからない」とあります。 AndroidはOS側が通知を出すようになったと思っていましたが、Google開発サービスのバージョンアップによって今週のリマインダー以外のメッセージがでなくなっているのか? 通知画像はiOSはイヤと言うほど見るんですが、Androidユーザーはどれをみても通知画像がなくてアプリの画像なんですよね。

moonmile commented 4 years ago

接触通知のコードレビュー

照葉さんの 8/17 のツイート https://twitter.com/teriha8t8/status/1295142142965215232

接触確認アプリ #iOS版 #iPhone #COCOA

【障害】接触確認アプリの「プッシュ通知」が実装されていない件 7月11日以降に接触確認アプリをインストールした方は、「プッシュ通知」(ローカル通知)が実装されていない可能性が高いです。

注意:「COVID-19接触通知」はプッシュ通知(ローカル通知)ではない

の状態です。

コードを見る

現在のコードでは、プッシュ通知の機能が外されている(NotificationCenter関係がコメントアウトされている)ので、プッシュ通知は発生しない のがコード的には正しい動作(アプリとしては不具合/実装漏れ)だと思います。ただし、それ以前に「プッシュ通知が来ていた」のでここの動作が不思議な感じでした。もともと無かったのか、それとも実装されていたのか?

Releases · openCACAO/Covid19Radar

COCOA のリリースバージョンとはずれていますが、元のコードである Covid19Radar にリリースタグがあります。

ここから過去のコードが zip でダウンロードできます。

COCOAヒストリア · openCACAO/cocoa-documentation Wiki をチェックすると、

の対応になります。

バージョンでコードを比較する

ぞれぞれのコードを比較して、通知あり/なしを探っていきます。基本 NotificationCenter 絡みになるので、VSCode 等で検索すれば見えてくると思うのですが、ここでは cocoa/App.xaml.cs at master · openCACAO/cocoa をチェックしていきます。

v1.0.0

最初のリリースでは、通知 NotificationCenter が有効になっています。

このバージョンは「プッシュ通知が有効」な状態です。

        protected override async void OnInitialized()
        {
            InitializeComponent();

#if DEBUG
            // For debug mode, set the mock api provider to interact
            // with some fake data
            //Xamarin.ExposureNotifications.ExposureNotification.OverrideNativeImplementation(new Services.TestNativeImplementation());
#endif
            Xamarin.ExposureNotifications.ExposureNotification.Init();

            // Local Notification tap event listener
            NotificationCenter.Current.NotificationTapped += OnNotificationTapped; // ※
            LogUnobservedTaskExceptions();

v1.1.0

次のタグは、USE_MOCK が入ったバージョンです。初回リリース直後に、シミュレーターではTEKのダウンロードができなくてテストが難しいため、エミュレータでも動くように疑似データを入れるようにあめいさんが入れた USE_MOCK バージョンです。

このバージョンでも「プッシュ通知が有効」な状態です。

        protected override async void OnInitialized()
        {
            InitializeComponent();

#if USE_MOCK
            // For debug mode, set the mock api provider to interact
            // with some fake data
            Xamarin.ExposureNotifications.ExposureNotification.OverrideNativeImplementation(new Services.TestNativeImplementation());
#endif
            Xamarin.ExposureNotifications.ExposureNotification.Init();

            // Local Notification tap event listener
            NotificationCenter.Current.NotificationTapped += OnNotificationTapped; // ※
            LogUnobservedTaskExceptions();

v1.1.1

問題のリリースが、v1.1.1 になります。

おそらく、Xamarin.ExposureNotification の緊急修正を取り込むために、NuGet 上の Xamarin.ExposureNotification をコード単位で取り込み、このときにプッシュ通知関連の「Plugin.LocalNotification」を外したのだと思われます。

全体を NotificationCenter で検索すると、全てコメントアウトされています。

        protected override async void OnInitialized()
        {
            InitializeComponent();

#if USE_MOCK
            // For debug mode, set the mock api provider to interact
            // with some fake data
            Xamarin.ExposureNotifications.ExposureNotification.OverrideNativeImplementation(new Services.TestNativeImplementation());
#endif
            Xamarin.ExposureNotifications.ExposureNotification.Init();

            // Local Notification tap event listener
            //NotificationCenter.Current.NotificationTapped += OnNotificationTapped;    // ※
            LogUnobservedTaskExceptions();

v1.1.2

その後のバージョンは、プッシュ通知 NotificationCenter が外れた状態です。

        protected override async void OnInitialized()
        {
            InitializeComponent();

#if USE_MOCK
            // For debug mode, set the mock api provider to interact
            // with some fake data
            Xamarin.ExposureNotifications.ExposureNotification.OverrideNativeImplementation(new Services.TestNativeImplementation());
#endif
            Xamarin.ExposureNotifications.ExposureNotification.Init();

            // Local Notification tap event listener
            //NotificationCenter.Current.NotificationTapped += OnNotificationTapped; // ※
            LogUnobservedTaskExceptions();

v1.1.3

最新版もプッシュ通知 NotificationCenter が外れた状態です。

        protected override async void OnInitialized()
        {
            InitializeComponent();

#if USE_MOCK
            // For debug mode, set the mock api provider to interact
            // with some fake data
            Xamarin.ExposureNotifications.ExposureNotification.OverrideNativeImplementation(new Services.TestNativeImplementation());
#endif
            Xamarin.ExposureNotifications.ExposureNotification.Init();

            // Local Notification tap event listener
            //NotificationCenter.Current.NotificationTapped += OnNotificationTapped;    // ※
            LogUnobservedTaskExceptions();

過去の現象

最初の現象をチェックすると

7/11 というラインが微妙なところなのですが、

にあたると考えられます。タグの v1.1.0 は App Store に上がっていません。 iOS のマイナーバージョンも微妙に上がっているので、これも絡むのかもしれませんが。

修正案

iOS と Android からの週報/月報の通知が混乱した状態なので、ローカル通知自体を復活させるかどうかの検討も必要なのですが(そもそも、v1.1.1 は、OS 側の通知と競合するから消した可能性もあり?)、ローカル通知を復活させるためには、以下のコード修正が望ましいと思われます。

これでローカル通知がでるかのテスト必須ですが。

teriha8t8 commented 4 years ago

OS と Android からの週報/月報の通知が混乱した状態なので、ローカル通知自体を復活させるかどうかの検討

ややこしいのがここです。 AndroidはOS(Google開発サービス)がローカル通知(matchCountがあったときの通知)を出している端末がある(現状、全端末ではない)ので、ローカル通知を復活させると一部端末では競合が起きることになります。 なので、Androidのローカル通知はどう組み込むべきなのかはわかりません。

iOSはローカル通知(matchCountがあったときの通知)は競合しません。OSがプッシュ通知をだすこと(だしたこと)はありません。 13.6.1までは週報に週計がでましたが、13.7からはこれが内容の違う月報に変わったので、iOSはローカル通知(プッシュ通知)は必須です。

(以前、楠さんが「通知が2つあると混乱するから消した」とTweetされた件は、Androidなら当てはまりますが、iOSには当てはまりません。開発側も「通知」を把握してない気がします。)

但し、EN Expressを導入すれば、アプリのローカル通知(プッシュ通知)は両OS共に不要だと思われます。ExpressになればmatchCountが発生するたびOSが通知を出すはずです。

両OSがだすローカル通知は、matchCountの発生のみはずです。アプリに複雑なリスク判定を持たせるならExpress対応後もアプリのローカル通知(プッシュ通知)は必須になります。(ドイツはきっとこちらでしょう。) この場合、通知の競合が問題になると思われますが、OSが出す通知は、iOSはコントロール可能です(設定→通知→Exposure Notification→で出さないようにできます)。でもAndroidはOSが出す通知のコントロールは不明です。

現状、Expressの導入が早期に行われるなら、ローカル通知の修正はないままExpress対応バージョンをだしてくれればいいように思います。 しかし、Expressの導入がまだ先となるなら、iOSは修正を急いでもらいたい案件です。 でも、Androidは、ホント、わかりません。

teriha8t8 commented 4 years ago

全部追い切れないので、実機操作からみた経緯だけ書いておきます。

6/19 1.0.0リリース 6/30 1.1.1リリース 7/11 サーバーがExposure Notification機能は無効を返してくるようになった 7/13 1.1.2リリース 7/15 iOS13.6配信開始(このバージョンから週報)

1.0.0 インストール時に権限拒否をやるとアプリが実装されないバグ 1.1.1 上記を修正 したことになっていますが、インストール時の最後で権限拒否(Exposure Notificationを有効にしない)をやると(falseの場合)、アプリのローカル通知(プッシュ通知)が実装されませんでした。 権限拒否しなければ(trueの場合)、ローカル通知(プッシュ通知)は実装されました。

falseの場合、「Siriと検索/通知/バックグラウンド更新/モバイルデータ通信/COVID-19接触通知」、すべてを実装して「COVID-19接触通知」をオフにしてインストールを完了するのが本来のはずです。

(で、私はここのtrue/falseの違いを追い切れないまま放置です…) (私はモバイル通信オフでiPhoneを常用していますので、以後はモバイルデータ通信については省きます。)

ですが実際には「Siriと検索/バックグラウンド更新/COVID-19接触通知」だけの実装になり、「COVID-19接触通知」がオフでインストール完了。 ホーム画面になったとたん“COVID-19接触ログの記録が無効になっています有効にしてください”ダイアローグがでたはずです。

(1.1.2からはダイアローグ(エラーメッセージ)の出方が変わったはず。1.1.2からは基本、メッセージがでなくなってます。この辺り、メモ散逸で詳細不明です。エラーメッセージを出さなきゃいけない(Bluetoothがオフの時など)はずなのに、iOSはほぼでません。1.1.3も同様。ENの有効性を問うtrue/falseの判断がどうなってるのか不思議に思ってます。)

7/11 処理番号の問題でサーバー側に修正が入ってから、サーバーが権限拒否を返してくるようになって(なぜ?)、iOSは一律ローカル通知(プッシュ通知)が実装されなくなりました。 権限拒否が返ってくる原因は不明。

7/11以降は「COVID-19接触通知」(ENの有効化スイッチ)も実装されなくなっていたはずです。 厳密にはわかりません。私が障害の存在に気づいたのは7月末で、7/28からZIPの配信が停滞していたので最初はここで起きた障害なのかと思いました。 ですが7月半ばにインストールした端末には「COVID-19接触通知」が実装されていませんでしたので、7月11日から重大障害は出ていたと思っています。

8月上旬には「COVID-19接触通知」はなんとか実装されるようになりましたが、ローカル通知は実装されないまま。 サーバーの状態によって「COVID-19接触通知」が実装できないことがときたま再現。

13.7でもインストールの最後で「COVID-19接触のログ記録と通知を有効にする」を聞いてきますが「有効にする」にしても、なぜかtrueではなくfalseで完結しているようでローカル通知が実装されない状態です。

moonmile commented 4 years ago

v1.1.1 のコードを見る限り、v1.1.1 のときに ローカル通知が発生しない なので、 6/30 からローカル通知は出ないはずなのですが、そこが微妙ですね。

6/30 1.1.1リリース 7/11 サーバーがExposure Notification機能は無効を返してくるようになった

1.1.1 上記を修正 したことになっていますが、インストール時の最後で権限拒否(Exposure Notificationを有効にしない)をやると(falseの場合)、アプリのローカル通知(プッシュ通知)が実装されませんでした。 権限拒否しなければ(trueの場合)、ローカル通知(プッシュ通知)は実装されました。

「7/11 サーバーがExposure Notification機能は無効を返してくるようになった」が非常に謎ですね。

コード的には、アプリで「ローカル通知を有効にしますか?」のフラグを、userData.IsNotificationEnabled の中に保存してはいるのですが、v1.1.1 から以下の部分でがっつりコメントアウトされているので、通知されません。

https://github.com/openCACAO/cocoa/blob/master/Covid19Radar/Covid19Radar/Services/ExposureNotificationHandler.cs#L90

       // this will be called when a potential exposure has been detected
        public async Task ExposureDetectedAsync(ExposureDetectionSummary summary, Func<Task<IEnumerable<ExposureInfo>>> getExposureInfo)
        {

            UserExposureSummary userExposureSummary = new UserExposureSummary(summary.DaysSinceLastExposure, summary.MatchedKeyCount, summary.HighestRiskScore, summary.AttenuationDurations, summary.SummationRiskScore);
            userData.ExposureSummary = userExposureSummary;
            var exposureInfo = await getExposureInfo();

            // Add these on main thread in case the UI is visible so it can update
            await Device.InvokeOnMainThreadAsync(() =>
            {
                foreach (var exposure in exposureInfo)
                {
                    Debug.WriteLine($"C19R found exposure {exposure.Timestamp}");

                    UserExposureInfo userExposureInfo = new UserExposureInfo(exposure.Timestamp, exposure.Duration, exposure.AttenuationValue, exposure.TotalRiskScore, (Covid19Radar.Model.UserRiskLevel)exposure.TransmissionRiskLevel);
                    userData.ExposureInformation.Add(userExposureInfo);
                }
            });
            await userDataService.SetAsync(userData);

            // ※ ここでコメントアウトされている。
            // If Enabled Local Notifications
            //if (userData.IsNotificationEnabled)
            //{
            //    var notification = new NotificationRequest
            //    {
            //        NotificationId = 100,
            //        Title = AppResources.LocalNotificationTitle,
            //        Description = AppResources.LocalNotificationDescription
            //    };

            //    NotificationCenter.Current.Show(notification);
            //}
        }

ゆえに

13.7でもインストールの最後で「COVID-19接触のログ記録と通知を有効にする」を聞いてきますが「有効にする」にしても、なぜかtrueではなくfalseで完結しているようでローカル通知が実装されない状態です。

という状態で、現状ではローカル通知が発生しません。

moonmile commented 4 years ago

ローカル通知の件、やっと理解ができたので、追記です。

但し、EN Expressを導入すれば、アプリのローカル通知(プッシュ通知)は両OS共に不要だと思われます。Expressになれば matchCountが発生するたびOSが通知を出すはずです。

https://twitter.com/h_okumura/status/1304587718903697408

image

https://twitter.com/wasa__wasa/status/1304558422860333057

image

通知のアイコンは「厚生労働省のアイコン」(アプリのアイコン)だが、実際は OS の EN Express の機能から出している。 これがややこしい。どちらが出している通知か判断ができない。COCOA の場合は、ローカル通知が止まっている状態なので、OS 側の通知なのは確実。

確かにこのままであれば、アプリからローカル通知を出す必要はありませんね。同感です。

この後で、

に分かれてしまうのは、、アプリが内部で持っている userData.ExposureInformation.Count() の違いで、OS が返す matchCount と、アプリが持っている接触リストの数(userData.ExposureInformation)が異なるためです。

public Command OnClickExposures => new Command(async () =>
{
    var count = exposureNotificationService.GetExposureCount();
    if (count > 0)
    {
        await NavigationService.NavigateAsync(nameof(ContactedNotifyPage));
        return;
    }
    await NavigationService.NavigateAsync(nameof(NotContactPage));
    return;
});

解決策としては、OS での感知とずれが生じるので、

ができればいいのだけど、いまのところ無い。

teriha8t8 commented 4 years ago

書こうとしていたら稀さんから追記報告が…ここを考慮せずに下書きあげます。

v1.1.1 のコードを見る限り、v1.1.1 のときに ローカル通知が発生しない なので、 6/30 からローカル通知は出ないはずなのですが、そこが微妙ですね。

私も稀さんの投稿を読み返しても「へ?」状態で、妙に思うところを先に列挙しますね。

コード的にはローカル通知が発生しない状態でも、現象はインストール時に権限拒否しなければローカル通知(プッシュ通知)が実装されています(7月10日までは)。そして運用開始の7月3日以降からずっとiOSはローカル通知(プッシュ通知)が実装されている端末はローカル通知がでています。

厚労省アイコンがついてるプッシュ通知はアプリからです。 iOSが厚労省アイコンをつけてプッシュ通知を出せるはずがありません。 (ですが、稀さんの追記によるとあるんですね?!) 実際Twitter上でも、ローカル通知が実装されていないだろうと思われる人は、iOSが出す週報をみて接触判定に気がついてます。(13.6までは)

コード的には、アプリで「ローカル通知を有効にしますか?」のフラグを、userData.IsNotificationEnabled の中に保存してはいるのですが、v1.1.1 から以下の部分でがっつりコメントアウトされているので、通知されません。

この部分は、ローカル通知が実装された後のことになりませんか? iOSのローカル通知があるアプリはどれも、インストールの最後かアプリを最初に立ち上げたときに「このアプリは通知を送信します。よろしいですか?」を聞いてきます。これのことではないのですか? 実際、ローカル通知が実装されたときにCOCOAが「ローカル通知を有効にしますか?」と聞いてきたことはありません。

プッシュ通知 NotificationCenter/Xamarin.ExposureNotification

これがわからない(引っかかります)。 今のコードは、プッシュ通知 NotificationCenterがなくてXamarin.ExposureNotificationだけにまとめられているわけですよね。

でも、AndroidとiOSではOSのメッセージの出し方が違います。 EN機能を無効にしたとき、AndroidはOS(Google開発サービス)が頻繁に警告メッセージを出します。

iOSはこれがまったくないんです。OSは通知(警告)を出しません。 EN機能が無効の時の通知は、アプリを立ち上げたときに、Bluetoothがオフです、COVID-19接触のログ記録がオフです、がでるだけです。

アプリが通知(警告)をだしますが、必ずでません。アプリは文鎮化してリロードがかからないので通知を出すためのfalse判定が効かないので出せないんだと思ってます。false判定の記述がどこにあるのかわからないのですが、iOSは妙なタイミングで通知(警告)がでます。

EN機能が無効時の通知(警告)は、ver1.1.1ではでるタイミングは妙(通知窓が重なって見にくい、認識しにくい問題もある)でもでることはでていたのが、ver1.1.2からはまずでなくなりました。

私はこれも不思議で…ver1.1.3になるとさらにでません。いつどのタイミングで通知がでるのかと設定、アプリをいじるんですが、iOSはまずでません。 iOS13.7から「COVID-19接触のログ記録」がなくなったのでEN機能無効の通知はまったくでません。 厚労省FAQ問32の回答ではEN機能が無効だと「COVID-19接触のログ記録と通知を有効にする」ダイアログがでることになってますが、でるはずがないと思います。

両OSの通知は「Xamarin.ExposureNotification 」1本に集約されている。 EN機能が無効時の通知の出方がAndroidとiOSでは全く違う。 ならば、Xamarin.ExposureNotification 機能が両OSで挙動が全く違うことになります。

Androidは、matchCountがあったときのOSからプッシュ通知は復活しましたが、iOSはmatchCountがあってもOSはプッシュ通知をだしません。iOSのプッシュ通知有無はアプリのローカル通知実装の有無で左右されます。(この部分は追記によると、iOS13.7からは該当しないってこと?!)

iOS13.7はEN機能(接触通知)常時オンが前提です。13.6にあったEN機能無効/有効スイッチがなくなりましたので。 EN機能をオフにはできます。これを実行すると13.6までとは違って全データ削除が伴います。EN機能をオフにすると、iOSが「接触通知は無効です」と通知を出します。

ですが、EN機能が単に無効の時(Bluetoothがオフ、接触情報の共有がオフ)、iOS設定の「接触通知」「Bluetooth」にグレートーンがかかるようになっているだけで、AndroidのようにiOSが通知(警告)を出すことはないです。

moonmile commented 4 years ago

厚労省アイコンがついてるプッシュ通知はアプリからです。 iOSが厚労省アイコンをつけてプッシュ通知を出せるはずがありません。 (ですが、稀さんの追記によるとあるんですね?!) 実際Twitter上でも、ローカル通知が実装されていないだろうと思われる人は、iOSが出す週報をみて接触判定に気がついてます。(13.6までは)

どうやら、私達が「ローカル通知」だと思っていたものは、ローカル通知じゃないみたいなのです。

iOS の場合、ローカル通知の ON/OFF は「設定」→「通知」に出るようになっていて、これに COCOA がありません。カナダの COVID Alert はローカル通知を持ちます。

image

接触確認アプリ(COCOA)のほうにも「通知」がありません。

image

カナダ版の COVID Alart は「通知」があります。

image

コードのほうでは、NotificationCenter(Plugin.LocalNotificationというライブラリ)というのを使っていて Xamarin.ExposureNotification とは別の形で作られています。

ここで、v1.1.1 のときに NotificationCenter 関係のところが、あちこちコメントアウトされているので「ローカル通知はできない」のです。

この部分は、ローカル通知が実装された後のことになりませんか? iOSのローカル通知があるアプリはどれも、インストールの最後かアプリを最初に立ち上げたときに「このアプリは通知を送信します。よろしいですか?」を聞いてきます。これのことではないのですか? 実際、ローカル通知が実装されたときにCOCOAが「ローカル通知を有効にしますか?」と聞いてきたことはありません。

なので、もともとアプリのほうにはローカル通知が実装されていないので、COCOA は「ローカル通知を有効にしますか?」 というのを聞いてきません。実装していないから。これはこれで正しい動作です。

で、あちこちで「ローカル通知っぽいもの」を出しているのは誰だ?ってことになるんですが、

厚労省アイコンがついてるプッシュ通知はアプリからです。 iOSが厚労省アイコンをつけてプッシュ通知を出せるはずがありません。 (ですが、稀さんの追記によるとあるんですね?!)

と私も思っていたのですが、最近の v1.1.3 の通知を見る限り

この2つの通知のアイコンは、OS からの通知を示す太陽マーク?ではなくて、アプリの厚生労働省のマークになっていていますよね。あたかもローカル通知かのように...

通知のメッセージをどうやってアプリから持ってきているのか(あるいは事前に設定するのか?)は不明ですが、

両OSの通知は「Xamarin.ExposureNotification 」1本に集約されている。 EN機能が無効時の通知の出方がAndroidとiOSでは全く違う。 ならば、Xamarin.ExposureNotification 機能が両OSで挙動が全く違うことになります。

通知関係は、Xamarin.ExposureNotification は絡んでいなくて、しかも COCOA からはローカル通知を出していないので、 それぞれの OS の機能として、

ようです。 これって、かえって混乱しないのか?という不安が残るんですが。

ghost commented 4 years ago

プッシュ通知が出るか出ないかはインストールバージョンに依存する事は有りませんか?

初期バージョンで正常にインストールした人は プッシュ通知の権限がCOCOAに与えられている。 このグループに属する端末は接触があった時に 厚生労働省マークの通知を出す事が出来る。

v1.1.1以降のバージョンでインストール(再インストールも含む)をした端末はプッシュ通知の権限を与えられていない。 このグループに属する端末はOSからの通知しか受け取れない。

iOS端末を使っている訳では無いので想像ですいません。 こうゆう事は起こらないのかも知れませんが…。

akizou commented 4 years ago

私の6月にアプリをインストールしたiPhoneでは 設定Appの通知でアプリが並んでる画面に アプリと接触通知の2つあります。

DF62E551-280E-44C3-A8C0-9FF4611ACAD0 093CD98E-FED3-444C-AB8A-097F5419F5B8

teriha8t8 commented 4 years ago

iOS の場合、ローカル通知の ON/OFF は「設定」→「通知」に出るようになっていて、これに COCOA がありません

話がややこしくなる原因かココなんです。 akizouさんが投稿しているように、7月10日までにインストールした人には接触確認アプリCOCOAにローカル通知が実装されているんです。 これが7月11日以降権限拒否(Exposure Notification機能は無効…)がサーバーから返ってくるようになったので、この日を境にアプリにローカル通知が実装されなくなってるはずです。 なのでiPhoneユーザーは、ローカル通知が実装されている人と、されていない人が混在してます。

Tweetもローカル通知が実装されている人かいない人かを見分けなきゃいけないんです。 カスタマーサポート的なことをやっていて、ローカル通知が実装されていないだろう人には説明がややこしくなりすぎるので、私はリプを飛ばさないでスルーしてる状態です。

teriha8t8 commented 4 years ago

v1.0.0 最初のリリースでは、通知 NotificationCenter が有効になっています。 通知は NuGet で Plugin.LocalNotification を使っている EN API は Xamarin.ExposureNotification を NuGet で 0.11.0-preview を取り込んでいる

v1.1.0 次のタグは、USE_MOCK が入ったバージョンです。初回リリース直後に、シミュレーターではTEKのダウンロードができなくてテストが難しいため、エミュレータでも動くように疑似データを入れるようにあめいさんが入れた USE_MOCK バージョンです。 通知は NuGet で Plugin.LocalNotification を使っている EN API は Xamarin.ExposureNotification を NuGet で 0.11.0-preview を取り込んでいる このバージョンでも「プッシュ通知が有効」な状態です。

v1.1.1 問題のリリースが、v1.1.1 になります。 NotificationCenter がコメントアウトされている Plugin.LocalNotification が NuGet 管理から外されている Xamarin.ExposureNotification がコードベースで取り込まれている おそらく、Xamarin.ExposureNotification の緊急修正を取り込むために、NuGet 上の Xamarin.ExposureNotification をコード単位で取り込み、このときにプッシュ通知関連の「Plugin.LocalNotification」を外したのだと思われます。 全体を NotificationCenter で検索すると、全てコメントアウトされています。

COCOA v1.0.0からv1.1.1で大きく変わったのは、COCOAアプリ内から2つのスイッチ(Bluetoothのon/offと接触通知のon/off)がなくなったことです。 これはEN APIに仕様変更があったせいです。Google/Appleのドキュメントが探せないままですが、厚労省サイトに「Bluetoothおよび接触の通知のオンとオフの設定について、APIの仕様の変更によって、スマートフォンの設定で行う仕組みとなったため、アプリの設定の表示から、Bluetoothおよび接触の通知のオンとオフの設定の表示を削除しました。」 この説明部分に相当する変更です。

これはCOCOAアプリ内の設定で、COCOA設定のローカル通知(プッシュ通知)とは無縁なのに一緒くたに削除されてるコード記述になっている。(問題はここですね)

COCOAをインストールすると権限許諾は 「COVID-19接触のログ記録と通知を有効にする(有効にしない/有効にする)」 と聞いてきます。

私はこれを“「COVID-19接触のログ記録」と「COVID-19接触通知」を有効にする”という意味だと思ってました。

「COVID-19接触のログ記録」と「COVID-19接触通知」はどちらもEN(Exposure Notification)を有効化する連動スイッチです。

でもコードを書いた人は “「COVID-19接触のログ記録」と「ローカル通知」を有効にする”という意味に解釈してますよね。 だからあちこちコード記述がおかしい。

コードを書いた人は、COCOAアプリに実装される「COVID-19接触通知」をローカル通知と同等とみなして、間違ったコード記述にしてる。

「COVID-19接触通知」はCOCOA設定の中に実装されますが、これは通知をだしません。EN機能のon/offスイッチにすぎません。 「COVID-19接触通知」は通知とあるけど、ローカル通知(プッシュ通知)を出す機能はありません。

アプリのローカル通知設定とEN APIのiOS側通知設定(「COVID-19接触通知」「COVID-19接触のログ記録」とを混同してるので、後から読むこちらもわけわからなくなってるかと。

今のコード記述は、 インストール(チュートリアル)でExposure Notification機能の権限拒否をやると ローカル通知(プッシュ通知)の権限拒否も同時に成立している状態ですね。 それでユーザーが権限拒否をやると実装されない。

問題になるのが7月11日。 この日からなぜかサーバーが「Exposure Notification機能は無効…」を返してくるようになったので、インストール時のユーザ操作に関係なく、一律ローカル通知(プッシュ通知)が実装されない。

それでiPhoneユーザーはローカル通知が実装されている人といない人の混合状態を生んでいる。 (7月11日問題はまたあとで)

moonmile commented 4 years ago

akizou さん

私の6月にアプリをインストールしたiPhoneでは 設定Appの通知でアプリが並んでる画面に アプリと接触通知の2つあります。

このアプリのバージョンは何になっていますか? COCOA の「アプリの設定」→「Version」の表示のところです。

teriha8t8 commented 4 years ago

v1.0.0 のリリースの後に、アプリのローカル通知とOSのプッシュ通知が混在するので、緊急でアプリのローカル通知を止めた

誤解です。 「v1.0.0 のリリースの後に、アプリのローカル通知とOSのプッシュ通知が混在」したことはありません。 アプリのローカル通知とOSのプッシュ通知(週報)が混在するのは、iOS13.6のリリース(7月15日)1週間後からです。

v1.1.2のリリースが7月13日です。v1.1.1とv1.1.2は通知に関しては変更がないようですから「緊急でアプリのローカル通知を止めた」わけではないでしょう。

v1.0.0リリース直前にEN APIの仕様変更があったはず。私はドキュメントをみつけられないままですが、リリース時にHさんが直前に仕様変更があってもどうたらとTweetしていましたから(今は削除されているはず)。

ドキュメントは見つかりませんが、v1.1.1を見る限り仕様変更内容は「Bluetoothのon/off、接触通知(EN機能)のon/offは端末の設定でやる」というもの。 この仕様変更を十二分に理解しないまま、現状に合わない妙なコードでリリースして今も修正されていないのだと思います。

”接触通知(EN機能)のon/offは端末の設定でやる”変更部分が、結果的にローカル通知の実装を阻害する記述になっている。

もしかしたら、Appleのサンプルコードが同じようになっているかもしれません。イタリアもバージニアもチャートリアルで権限拒否をやるとローカル通知を実装しないので。サンプルコード通りにしてあるから開発側はミスに気づいていないのでは?

v1.1.1 以降、アプリからローカル通知は無効

コードを眺めるとバッサリ削除されているのて、アプリからのローカル通知は無効になるように思いますが、実際はでています。ローカル通知がないのは、COCOAアプリのローカル通知が実装されていない場合です。

一時期、OS からの週報が続く

Androidについては一時期とは言えます。Google開発サービスのバージョン更新ででなくなったりしましたので。 iOSは13.6になってから毎週でています。13.6.1の配信ででるタイミングが変わることもあったはずですが、ずっとでています。

iOSの週報は、COCOAをインストールしていればiOS13.6更新後1週間後から出始めて、同時に通知に設定ができます。(設定→通知→COVID-19Exposure Notifications→)

現時点では、iOS/Android の EN Express(かな?)の実装により、OS からの接触通知(matchCount > 0 のとき)が復活

現在はOSがEN Express対応バージョンになっただけで(APIも9月12日からEN2になったと思いますが)、日本はExpressではありません。 よって、iOSは「OS からの接触通知(matchCount > 0 のとき)」は最初から一貫して今もありません。 Androidは「OS からの接触通知(matchCount > 0 のとき)が復活」し始めた状態です。

以降は、接触のマッチングがあったときに、OS から通知が出ると思われる

誤解です。 やはり通知に厚労省アイコンがついているものはCOCOAアプリが出しています。 コードを眺めるとどこを辿って値を渡してどうなってるのかサッパリわからないのですが、通知を出しているのはOSではありません。

引用されている奥村先生とわさわささんは同列比較できない現象です。 奥村先生は、13.7で通知を受信しアプリに表示があります。 わさわささんは、13.6で通知を受信しアプリに表示がありません。 この現象を受けて言えることは、13.7であればアプリに表示がない障害は回避できそう、になります。 matchCountの保持の問題は13.6にある(?)といえることになるのかな?

akizou commented 4 years ago

このアプリのバージョンは何になっていますか?

1.1.3です。

moonmile commented 4 years ago

ありがとうございます。

1.1.3です。

なるほど!最新版で通知が出るんですね。それは想定外でした。

というパターンですね。 ひょっとしたら、前バージョンの通知を引き継ぐのかも...これは調べてみます。

moonmile commented 4 years ago

どうやら、iOS でローカル通知が発生している(かもしれない)件は、解決できそうです。

  1. COCOA をインストールした状態で、「設定」→「通知」→「接触確認アプリ」の通知を OFF にする。
  2. COCOA をアンインストールする
  3. COCOA を再インストールする

こうすると、「設定」→「通知」→「接触確認アプリ」の項目がなくなります。

~~~

これだとローカル通知のほうは確実に消えそうなのですが、中の接触データも消えるかどうかが謎ですよね。 多分、iOS の EN API 側で保持しているので、過去2週間のデータは消えないと思うのですが。

akizou commented 4 years ago

1.1.3です。 なるほど!最新版で通知が出るんですね。それは想定外でした。

私自身はまだアプリからの通知を見ていないので、ほんとに通知が出るのかは不明ですが、

設定App内の 各アプリの設定のところの、接触確認アプリの設定内容表示画面の中に 通知(バナー,サウンド,バッジ) の行がある、 ということです。

* 過去の cocoa v1.0.0 をインストール 
* 最新の cocoa v1.1.3 をインストール
* 最新の「通知」に、接触確認アプリ cocoa がある

というパターンですね。

一度も cocoaの アンインストールは実施していません。

moonmile commented 4 years ago

想像ですが、こんな感じだと思います。

v1.0.0 のときの「通知」の状態が引き継がれていて、 v1.1.3 になっても「通知」に接触確認アプリ(COCOA)がある状態に

なっているのだと思います。

ちなみに照葉さんの

引用されている奥村先生とわさわささんは同列比較できない現象です。 奥村先生は、13.7で通知を受信しアプリに表示があります。 わさわささんは、13.6で通知を受信しアプリに表示がありません。 この現象を受けて言えることは、13.7であればアプリに表示がない障害は回避できそう、になります。 matchCountの保持の問題は13.6にある(?)といえることになるのかな?

は、また違う現象っぽいので、これはやっぱり謎ですね。 何故「厚生労働省アイコン」が出るのかが不思議です。コード的には通知を出しているところはないんですよね。謎い。

ghost commented 4 years ago

このコメントはどうも認識が間違ってる様なので忘れてください。

v1.0.0でインストールした人はインストールの時に通 知の権限を聞かれて権限与えるとそのアップデートし てもそのまま引き継ぐと言う訳でも無いんですか? (これが奥村先生) ※1回は何らかの通知を受ける必要が有る?

v1.1.1からインストールした人は通知の権限を聞いて こなくなったから権限が無いその後通知は週報のみ。 (これがわさわささん)

13.6と13.7の違いでの論点は「アプリに正しく反映す るか?」と言う点かなと思ってます。

teriha8t8 commented 4 years ago

v1.0.0 のときの「通知」の状態が引き継がれていて、 v1.1.3 になっても「通知」に接触確認アプリ(COCOA)がある状態に

akizoさんのようにv1.0.0をインストールしてアプリの更新を重ねている場合はこれですね。 v1.1.1からアプリでローカル通知を出さない記述になっても、アップデートではアプリの設定は影響をうけないはずです。

2年前時点のInstagramは逆の現象がありました。 インストール時にローカル通知を拒否すると、あとからローカル通知を有効にしてもプッシュ通知がでませんでした。これはアプリのアップデートをやってもダメで、Instagramアプリの再インストールでしか障害は回復しませんでした。

一度、COCOAの設定にNotificationCenter機能を持つと、アプリのアップデートでは変わらないです。

ここで私の認識ミスがあります(今頃、すみません)。 COCOAインストール時に権限拒否をやるとローカル通知の実装がない、と思ってましたが、権限拒否に関係なくv1.1.1からはローカル通知が実装されない、稀さんの解析が正しいです。

記憶ではv1.1.1でもノーマルにインストールしたらローカル通知が実装されたと思っていたのですが、散乱しているメモを整理したらノーマルにインストールしたときの記録がありません。 なので、v1.1.1で実機でローカル通知が実装されたかは不明です。

話をややこしくしたのは権限拒否とローカル通知の実装が連動していると思った私です(すみません)。 たしかに連動はある(権限拒否をやるとローカル通知は実装できない)んですが、これと今現在ローカル通知が実装できないのは別問題です。

私は7月11日以降にインストールした端末はローカル通知を持ってないと思ってましたが、v1.1.1リリース6月30日以降にインストールした端末にはローカル通知はありません。ということになります。

v1.0.0では権限拒否をやるとアプリそのものが実装できない不具合がありました。 厚労省サイトはここをちゃんと書いてないので困る。 https://www.mhlw.go.jp/stf/newpage_12152.html 「利用規約に同意後、アプリを終了すると、プライバシーポリシーに同意しなくても、アプリの利用を開始できるような場合がありましたが、このような事象が生じないように修正しました。」 としか書いていません。

この現象はなんだったのか。 https://twitter.com/HiromitsuTakagi/status/1273943932414484480?s=20 高木先生のTweetを見返すと 「Exposure Notificationが起動できません」と返ってくる。

これは、権限拒否をやると接触通知(EN)の有効化スイッチ(COVID-19接触通知とCOVID-19接触のログ記録)がiOSに実装されなかったんです。 v1.0.0はCOCOAアプリの中の設定に接触通知on/offのスイッチを作りましたが、iOS側にスイッチを作るロジックにミスがあったんです。

AndroidはOS(Google開発サービス)のバージョンアップが適応されると、端末内に接触通知(EN)のスイッチは実装されていました。COCOAのインストールとは関係なく接触通知スイッチそのものは持っていました。

一方、iOSはCOCOAのインストールなしに接触通知(EN)スイッチを実装することはできませんでした。 ここの違いです。

iOSは、アプリの設定項目を揃える(実装する)のと同時に、接触通知(EN)のスイッチをOSが実装する必要がありました。 v1.0.0は権限拒否をやったとき、接触通知(EN)のスイッチをOSが実装できないコードになっていました。(と言ってもそのコードがどこかは、私はわかってないですが)

https://twitter.com/HiromitsuTakagi/status/1273978372616450048?s=20 高木先生が 「アプリが落ちた後、アプリを削除して、iPhoneを再起動して、アプリをインストールして起動すると復活ひました。」 となったのは、どこかのタイミングで接触通知(EN)スイッチ(COVID-19接触通知とCOVID-19接触のログ記録)が実装されたからです。 一度、OSに接触通知(EN)のスイッチができさえすれば、その後の状況がまったく変わります。

7月11日から「Exposure Notification機能は無効…」と返ってくるようになったのが謎なんですが、この部分は#4に関わることになります。 今現在はこの問題は起きません。 この問題が起きないのは、iOSもクライアントアプリのインストールに関係なく、OSが接触通知(EN)有効化を持つように変わっているからです。 (あとで#4にまとめ書き込んでおきます。)

teriha8t8 commented 4 years ago

接触確認アプリCOCOAにローカル通知が要るか要らないかなら、要る。どう考えても要ります。 Apple/Google EN APIの仕様は「通知はAppから」ならこれに則るのが基本でしょう。

次バージョンでは、アプリのローカル通知(プッシュ通知)は実装してもらいたい。 通知文面を変えれば、Expressになっても、今OSが通知をだしているAndroidでも、COCOAのローカル通知はあっていいと思います。

今の通知文面 iOS COVID-19にさらされた可能性があります。 新型コロナウイルス陽性登録者と接触した可能性があります。詳細はこちら。Appからその接触の日付、期間、および信号の強さにアクセスしました。

Possible COVID-19 Exposure It is possible you have been in close proximity to a user who tested positive for COVID-19. Tap for more details.. The app has accessed the date, duration and signal strength of this expo…

Android COVID-19の濃厚接触の可能性 あなたの周囲に、COVID-19(新型コロナウイルス感染症)に感染したと報告した人がいました。濃厚接触の可能性がある日付、期間、電波強度を保存しました。

(Androidの英語表現不明)

COCOAの通知は日本語としてけったいなんです。 この文面は、Apple/Google EN API がサンプルとして用意した英語を訳しただけなのか、シンガポール版から持ってきたのかわかりませんが、とにかくおかしい。

「さらされた可能性」「濃厚接触の可能性」という表現は過剰すぎます。不要な表現です。 「Appからその接触の日付、期間、および信号の強さにアクセスしました」「濃厚接触の可能性がある日付、期間、電波強度を保存しました」は日本語としておかしすぎて意味不明。

アプリが出す通知は、接触判定アリとなったなら、単に「アプリの情報を確認してください」で十分だと思います。 ドイツはこういうローカル通知です。 EhyRy6oWAAEW3OM

アプリからのローカル通知(プッシュ通知)が「アプリの情報を確認してください」ならExpressになってOSの通知とブッキングしても問題はないでしょう。 通知がダブルで来るのが鬱陶しければ、ユーザーがアプリのローカル通知をオフにすればいいだけです。

moonmile commented 4 years ago

私は7月11日以降にインストールした端末はローカル通知を持ってないと思ってましたが、 v1.1.1リリース6月30日以降にインストールした端末にはローカル通知はありません。ということになります。

了解です。この認識が照葉さんとぴったりと合いました。よかったです。

なので、6/30 以降に通知がある場合、の厚生労働省アイコンで出てくる「ローカル通知っぽいもの」が不思議なのです。アプリのほうはローカル通知をしないのに。これは継続して調査です。

アプリが出す通知は、接触判定アリとなったなら、単に「アプリの情報を確認してください」で十分だと思います。 ドイツはこういうローカル通知です。

私も同感です。ローカル通知はそれなりにあったほうがいいと思います。

以前、カナダとドイツの issues に上がっていたのが、「OS の通知で出す接触者数」と「アプリの通知で出す接触者数」のずれでした。OS の場合は、簡単なサマリでしか計算していないので、OS 側では正確な接触者数は計算できません。最近の通知では「接触の可能性~」となっているので、数は表示されていないようです。

なので、OS と アプリの通知の境目としては、

のがよいかなと。

teriha8t8 commented 3 years ago

アプリにローカル通知は要るという点は一致してますが、稀さんの言う「iOSからの通知」というのが納得がいかないので考察。

iOSからの通知は現時点ではコレしかないです。 これらの通知は「設定→通知→Exposure Notification→」で権限許可。

iOS が matchCount > 0 のときに、ローカル通知っぽい(厚生労働省アイコン付き)を出す Android が matchCount > 0 の時にプッシュ通知(復活した?)を出す

Android/iOS、共にこのような動作になると思います。

  1. matchCount > 0 のとき、ユーザーデータのExposureInformationにExposureSummaryを追加。
  2. これによって自動的にIsNotificationEnabled のブール値が true
  3. IsNotificationEnabled が true ならアプリから通知。

だけどアプリにはローカル(プッシュ)通知機能がない。

ここでAndroidとiOSで分かれる。

Androidはアプリが通知を出せないとき、OS(Google開発サービス)がプッシュ通知をだしている。ただしこの動作は一貫していない。 Androidは、ある特定のバージョン(モジュール?)のみ、IsNotificationEnabled=trueをなんとか処理する機能が一部端末にはあるのでは?

iOSはアプリが通知を出せないなら、でないです。 IsNotificationEnabled=true を処理するのはアプリ設定の「通知」のみ。 iOSの通知権限はユーザーが決めます。ユーザーが通知を許可しなければでないのが当たり前。 (なのでv1.0.0のコード上で通知の有効フラグをオンにするなんてもっての外。)

iOSでv1.0.0をインストールならローカル(プッシュ)通知が実装されています。これならローカル(ブッシュ)通知でます。 iOSはv1.0.0の時に通知権限を持ったなら、その後のアップデートで「通知」の消失は起きません。 v1.1.1以降をインストールしたならローカル(プッシュ)通知の実装はない。これではローカル(プッシュ)通知は絶対にでません。 このため、iOSユーザーはアプリのどのバージョンをインストールしたかで、ローカル(プッシュ)通知の有無が分かれます。

Androidはv1.0.0のインストール時に通知権限を持っていたかもしれないが、その後のアップデートでアプリの通知権限は消失してます。なのでAndroidは全ユーザーがローカル(プッシュ)通知がでません。 IsNotificationEnabled=trueをOS(Google開発サービス)が処理できる一部端末のみローカル通知がでていると思われる。

(謎なのはAndroidのプッシュ通知です。どのバージョン、端末、モジュール?、ビルド?ででているのかさっぱりわからない。)