ÎÒÃÇÏÈÏëÏóһϣ¬ÎÒÃÇÒѾÓÐÒ»¸öºÜÅ£±ÆµÄÓ¦ÓÃÁË£¬ÎÒÃǹÃÇÒ½Ð×öÖØÒªÐÅÏ¢¼Çʱ¾¡£ËüµÄ¹¦ÄܾÍÊǽ«ÎÒÃÇÈÏΪÊÇÖØÒªµÄÐÅÏ¢¼Ç¼Ï£¬±ãÓÚÎÒÃÇËæÊ±²é¿´¡£ÄÇôºÎÎªÖØÒªÐÅÏ¢ÄØ£¿ÖØÒªÐÅÏ¢¿ÉÒÔÊǺܶàÀàÐ͵ÄÐÅÏ¢£¬±ÈÈçÎä¹¦ÃØ¼®¡¢Ê³Æ×¡¢ÉúÈÕ¡¢Ò»¶ÎÅ£±ÆµÄ´úÂëµÈµÈ¡£µ±ÎÒÃÇÒѾÓÐÁËÕâÑùÒ»¸öÓ¦Óú󣬽ÓÏÂÀ´Ó¦¸Ã¿¼ÂǵÄÊÂÇé¾ÍÊÇÈçºÎ¼ÇÂ¼ÖØÒªÐÅÏ¢ÁË¡£Í¨³£Ë¼Î¬Ï£¬ÄãÃÇ¿ÉÄÜÈÏΪӦ¸ÃÊÇÏÈ´ò¿ªÕâ¸öÓ¦Óã¬È»ºó½«ÖØÒªÐÅÏ¢ÇýøÈ¥¡£ÊÇÕâÑùô£¿Äãµ±Óû§ÊÇɵ×Óô£¬Ê²Ã´Äê´úÁË»¹ÊÖÇ㬼òÖ±Èõ±¬ÁË¡£ÏÂÃæÎÒÏòÄãÃǽéÉÜÒ»¸öºÜ¿áµÄ·½·¨£¬ÄǾÍÊÇͨ¹ýActionÀ©Õ¹£¬½«ÐÅÏ¢¼Ç¼µ½ÎÒÃǵÄÓ¦ÓÃÖС£ÏÂÃæÀý×ÓµÄÖ÷Òª¹¦ÄÜÊǽ«Safariä¯ÀÀµÄÍøÒ³ÖеÄÐÅÏ¢±£´æÔÚÎÒÃÇÓ¦ÓÃÖС£
¼ûÖ¤Ææ¼£µÄʱ¿Ì
ÏÈͨ¹ý File > New > Project ²Ëµ¥´´½¨Ò»¸öÐµĹ¤³Ì£¬Ñ¡Ôñ Single
View Application £º

È»ºóͨ¹ý File > New > Target ²Ëµ¥¸ø¸ø¹¤³ÌÌí¼ÓÒ»¸ö
Target £¬Ñ¡Ôñ Action Extension £º

ÔÚ´´½¨ActionÀ©Õ¹Ê±ÐèÒªÖ¸¶¨Ò»¸öAcitonÀàÐÍ£¬AppleÌṩÁËÁ½ÖÖActionÀ©Õ¹µÄÀàÐÍÄ£°å¡£Ò»ÖÖÊÇÓÐÓû§½çÃæµÄÀàÐÍ£¬°üº¬Ò»¸ö
UIViewController ºÍÒ»¸ö Storeboard Îļþ£¬¿ÉÒÔ×Ô¶¨ÒåÏÔʾ½çÃæºÍÐÐΪ¡£ÁíÒ»ÖÖÊDz»´øÓû§½çÃæµÄÀàÐÍ£¬ÕâÖÖÀàÐÍÖ»ÔÊÐíÎÒÃÇ´¦ÀíÀ´×ÔHostÓ¦ÓõÄÇëÇó¡£

ÏÖÔÚÎÒÃÇÔÚ¹¤³ÌÖоͿÉÒÔ¿´µ½¸Õ²Å´´½¨µÄActionÀ©Õ¹ NoteAppExtension
£¬Ëü°üº¬Á½¸öÖ÷ÒªµÄÎļþ£¬Ò»¸öÊÇ Action.js £¬ÁíÒ»¸öÊÇ ActionRequestHandler.swift
£º

ÎÒÃÇÀ´¿´¿´ÕâÁ½¸öÎļþµÄ×÷ÓᣠAction.js ÎļþÓÃÀ´ÊµÏֺʹ¦Àíä¯ÀÀÆ÷ÖÐÇëÇóµÄÂß¼£¬ÔÚ±¾ÎĵÄÀý×ÓÖУ¬ËüÖ÷ҪʵÏÖÓû§ÔÚä¯ÀÀÆ÷ÖÐÑ¡ÖÐÎı¾²¢·¢Ë͵½ÎÒÃǵÄÓ¦ÓÃÖС£
ActionRequestHandler.swift ÓÃÀ´´¦ÀíHostÓ¦Ó÷¢Ë͵ÄÇëÇóºÍ²ÎÊý¡£
ÔÚʵÏÖÂ߼֮ǰÎÒÃÇÐèÒªÉèÖÃÒ»ÏÂÀ©Õ¹µÄÊôÐÔ£¬´ò¿ª Info.plist Îļþ½«
NSExtensionActivationSupportsWebURLWithMaxCount ÊôÐÔÉèÖÃΪ1£¬¸ÃÉèÖÃÈÃÀ©Õ¹ÖªµÀÎÒÃÇÐèÒªÇëÇóÒ»¸öURL¡£

ÎÒÃÇ Action.js ÎļþÖÐÓÐÈçÏÂÄÚÈÝ£º
var Action = function() {};
Action.prototype = {
run: function(arguments) {
// ÔÚÕâ¸ö·½·¨ÀÄã¿ÉÒÔͨ¹ýdocument²Ù×÷HTMLÖеÄÔªËØ£¬
»òÕß¿ÉÒÔ½«HTMLÖеÄÄÚÈÝ´«¸øActionRequestHandlerÎļþµÄ´úÂë¡£
// ÔÚ±¾ÎĵÄÀý×ÓÖУ¬ÎÒÃDz»×öÈκθüУ¬Ö»Êǽ«HTMLÖÐÑ¡ÖеÄÄÚÈÝ´©¸øActionRequestHandlerÎļþµÄ´úÂë¡£
var selected = "No Text Selected";
if (window.getSelection) {
selected = window.getSelection().getRangeAt(0).toString();
} else {
selected = document.getSelection().getRangeAt(0).toString();
}
arguments.completionFunction({"args" : selected});
},
finalize: function(arguments) {
// µ±ActionRequestHandlerÎļþÖеÄitemLoadCompletedWithPreprocessingResults·½·¨Ö´ÐÐÍêÖ®ºó»áµ÷Óø÷½·¨¡£
// Èç¹ûActionRequestHandlerÎļþÏòHTML·µ»ØÁËÐÅÏ¢£¬
ÎÒÃÇ¿ÉÒÔͨ¹ýarguments["message"]À´²é¿´£¬²¢ÇÒ¿ÉÒÔ¸ù¾Ý¸ÃÐÅÏ¢²Ù×÷HTMLÖеÄÔªËØ¡£
alert(arguments["message"])
}
};
var ExtensionPreprocessingJS = new Action |
SafariÓëActionÀ©Õ¹µÄ½»»¥¾ÍÊÇͨ¹ý Action.js ÎļþÖеÄ
run ºÍ finalize ÕâÁ½¸ö·½·¨ÊµÏֵġ£µ±ÎÒÃÇÔÚSafariÖÐʹÓÃActionÀ©Õ¹Ê±¾Í»áµ÷Óà run
·½·¨£¬ËüÄÜÈÃÎÒÃÇÔڸ÷½·¨ÖвÙ×÷µ±Ç°SafariÏÔÊ¾Ò³ÃæµÄDOMÔªËØ¡£µ±ActionÀ©Õ¹´¦ÀíÍêÂß¼ÏòSafari·µ»ØÐÅϢʱ»áµ÷ÓÃ
finalize ·½·¨£¬ÔÚÎÒÃǵÄÀý×ÓÖУ¬ÎÒÃÇͨ¹ý self.extensionContext!.completeRequestReturningItems(nil,
completionHandler: nil) Õâ¶Î´úÂëÏòSafari·µ»ØÐÅÏ¢¡£¸Ã·½·¨µÄµÚÒ»¸ö²ÎÊý¾ÍÊÇÒª·µ»ØµÄÐÅÏ¢£¬Ëü»á½«ÐÅÏ¢´«¸ø
Action.js Îļþ£¬È»ºóͨ¹ýjs´úÂë²Ù×÷HTML¡£Èç¹ûµÚÒ»¸ö²ÎÊý´«Èë nil £¬ÄǾÍÒâζ×Ų»»áµ÷ÓÃ
Action.js ÎļþÖÐµÄ finalize ·½·¨¡£ run ºÍ finalize ÕâÁ½¸ö·½·¨µÄ²ÎÊý
arguments ¶¼°üº¬×ÅһЩÐÅÏ¢£¬Ö»²»¹ýÒ»¸öÊÇÀ´×ÔÓëHTML£¬Ò»¸öÀ´×Ô ActionRequestHandler
Îļþ¡£
Ò»¶¨Òª¼Çס£º ÎÒÃDZØÐëҪʵÀý»¯ ExtensionPreprocessingJS Õâ¸öÈ«¾Ö±äÁ¿£¬ÒòΪËüÊÇSafariºÍActionÀ©Õ¹Ö®¼äµÄÇÅÁº¡£
ÎÒÃÇµÄ ActionRequestHandler ÎļþÄÚÈÝÈçÏ£º
class ActionRequestHandler: NSObject, NSExtensionRequestHandling {
var extensionContext: NSExtensionContext?
func beginRequestWithExtensionContext(context: NSExtensionContext!) {
self.extensionContext = context
let identifierType = NSString(format: kUTTypePropertyList, NSUTF8StringEncoding)
for (item: NSExtensionItem) in context.inputItems as [NSExtensionItem] {
for (itemProvider: NSItemProvider) in item.attachments as [NSItemProvider] {
if itemProvider.hasItemConformingToTypeIdentifier(identifierType) {
itemProvider.loadItemForTypeIdentifier(identifierType, options: nil, completionHandler: {(item, error) in
let dictionary = item as NSDictionary
dispatch_async(dispatch_get_main_queue(), {
self.itemLoadCompletedWithPreprocessingResults
(dictionary[NSExtensionJavaScriptPreprocessingResultsKey] as NSDictionary)
})
})
}
}
}
}
func itemLoadCompletedWithPreprocessingResults(javaScriptPreprocessingResults: NSDictionary) {
if let text = javaScriptPreprocessingResults["args"] as? String {
let userDefaults = NSUserDefaults(suiteName: "group.name")
userDefaults.setValue(text, forKey: "note")
userDefaults.synchronize()
self.doneWithResults(["message": "Successfully added to the note app"])
}
}
func doneWithResults(resultsForJavaScriptFinalizeArg: NSDictionary?) {
if let resultsForJavaScriptFinalize = resultsForJavaScriptFinalizeArg {
let identifierType = NSString(format: kUTTypePropertyList, NSUTF8StringEncoding)
// ´´½¨ºÏÊÊ·µ»ØÀàÐ͵ıêʾ·û¡£
// ÕâÀï´´½¨µÄresultsItem½«×÷ΪAction.jsÎļþÖÐfinalize·½·¨µÄ²ÎÊý¡£
var resultsDictionary = [NSExtensionJavaScriptFinalizeArgumentKey: resultsForJavaScriptFinalize]
var resultsProvider = NSItemProvider(item: resultsDictionary, typeIdentifier: identifierType)
var resultsItem = NSExtensionItem()
resultsItem.attachments = [resultsProvider]
// Õâ¶Î´úÂëÒâζ×ÅActionÀ©Õ¹ÒѾ´¦ÀíÍêÁËÂß¼£¬ÏÖÔÚ½«ÐÅÏ¢·µ»Ø¸øAction.jsÎļþ¡£
self.extensionContext!.completeRequestReturningItems([resultsItem], completionHandler: nil)
} else {
// ¾ÍËãÎÒÃÇûÓÐÈκÎÒª·µ»ØµÄÐÅÏ¢£¬Ò²ÒªÖ´ÐÐÕâ¶Î´úÂ룬ÓÃÓÚ¸æÖªÎÒÃǵÄActionÀ©Õ¹ÒѾÍê³ÉÁËÂß¼´¦Àí¡£
self.extensionContext!.completeRequestReturningItems(nil, completionHandler: nil)
}
self.extensionContext = nil
}
} |
ÏÖÔÚÎÒÃÇ¿ÉÒÔÔËÐÐÒ»ÏÂÎÒÃǵÄÓ¦Óã¬È»ºó´ò¿ªSafari£¬ÔÚActionÑ¡ÏîÖпªÆôÎÒÃǵÄActionÀ©Õ¹£º

È»ºóÎÒÃǾͿÉÒÔÔÚActionÀ¸Öп´µ½ÎÒÃǵÄÀ©Õ¹ÁË£º

ÎÒÃÇʹÓÃSafariËæ±ã´ò¿ªÒ»¸öº¬ÓÐÎÄ×ÖµÄÒ³Ãæ£¬Ñ¡ÖÐÒ»¶ÎÎÄ×Ö£¬È»ºó´ò¿ªActionÀ¸£¬µã»÷
NoteApp À©Õ¹£¬´ËʱÎÒÃǵÄÀ©Õ¹¾Í»á½«Ñ¡ÖеÄÕâ¶ÎÎÄ×Ö·¢Ë͸øÎÒÃǵÄÓ¦Óã¬ÐγÉÒ»ÌõеÄÖØÒªÐÅÏ¢¡£



ÒÔÉÏÖ»ÊÇÒ»¸ö¼òµ¥µÄAcitonÀ©Õ¹µÄÀý×Ó£¬µ«ÎÒÃÇ¿ÉÒÔÓÉ´ËÑÓÉì³ö¸ü¶àÓÐÓá¢Óд´ÒâµÄ¹¦ÄÜ£¬ÈÃÎÒÃǵÄÉú»î¸ü¼ÓÃÀºÃ¡£ |