案例背景描述:
本案是web與ios混合架構,使用者透過App向網站要求登錄後,以WebView操作網站。
需求:
業者希望App角標能顯示使用者未完成表單數量。
技術點:
問題:
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; //回傳表單數量
}
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角標數字。