案例背景描述:
本案是web与ios混合架构,使用者透过App向网站要求登录后,以WebView操作网站。
需求:
业者希望App角标能显示使用者未完成表单数量。
技术点:
问题:
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角标数字。