今是昨非

今是昨非

日出江花红胜火,春来江水绿如蓝

推送処理

私はこの 2 日間、こんなものを改良していました:#

プッシュメッセージに基づいて、下のタブバーに通知の赤い点を表示する必要があります。つまり、プッシュメッセージを受信したとき、プッシュメッセージをクリックすると対応する画面にジャンプし、アプリのアイコンをクリックしてアプリに入るときは、通知の小さな赤い点を表示します。

前書き#

以前のプッシュ処理について、3 つのケースに分かれていたことを覚えています。これは非常に明確に覚えていて、初めて北京の Garage Cafe で面接を受けたときにこの質問をされたのですが、答えられませんでした。なぜなら、その時は本当にプッシュ処理をやったことがなかったからです。その後、最初の会社に入社し、良い製品があり、ちょうどこのニーズがあったので、このスキルを身につけました。

a. アプリがバックグラウンドでプッシュメッセージを受信し、プッシュメッセージをクリックすると、実行されるのは


// アプリが実行中に通知を受信
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    ...
    [self receivePush:self.userInfo];
}

b. アプリがフォアグラウンドでプッシュメッセージを受信し、ポップアップ通知/直接処理する場合、対応するメソッドは依然として


// アプリが実行中に通知を受信
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    ...
    [self receivePush:self.userInfo];
}

c. アプリが終了している状態でプッシュメッセージを受信し、プッシュメッセージをクリックすると、対応するメソッドは


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (launchOptions && [[launchOptions allKeys] containsObject:@"UIApplicationLaunchOptionsRemoteNotificationKey"]) {
        NSMutableDictionary * userInfo = [launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"];
        [self receivePush:userInfo];
    }
}

現在#

このニーズを見たとき、以前と同じように実現できると思ってあまり気にしませんでした。しかし、書いているうちにおかしいところに気づきました。以前はプッシュメッセージをクリックしたときの処理に注目していましたが、今はプッシュメッセージをクリックしなかったときの処理も必要です。。。。。そこで、実現できるか考えました。アプリが終了しているときに application:didFinishLaunchingWithOptions: メソッドが呼ばれ、プッシュパラメータが含まれているので、プッシュメッセージをクリックしなかった場合も問題ないはずだと思いました。

しかし、実際には私はまだ甘かったことが証明されました。今日は詳しくテストしてみたところ、

application:didFinishLaunchingWithOptions: メソッドはアプリが終了しているときにプッシュメッセージをクリックして入るとき、Options にはプッシュ情報があります。しかし、** プッシュメッセージをクリックせずに直接アプリに入ると、Options にはプッシュ情報がありません。** したがって、プッシュだけではこのニーズは実現できません。どうすればいいのでしょうか?

結果#

ニーズを振り返ると、重要な問題は、アプリのアイコンをクリックしてアプリに入るとき、プッシュのパラメータがわからず、小さな赤い点を表示すべきかどうか判断できないことです。そこで、バックグラウンドにリクエストを送って、小さな赤い点を表示すべきかどうかのパラメータを返してもらうことにしました。しかし、これにはもう一つの問題があります。いつリクエストを送るのか?最初に考えたのは、アプリが終了しているときやバックグラウンドでクリックして開くときに小さな赤い点を更新すべきだと思ったので、applicationWillEnterForeground: でリクエストを送ることにしました。しかし、そうするとリクエストが未眠であまりにも頻繁になりすぎます。また、バックグラウンドでは元々プッシュはパフォーマンスに対する要求が高いと言われているので、こんな風にクエリするのはダメです!

その後、QQ で友達がこの画像を送ってくれました:
1.jpg
上の画像の最後の文は、通知のバッジに基づいて通知があるかどうかを判断し、その後データを取得するためにリクエストを送るというものでした。私にとっては、非常に理にかなっていると思いました。この方法は良いと思います。しかし、バックグラウンドではやはりダメだと言われたので、あなたもわかるようにニーズを削減することになりました。
1.gif

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。