自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

短信過濾 APP 開發(fā)

開發(fā) 前端
ILMessageFilterQueryRequest? 中可以獲取到 sender? 和 messageBody,所以如果想實現(xiàn)自定義規(guī)則,比如針對某個手機號設置對應的規(guī)則,則需要從 APP 中設置對應的規(guī)則,然后通過 Group 共享到 Extension ,然后在上面的方法里通過規(guī)則匹配。


一直想開發(fā)一個自己的短信過濾 APP,但是一直沒有具體實施,現(xiàn)在終于靜下心來,邊開發(fā)邊記錄下整體的開發(fā)過程。

01垃圾短信樣本

遇到的第一個問題是,既然要過濾垃圾短信,那首先要識別哪些是垃圾短信?如何識別呢?

參考之前訓練識別鋼管計數(shù)的經(jīng)驗,決定通過 CoreML 訓練 Text 模型來識別,那問題來了,要訓練模型的短信數(shù)據(jù)集怎么來?

一開始打算網(wǎng)上找到垃圾短信樣本,但找了好久沒找到,于是就想到用自己和家人手機里的短信,畢竟手機里短信一般不刪除,也有小幾千條,而且垃圾短信、推銷、廣告之類的應有盡有。

所以問題就變成了,如何導出 iPhone 短信?

這里筆者也查了好久,找到的第三方軟件基本都是需要收費,最終發(fā)現(xiàn)了一個免費導出的方案。

首先不加密備份手機到電腦,如下圖,選中Back up all the data on your iPhone to this Mac,點擊Back Up Now,等待備份完成,備份完成后,再點擊Manage Backups :

備份界面備份界面

Manage Backups 點擊后,界面如下,可以看到已備份的記錄,右鍵選擇 Show In Finder,在文件夾中打開:

管理備份管理備份

然后可以看到備份所在目錄已打開,這時候需要找到文件名為 3d0d7e5fb2ce288813306e4d4636395e047a3d28的文件,這個文件就是短信備份的數(shù)據(jù)庫文件。然后問題來了,怎么找呢?看到備份目錄一個個文件夾是不是懵,這怎么找,很簡單,搜索,點擊右上角的搜索,直接把這個文件名輸入即可,注意搜索的范圍是當前文件夾:

備份文件夾備份文件夾

搜索結果如下:

短信備份數(shù)據(jù)庫文件短信備份數(shù)據(jù)庫文件

然后把這個文件單獨拷貝到另一個地方,比如桌面,再用數(shù)據(jù)庫軟件打開,比如SQLPro for SQLLite,打開如下:

短信數(shù)據(jù)庫文件打開短信數(shù)據(jù)庫文件打開

然后觀察這個文件后發(fā)現(xiàn),手機號和短信記錄分布在不同表中,需要寫一個 SQL 查出需要的內(nèi)容,SQL 內(nèi)容如下,參考 SQL to extract messages from backup,選中上圖中Query,輸入命令如下:

SELECT datetime(message.date, 'unixepoch', '+31 years', '-6 hours') as Timestamp, handle.id, message.text,
    case when message.is_from_me then 'From me' else 'To me' end as Sender
FROM message, handle WHERE message.handle_id = handle.ROWID AND message.text NOT NULL;

然后點擊右上角的執(zhí)行, 可以看到,把短信都篩選出來了:

然后選中所有 row,右鍵選擇Export result set as 導出CSV,即可導出 excel 格式的文件:

導出短信導出短信

這樣就獲取到了所需的短信樣本。

02垃圾短信訓練識別

有了樣本之后,再來看如何訓練識別,打算使用蘋果的 CoreML識別,那么如何使用?樣本格式的要求是什么樣?訓練需要多久?

先來看,創(chuàng)建一個文字訓練的CoreML工程,選中 Xcode,點擊Open Developer Tool,選中 CoreML 打開,如下圖:

