首页 iOS 实现垃圾短信服务端过滤 (Message Filter Extension)
文章
取消

iOS 实现垃圾短信服务端过滤 (Message Filter Extension)

回顾

如上篇 iOS 实现垃圾短信客户端过滤 (Message Filter Extension) 中所讲, 当本地 App扩展 无法判断出短信是否为 垃圾短信 时候可以通知 iOS, 让其发送数据到我们的 关联服务器 来进行分析.

通知 iOS 发送数据到我们服务器的方法为:

1
- (void)deferQueryRequestToNetworkWithCompletion:(void (^)(ILNetworkResponse *response, NSError *error))completion;

App扩展 调用此方法之后, iOS 就会发起一个 HTTPSPOST 请求到我们的 关联服务器. 既然要让 iOS 来请求我们的服务器, 就肯定要告诉 iOS 我们服务器接口的地址: 在 App扩展target 下的 info.plist 中添加如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
<key>NSExtension</key>
    <dict>
        <key>NSExtensionPrincipalClass</key>
            <string>MessageFilterExtension</string>
        <key>NSExtensionAttributes</key>
            <dict>
                // 服务器接口地址
                <key>ILMessageFilterExtensionNetworkURL</key>
                <string>https://api.zhk1024.com/index.php/api/message</string>
            </dict>
        <key>NSExtensionPointIdentifier</key>
        <string>com.apple.identitylookup.message-filter</string>
     </dict>

其中 ILMessageFilterExtensionNetworkURL 字段 https://api.zhk1024.com/index.php/api/message 就是我们的服务器接口地址. 通过此接口来处理过滤逻辑.

另外还要配置 Associated Domains 参考: 配置说明

注意 Info.plist扩展 的配置文件, 别配置到 宿主AppInfo.plist 中.

服务端

服务器也要根据文档进行一些配置: 文档地址

iOS 发起的 POST 请求数据信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
POST /server-endpoint HTTP/1.1
Accept: */*
Content-Type: application/json; charset=utf-8
Content-Length: 148
{
    "_version": 1,
    "query": {
        "sender": "14085550001",
        "message": {
            "text": "This is a message"
        }
    },
    "app": {
        "version": "1.1"
    }
}

数据部分为 JSON 格式.

服务端简单实现

服务端利用 PHP 来实现, 但是一定是要 HTTPS 的接口. Apple 如果主动访问我们的服务器, 一般都会强制要求 HTTPS.

简单的接口实现如下:

1
2
3
4
5
6
public function message(){
    $message = $_POST['query']['text'];
    $res = strpos($message, '赌场');
    header("Content-type:application/json;charset=utf8");
    echo json_encode(array('res' => $res));
}

我们仅仅简单判断一下短信内容是否包含了 赌场 这样的关键词. 更加复杂的分析逻辑可以自行实现.

接口返回的数据格式如下:

1
2
3
{
    res: false
}

注意 测试服务返回的 res 字段的含义是短信内容是否包含了被过滤关键词.

本文由作者按照 CC BY 4.0 进行授权