iT邦幫忙

0

App notification 計數器實作分享

  • 分享至 

  • xImage
  •  

案例背景描述:
本案是web與ios混合架構,使用者透過App向網站要求登錄後,以WebView操作網站。
需求:
業者希望App角標能顯示使用者未完成表單數量。
技術點:

  1. App需自網站取得未完成表單數量。
  2. 角標數量需在使用者可見情境下,維持正確數量。

問題:
App不允許在未開啟時執行任何連線動作。

解題思路:

  • 取得未完成表單數量的方法:
    在網站中新增未完成表單數量的API,下面的程式應依照各專案自行設計,簡單說就是App端向WebService拋出連線請求,WebService回傳一個數字給App
define('INTERNAL', 1);
define('PUBLIC', 1);
require('../../init.php');
require('webform.php');
require('tool.php');
//以上為網站內的函式庫

$acc = param_variable('acc', '');    //取得App傳過來的使用者名稱字串
if (mb_strpos($acc, '$')){
    $acc = tool::decrypt($acc);
    list($acc, $accCheck) = array_pad(explode(PHP_EOL, $acc, 2), 2, 0);
    list($acc, $accCheck) = array_pad(explode("\n", $acc, 2), 2, 0);
    //以上為字串解密與斷字處理
    
    $usr = $USER->find_by_username($acc);    //在WebService中找出使用者id(此物件與方法是自訂義的)
    $count = webform::get_uncompelete_form($usr->id);    //取得未完成表單數量
    echo $count;    //回傳表單數量
}
  • ios接收與顯示:
    在AppDelegate.swift中撰寫連線函式取得未完成表單數量並設定角標數量:
fun noticount(urlroot: String){
    var acc:String = ""
    var BadgeNumber: Int = 0
    if(UserDefaults.standart.string(forKey:"acc") != nil){
        acc = UserDefaults.standart.string(forKey:"acc")
    }
    let url = URL(string: "網址?acc=\(acc)")!    //網址帶參數,準備傳給WebService
    let data = "str=\(acc)".data(using: .utf8)
    DispatchQueue.globle().sync{
        APIManager.shared.callAsync(with: url, body: data, method: "post"){ data in
            BadgeNumber = Int(String(data: data!, encoding: .utf8)!) ?? 0
    }
    sleep(1)
    
    //設定角標數量
    UILocalNotification().applicationIconBadgeNumber = BadgeNumber
}

接下來根據App各個階段的生命週期,即SceneDelegate.swift中,呼叫上述的 noticount(urlroot: String)函式,SceneDelegate.swift是控制App各個生命週期的檔案。
我們想要在sceneDidDisconnect (App退出),sceneWillResignActive (App回到前景前),sceneDidEnterBackground (App閒置到背景) 三個情況下更新Icon角標數字。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言