XcodeDevelperToolXcodeDevelperTool

然后選擇文件夾,并點擊新建New Document, 如下:

New DocumentNew Document

然后選中 Text Classification,如下圖:

Text ClassificationText Classification

接著輸入項目的名字和描述:

項目描述項目描述

點擊右下角創(chuàng)建,進入主界面,如下:

主界面主界面

點擊 Traing Data 的詳細說明,可以看到 CoreML 要求的文字識別的格式,支持 JSON 和 CSV 文件,格式如下:

格式格式

JSON 格式如下:

// JSON file
[
    {
        "text": "The movie was fantastic!",
        "label": "positive"
    }, {
        "text": "Very boring. Fell asleep.",
        "label": "negative"
    }, {
        "text": "It was just OK.",
        "label": "neutral"
    } ...
]

而 CSV 格式則是,一列 text ,一列 label,

text

label

這是一條普通短信

label1

這是一條垃圾短信

label2

由于再前一步中,已經(jīng)將短信導出為 CSV 格式,所以這里就需要把格式改為上圖中格式即可,只剩下一個問題需要解決,即:label 有哪些取值?

要看 label 有哪些取值,需要先看系統(tǒng)短信的過濾邏輯是什么樣?支持的過濾分類有哪些?否則自己想實現(xiàn)的分類,分組好了,最后發(fā)現(xiàn)系統(tǒng)不支持就尷尬了。

03短信過濾分類

系統(tǒng)短信的過濾邏輯

參考 SMS and MMS Message Filtering,可以看到,開發(fā)者是沒有權限創(chuàng)建新分組的,只能是針對收到未知聯(lián)系人的 SMS 或者 MMS ,攔截返回指定的分類。

這里需要注意的是,根據(jù)文檔的說法,短信過濾不支持 iMessage 和通訊錄中聯(lián)系人短信的過濾,僅支持未知聯(lián)系人的 SMS 和 MMS。

短信過濾,又分為本地判斷過濾和服務端判斷過濾,示意圖如下:

短信本地過濾短信本地過濾

短信服務端過濾短信服務端過濾

按照文檔的說法,即使是服務端過濾,APP 也是不能直接訪問網(wǎng)絡的,系統(tǒng)會和設置的服務器交互;而且 App Extension 不能通過共享  Group  寫數(shù)據(jù),故而短信僅能在 App Extension中獲取到,不能存儲,不能上傳,從而保證隱私和安全。關于服務端過濾更多的實現(xiàn),可以參考 Creating a Message Filter App Extension。

再來看支持的過濾類型,ILMessageFilterAction大分類支持五種:

none 沒有足夠信息,不能判斷,會展示信息,或進一步請求服務端判斷過濾

allow 正常展示信息

junk 阻止正常展示信息,顯示在垃圾短信分類下

promotion 阻止正常展示信息,顯示在推送信息分類下

transation 阻止正常展示信息,顯示在交易信息分類下

而其中又可以細分子分類,ILMessageFilterSubAction,具體含義可以參考ILMessageFilterSubAction:

  • none
  • promotion 支持的子分類有

others

offers

coupons

  • transation 支持的子分類有
  • others
  • finance
  • orders
  • reminders
  • health
  • weather
  • carrier
  • rewards
  • publicServices

這里僅針對大分類做處理,具體的子分類不做詳細過濾,所以需要訓練的 label 有哪些取值就很明確了,過濾垃圾短信、推廣信息、交易信息,至于 none 和 allow 不做區(qū)分,統(tǒng)一處理為 allow,所以總共需要訓練的 label 取值有以下這些:

  • allow
  • junk
  • promotion
  • transation

然后就是針對導出短信的 CSV 文件,針對每條短信,添加對應的 label,這里只能手工,樣本的大小和 label 定義決定后續(xù)識別的準確度,同時為了后續(xù)子分類的實現(xiàn),建議實事求是,不要把比如 promotion 里的分到 junk 里。。。

每條短信樣本都標記好了之后,就可以導入Create ML來訓練,生成需要的模型,步驟如下——

首先導入數(shù)據(jù)集:

導入數(shù)據(jù)集導入數(shù)據(jù)集

然后點擊左上角的 Train:

訓練Train訓練Train

等訓練好了之后,可以點擊 Preview ,模擬短信文本,看輸出的預測,如下圖:

效果檢測效果檢測

最后,導出模型,供  APP  使用:

導出模型導出模型


04APP開發(fā)

新建項目,然后使用 "new bing生成圖片" 來設計 APPIcon,再用 ChatGPT-4,來生成 APP 名字。然后添加 Message Filter Extension Target,如下圖:

Message Filter Extension TargetMessage Filter Extension Target

在 MessageFilterExtension.swift 中,能看到蘋果已經(jīng)幫忙實現(xiàn)了基本的框架,只需要在框架對應// TODO: 的地方,加入對應的過濾邏輯即可。

然后導入訓練結果集到項目中,注意 Target 要勾選主工程和 Message Filter Extension 的 Target,因為需要在這個 Target 中使用模型來實現(xiàn)過濾。

具體使用如下:

import Foundation
import IdentityLookup
import CoreML

import IdentityLookup

enum SMSFilterActionType: String {
    case transation
    case promotion
    case allow
    case junk
    
    func formatFilterAction() -> ILMessageFilterAction {
        switch self {
        case .transation:
            return ILMessageFilterAction.transaction
        case .promotion:
            return ILMessageFilterAction.promotion
        case .allow:
            return ILMessageFilterAction.allow
        case .junk:
            return ILMessageFilterAction.junk
        }
    }
}

struct SMSFilterUtil {
    static func filter(with messageBody: String) -> ILMessageFilterAction {
        var filterAction: ILMessageFilterAction = .none
        let configuration = MLModelConfiguration()
        do {
            let model = try SmsClassifier(configuration: configuration)
            let resultLabel = try model.prediction(text: messageBody).label
            if let resultFilterAction = SMSFilterActionType(rawValue: resultLabel)?.formatFilterAction() {
                filterAction = resultFilterAction
            }
        } catch {
            print(error)
        }
        return filterAction
    }
}

然后在MessageFilterExtension.Swift 中 offlineAction(for queryRequest: ILMessageFilterQueryRequest) -> (ILMessageFilterAction, ILMessageFilterSubAction) 方法調用,如下:

@available(iOSApplicationExtension 16.0, *)
  private func offlineAction(for queryRequest: ILMessageFilterQueryRequest) -> (ILMessageFilterAction, ILMessageFilterSubAction) {
      guard let messageBody = queryRequest.messageBody else {
          return (.none, .none)
      }
      let action = MWSMSFilterUtil.filter(with: messageBody)
      return (action, .none)
  }

這里需要注意下 APP 最低版本設置,ILMessageFilterSubAction只有 iOS 16 以上的手機才支持,而 ILMessageFilterSubAction 則是 iOS 14 以上。

如果想實現(xiàn)更精細的 SubAction 的過濾,則上面短信數(shù)據(jù)集的 label需要改為更精細的 label,然后訓練出模型,再用來判斷。

另外,ILMessageFilterQueryRequest 中可以獲取到 sender 和 messageBody,所以如果想實現(xiàn)自定義規(guī)則,比如針對某個手機號設置對應的規(guī)則,則需要從  APP 中設置對應的規(guī)則,然后通過 Group 共享到 Extension ,然后在上面的方法里通過規(guī)則匹配。

05總結

相信通過上面的步驟,大家都能開發(fā)出自己的短信過濾 APP。

上面的步驟是通過固定的訓練模型來匹配的邏輯,步驟是:

  1. 獲取短信數(shù)據(jù)集
  2. 通過 CoreML 使用數(shù)據(jù)集訓練并生成模型
  3. 在項目中使用模型,進行判斷

