當前位置:成語大全網 - 書法字典 - 淺析如何在Swift中創建動作擴展

淺析如何在Swift中創建動作擴展

瀏覽文件》新建& gt項目菜單要創建新項目,請選擇單視圖應用程序:

然後通過文件》新建& 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並在操作選項中打開我們的操作擴展: