回顾
如上篇 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
字段的含义是短信内容是否包含了被过滤关键词.