這種方式生成的模型其數(shù)據(jù)固定,每次更新模型需要重新訓練并導入,然后更新 APP。是否有更好的方式呢?比如是否可以在 APP 中邊訓練邊更新?又或者是否可以通過本地規(guī)則加本地模型加網(wǎng)絡模型這種方式?

假設方案一:

首先,在 APP 中邊訓練邊更新,大概思路如下——

更新模型,需要知道一條數(shù)據(jù)的內(nèi)容和數(shù)據(jù)的分類,所以如果要在 APP 中訓練模型,就需要通過另外的辦法獲取到分類,要不然用模型得到分類再回過頭來訓練模型,意義不大。所以通過自定義規(guī)則獲取到數(shù)據(jù)分類,然后用數(shù)據(jù)和數(shù)據(jù)分類來更新模型,這種方式應該是可行的。

假設方案二:

然后來考慮更完善的一種方式,即通過本地規(guī)則加本地模型加網(wǎng)絡模型的方式:

邏輯是首先通過本地規(guī)則匹配,如果本地規(guī)則匹配不到,則繼續(xù)使用本地模型匹配,如果本地模型也匹配不到,則通過請求服務端,服務端另有一套不斷訓練更新的模型,來獲取對應的分類,最后每次更新時把服務端當前對應最新的模型更新到項目中。

假設方案三:

方案二需要通過網(wǎng)絡模型,假設的前提是服務端有一套不斷訓練更新的模型,那如果這個假設不存在?只有本地規(guī)則和本地模型,外加偶爾獲取到的更新數(shù)據(jù)集,是否有辦法在線更新本地模型?

目前本地模型是直接添加到APP 主 Bundle 中,可以考慮在首次啟動時拷貝到 APP 和Extension 的共享 Group 中,每次打開 APP 時,判斷模型是否有更新,有更新則下載替換這個目錄下的模型文件。在 Extension 中,通過 URL 獲取這個目錄下的模型文件來進行過濾。

幾種方案流程圖如下:

短信 APP 過濾流程圖短信 APP 過濾流程圖

總結如下:

短信過濾 APP 開發(fā)流程短信過濾 APP 開發(fā)流程

參考:

本文轉載自微信公眾號「搜狐技術產(chǎn)品」,作者「王德亮」,可以通過以下二維碼關注。

轉載本文請聯(lián)系「搜狐技術產(chǎn)品」公眾號。

責任編輯:武曉燕 來源: 搜狐技術產(chǎn)品
相關推薦

2017-12-06 13:14:19

機器學習語義識別垃圾短信

2017-12-06 14:47:41

iOS 11短信機器學習

2013-05-28 14:39:25

Android開發(fā)Android App

2016-11-14 15:40:01

Android

2013-12-27 14:34:46

Android開發(fā)Android應用短信觸發(fā)示例

2013-04-10 15:14:18

Web App開發(fā)WebApp

2020-11-17 06:43:16

安卓智能手機移動應用

2023-03-07 10:53:33

短信

2019-12-12 14:53:13

iOS 13.3蘋果升級

2012-03-24 21:00:51

智能

2024-12-10 00:00:00

2013-03-22 13:42:39

簡網(wǎng)App工廠傻瓜式

2015-06-04 10:44:59

WebAPP開發(fā)技巧

2015-06-17 10:28:10

WebAPP開發(fā)技巧

2013-01-19 09:45:31

App移動開發(fā)趨勢

2022-09-01 11:04:47

PythonApp

2010-10-20 11:54:54

垃圾短信智能產(chǎn)品摩安短信

2018-08-08 09:47:29

短信驗證碼APP

2014-07-18 13:37:23

Android開發(fā)App Widget

2013-01-14 13:14:11

Firefox OS
點贊
收藏

51CTO技術棧公眾號