[英]How to create a message app filter extension for iPhone?
我正在開發一個消息過濾器應用程序擴展。 我搜索了它並了解了身份查找,這是 ios 11.0 中新引入的概念。 我開始知道我必須在 info.plist 中插入密鑰
<key>NSExtension</key>
<dict>
<key>NSExtensionPrincipalClass</key>
<string>MessageFilterExtension</string>
<key>NSExtensionAttributes</key>
<dict>
<key>ILMessageFilterExtensionNetworkURL</key>
<string>https://www.example-sms-filter-application.com/api</string>
</dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.identitylookup.message-filter</string>
</dict>
但是在插入這些之后,在構建應用程序時,我得到了黑屏。 我剛剛插入了這個代碼。 視圖 controller.swift 文件中沒有其他內容,並創建了一個具有相同類名的文件 MessageFilterExtension.swift。
這是文檔: https : //developer.apple.com/documentation/identitylookup/creating_a_message_filter_app_extension
正如這里提到的,要創建一個擴展,你所要做的就是創建一個新的 iOS 應用程序,然后從 Xcode 菜單中選擇 File/New/Target 並選擇 Message Filter Extension。
在您的擴展中,會自動為您創建一個繼承自ILMessageFilterExtension
的類。 它還符合ILMessageFilterQueryHandling
協議,該協議有一個要求,即handle(_ queryRequest:context:completion:)
方法。
在這個方法中,一個ILMessageFilterQueryRequest
類型的查詢請求對象被傳遞給你,你將可以訪問消息的發送者和messageBody
。
應用過濾器規則后,您需要調用完成閉包,該閉包將采用您需要創建的ILMessageFilterQueryResponse
類型的單個參數並設置其操作屬性。
如果您想阻止顯示消息,您需要將操作類型設置為.filter
。 其他 2 個選項.none
和.allow
將不起作用,消息將正常顯示。
這就是創建消息過濾器擴展所需要做的全部工作。
下面是過濾垃圾短信應用程序的一個示例,它使用 CoreData 共享容器加載用戶創建的關鍵字列表,這些關鍵字用於過濾消息正文:
import IdentityLookup
final class MessageFilterExtension: ILMessageFilterExtension {
var words:[Item] = []
let stack = CoreDataStack()
func loadItems() {
let context = stack.persistentContainer.viewContext
let itemDAO = ItemDAO(managedObjectContext: context)
let allItems = itemDAO.fetchItmes()
self.words = allItems.flatMap({ item in
return item.value != nil ? item : nil
})
}
}
extension MessageFilterExtension: ILMessageFilterQueryHandling {
func handle(_ queryRequest: ILMessageFilterQueryRequest, context: ILMessageFilterExtensionContext, completion: @escaping (ILMessageFilterQueryResponse) -> Void) {
let action = self.offlineAction(for: queryRequest)
let response = ILMessageFilterQueryResponse()
response.action = action
completion(response)
}
private func offlineAction(for queryRequest: ILMessageFilterQueryRequest) -> ILMessageFilterAction {
guard let messageBody = queryRequest.messageBody?.lowercased() else { return .none }
self.loadItems()
for word in self.words {
if let value = word.value,
messageBody.contains(value.lowercased()) {
return .filter
}
}
return .allow
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.