然後通過文件》新建& gt目標菜單向項目添加目標,並選擇操作擴展:
創建操作擴展時,您需要指定壹個操作類型。蘋果為動作擴展提供了兩種類型的模板。壹種類型具有用戶界面,其中包含UIViewController和Storeboard文件,並且可以自定義顯示界面和行為。另壹種是沒有用戶界面的類型,它只允許我們處理來自宿主應用程序的請求。
現在我們可以看到剛剛在項目中創建的動作擴展NoteAppExtension,它包含兩個主要文件,壹個是Action.js,另壹個是ActionRequestHandler.swift:
讓我們來看看這兩個文檔的功能。Action.js文件用於在瀏覽器中實現和處理請求的邏輯。在這個例子中,它主要實現用戶在瀏覽器中選擇文本並將其發送到我們的應用程序。ActionRequestHandler.swift用於處理主機應用程序發送的請求和參數。
在實現邏輯之前,我們需要設置擴展的屬性,打開Info.plist文件並將NSextensionActivation SupportSweburlwithMaxcount屬性設置為1。這個設置讓擴展知道我們需要請求壹個URL。
我們的Action.js文件包含以下內容:
Safari與Action extension的交互是通過Action.js文件中的run和finalize兩種方法實現的。當我們在Safari中使用Action擴展時,我們將調用run方法,該方法允許我們在該方法中操作當前Safari顯示頁面的DOM元素。當操作擴展完成處理邏輯以向Safari返回信息時,將調用finalize方法。在我們的示例中,我們使用self.extensionContext!。completeRequestReturningItems(nil,CompletionHandler: nil)向Safari返回信息。該方法的第壹個參數是要返回的信息。它會將信息傳遞給Action.js文件,然後通過js代碼操作HTML。如果將第壹個參數傳遞給nil,則意味著不會調用Action.js文件中的finalize方法。run和finalize方法的參數都包含壹些信息,但壹個來自HTML,另壹個來自ActionRequestHandler文件。
記住:我們必須實例化全局變量ExtensionPreprocessingJS,因為它是Safari和Action extension之間的橋梁。
我們的ActionRequestHandler文件如下:
類ActionRequestHandler: NSObject,NSExtensionRequestHandling {
var extension context:nseextensioncontext?
func beginRequestWithExtensionContext(context:NSExtensionContext!) {
self.extensionContext =上下文
let identifierType = NSString(格式:kUTTypePropertyList,NSUTF8StringEncoding)
context . input items as【NSExtensionItem】{
對於item.attachments中的(item provider:NSItemProvider)as【NSItemProvider】{
if item provider . hasitemconformingtotypeidentifier(identifier type ){
item provider . loaditemfortypecoidentifier(identifier type,options: nil,completion handler:{(item,error)in
let dictionary = item as ns dictionary
分派_異步(分派_獲取_主隊列(),{
self . itemloadcompletedwithypreprocessingresults(dictionary【nsextensionjavascript preprocessingresultskey】as ns dictionary)
})
})
}
}
}
}
func itemloadcompletedwithypreprocessingresults(JavaScript preprocessingresults:ns dictionary ){
if let text = JavaScript preprocessing results【“args“】as?字符串{
let user defaults = nsuser defaults(suite name:“group . name“)
user defaults . setvalue(text,forKey:“note“)
userDefaults.synchronize()
self . donewithresults(【“message“:“已成功添加到筆記應用“】)
}
}
func doneWithResults(resultsforjavascript finalizearg:ns dictionary?) {
if let resultsforjavascript finalize = resultsforjavascript finalize arg {
let identifierType = NSString(格式:kUTTypePropertyList,NSUTF8StringEncoding)
//創建適當返回類型的標識符。
//此處創建的resultsItem將用作Action.js文件中finalize方法的參數。
var results dictionary =【nsextensionjavascript finalizeargumentkey:resultsforjavascript finalize】
var results provider = NSItemProvider(item:results dictionary,typeIdentifier: identifierType)
var resultsItem = NSExtensionItem()
results item . attachments =【results provider】
//這段代碼意味著操作擴展已經完成了邏輯處理,現在它將信息返回到Action.js文件。
self.extensionContext!。completeRequestReturningItems(【resultsItem】,completionHandler: nil)
}否則{
//即使我們沒有任何要返回的信息,我們也應該執行這段代碼來通知我們的操作擴展邏輯處理已經完成。
self.extensionContext!。completeRequestReturningItems(nil,completionHandler: nil)
}
self.extensionContext = nil
}
}
現在我們可以運行我們的應用程序,然後打開Safari並在操作選項中打開我們的操作擴展: