Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÈçºÎÔÚSwiftÖд´½¨ActionÀ©Õ¹
 
×÷Õß ÌÀÓ¾£¬»ðÁú¹ûÈí¼þ    ·¢²¼ÓÚ 2014-10-17
  2576  次浏览      27
 

ÎÒÃÇÏÈÏëÏóһϣ¬ÎÒÃÇÒѾ­ÓÐÒ»¸öºÜÅ£±ÆµÄÓ¦ÓÃÁË£¬ÎÒÃǹÃÇÒ½Ð×öÖØÒªÐÅÏ¢¼Çʱ¾¡£ËüµÄ¹¦ÄܾÍÊǽ«ÎÒÃÇÈÏΪÊÇÖØÒªµÄÐÅÏ¢¼Ç¼Ï£¬±ãÓÚÎÒÃÇËæÊ±²é¿´¡£ÄÇôºÎÎªÖØÒªÐÅÏ¢ÄØ£¿ÖØÒªÐÅÏ¢¿ÉÒÔÊǺܶàÀàÐ͵ÄÐÅÏ¢£¬±ÈÈçÎä¹¦ÃØ¼®¡¢Ê³Æ×¡¢ÉúÈÕ¡¢Ò»¶ÎÅ£±ÆµÄ´úÂëµÈµÈ¡£µ±ÎÒÃÇÒѾ­ÓÐÁËÕâÑùÒ»¸öÓ¦Óú󣬽ÓÏÂÀ´Ó¦¸Ã¿¼ÂǵÄÊÂÇé¾ÍÊÇÈçºÎ¼ÇÂ¼ÖØÒªÐÅÏ¢ÁË¡£Í¨³£Ë¼Î¬Ï£¬ÄãÃÇ¿ÉÄÜÈÏΪӦ¸ÃÊÇÏÈ´ò¿ªÕâ¸öÓ¦Óã¬È»ºó½«ÖØÒªÐÅÏ¢ÇýøÈ¥¡£ÊÇÕâÑùô£¿Äãµ±Óû§ÊÇɵ×Óô£¬Ê²Ã´Äê´úÁË»¹ÊÖÇ㬼òÖ±Èõ±¬ÁË¡£ÏÂÃæÎÒÏòÄãÃǽéÉÜÒ»¸öºÜ¿áµÄ·½·¨£¬ÄǾÍÊÇͨ¹ý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À©Õ¹µÄÀý×Ó£¬µ«ÎÒÃÇ¿ÉÒÔÓÉ´ËÑÓÉì³ö¸ü¶àÓÐÓá¢Óд´ÒâµÄ¹¦ÄÜ£¬ÈÃÎÒÃǵÄÉú»î¸ü¼ÓÃÀºÃ¡£

   
2576 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