回顾
如上篇 iOS 实现垃圾短信客户端过滤 (Message Filter Extension) 中所讲, 当本地 App扩展 无法判断出短信是否为 垃圾短信 时候可以通知 iOS, 让其发送数据到我们的 关联服务器 来进行分析.
通知 iOS 发送数据到我们服务器的方法为:
1
- (void)deferQueryRequestToNetworkWithCompletion:(void (^)(ILNetworkResponse *response, NSError *error))completion;
当 App扩展 调用此方法之后, iOS 就会发起一个 HTTPS 的 POST 请求到我们的 关联服务器. 
既然要让 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是扩展的配置文件, 别配置到宿主App的Info.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字段的含义是短信内容是否包含了被过滤关键词.