簡體   English   中英

如何為 iPhone 創建消息應用過濾器擴展?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM