From 4eebdd69e65fb2cee4fe6058293a6da63838daa8 Mon Sep 17 00:00:00 2001 From: ylzheng Date: Fri, 30 Oct 2015 22:18:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=9D=E5=AD=98=E5=88=86=E4=BA=AB=E7=9A=84UR?= =?UTF-8?q?L=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- librx.xcodeproj/project.pbxproj | 20 +++++++++ librx/librx.entitlements | 8 ++++ libxShareExt/Info.plist | 2 + libxShareExt/LibrExtensionJavaScript.js | 9 +++-- libxShareExt/ShareViewController.swift | 54 +++++++++++++++++++++++++ libxShareExt/libxShareExt.entitlements | 8 ++++ 6 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 librx/librx.entitlements create mode 100644 libxShareExt/libxShareExt.entitlements diff --git a/librx.xcodeproj/project.pbxproj b/librx.xcodeproj/project.pbxproj index 6b26b36..78d64fe 100644 --- a/librx.xcodeproj/project.pbxproj +++ b/librx.xcodeproj/project.pbxproj @@ -196,6 +196,8 @@ 456A681B1BE39C76001B3096 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; 456A681D1BE39C76001B3096 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 456A68261BE3A893001B3096 /* LibrExtensionJavaScript.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = LibrExtensionJavaScript.js; sourceTree = ""; }; + 456A68281BE3AE21001B3096 /* libxShareExt.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = libxShareExt.entitlements; sourceTree = ""; }; + 456A68291BE3AE2B001B3096 /* librx.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = librx.entitlements; sourceTree = ""; }; 456CEF461BAC4F3E00E090BA /* Bootstrap.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = Bootstrap.css; sourceTree = ""; }; 456F1A161B6FD3D6007F9ACF /* MenuTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MenuTableViewController.swift; sourceTree = ""; }; 456F1A1D1B6FD4D0007F9ACF /* MenuTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MenuTableViewCell.swift; sourceTree = ""; }; @@ -333,6 +335,7 @@ 452DC1151B6287E600847691 /* librx */ = { isa = PBXGroup; children = ( + 456A68291BE3AE2B001B3096 /* librx.entitlements */, 45517B171BCCFAEC004C6D10 /* constants */, 453BAB4B1B8B575600BA7DF7 /* bridge */, 45B11CC41B6FBFA7008D6049 /* extensions */, @@ -437,6 +440,7 @@ 456A68171BE39C76001B3096 /* libxShareExt */ = { isa = PBXGroup; children = ( + 456A68281BE3AE21001B3096 /* libxShareExt.entitlements */, 456A68181BE39C76001B3096 /* ShareViewController.swift */, 456A681A1BE39C76001B3096 /* MainInterface.storyboard */, 456A681D1BE39C76001B3096 /* Info.plist */, @@ -707,6 +711,11 @@ 452DC1121B6287E600847691 = { CreatedOnToolsVersion = 6.3.1; DevelopmentTeam = 25X8QKQ2XY; + SystemCapabilities = { + com.apple.ApplicationGroups.iOS = { + enabled = 1; + }; + }; }; 452DC12A1B6287E600847691 = { CreatedOnToolsVersion = 6.3.1; @@ -715,6 +724,11 @@ 456A68151BE39C76001B3096 = { CreatedOnToolsVersion = 7.1; DevelopmentTeam = 25X8QKQ2XY; + SystemCapabilities = { + com.apple.ApplicationGroups.iOS = { + enabled = 1; + }; + }; }; }; }; @@ -1039,6 +1053,7 @@ baseConfigurationReference = 04DD86F873034FCDBA6CF699 /* Pods-librx.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = librx/librx.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; @@ -1073,6 +1088,7 @@ baseConfigurationReference = 3C589578C2D1AD931B429F24 /* Pods-librx.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = librx/librx.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; @@ -1143,6 +1159,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = BrandAsset; + CODE_SIGN_ENTITLEMENTS = libxShareExt/libxShareExt.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEBUG_INFORMATION_FORMAT = dwarf; @@ -1151,6 +1168,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.librme.libr.libxShareExt; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; SKIP_INSTALL = YES; }; name = Debug; @@ -1160,6 +1178,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = BrandAsset; + CODE_SIGN_ENTITLEMENTS = libxShareExt/libxShareExt.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; INFOPLIST_FILE = libxShareExt/Info.plist; @@ -1167,6 +1186,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.librme.libr.libxShareExt; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; SKIP_INSTALL = YES; }; name = Release; diff --git a/librx/librx.entitlements b/librx/librx.entitlements new file mode 100644 index 0000000..2eb7e33 --- /dev/null +++ b/librx/librx.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.application-groups + + + diff --git a/libxShareExt/Info.plist b/libxShareExt/Info.plist index 965f458..4c6672a 100644 --- a/libxShareExt/Info.plist +++ b/libxShareExt/Info.plist @@ -28,6 +28,8 @@ NSExtensionAttributes + NSExtensionJavaScriptPreprocessingFile + LibrExtensionJavaScript NSExtensionActivationRule NSExtensionActivationSupportsWebPageWithMaxCount diff --git a/libxShareExt/LibrExtensionJavaScript.js b/libxShareExt/LibrExtensionJavaScript.js index cc60621..5a3f60c 100644 --- a/libxShareExt/LibrExtensionJavaScript.js +++ b/libxShareExt/LibrExtensionJavaScript.js @@ -1,9 +1,12 @@ var LibrmeExtension = function() {}; LibrmeExtension.prototype = { -run: function(arguments) { - arguments.completionFunction({"baseURI" : document.baseURI}); -} + run: function(arguments) { + arguments.completionFunction({"baseURI" : document.baseURI}); + }, + finalize: function(arguments) { + alert(arguments); + } } var ExtensionPreprocessingJS = new LibrmeExtension; \ No newline at end of file diff --git a/libxShareExt/ShareViewController.swift b/libxShareExt/ShareViewController.swift index f1c21ea..64c7269 100644 --- a/libxShareExt/ShareViewController.swift +++ b/libxShareExt/ShareViewController.swift @@ -8,9 +8,61 @@ import UIKit import Social +import MobileCoreServices class ShareViewController: SLComposeServiceViewController { + override func viewDidLoad() { + super.viewDidLoad() + + for item: AnyObject in self.extensionContext!.inputItems { + let inputItem = item as! NSExtensionItem + for provider: AnyObject in inputItem.attachments! { + let itemProvider = provider as! NSItemProvider + if itemProvider.hasItemConformingToTypeIdentifier(kUTTypePropertyList as String) { + // You _HAVE_ to call loadItemForTypeIdentifier in order to get the JS injected + itemProvider.loadItemForTypeIdentifier(kUTTypePropertyList as String, options: nil, completionHandler: { + (list, error) in + if let results = list as? NSDictionary { + NSOperationQueue.mainQueue().addOperationWithBlock { + // We don't actually care about this... + print(results) + self.itemLoadCompletedWithPreprocessingResults(results["NSExtensionJavaScriptPreprocessingResultsKey"] as! NSDictionary) + } + } + }) + } + } + } + } + + func itemLoadCompletedWithPreprocessingResults(javaScriptPreprocessingResults: NSDictionary) { + if let text = javaScriptPreprocessingResults["baseURI"] 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) + + let resultsDictionary = [NSExtensionJavaScriptFinalizeArgumentKey: resultsForJavaScriptFinalize] + let resultsProvider = NSItemProvider(item: resultsDictionary, typeIdentifier: identifierType as String) + let resultsItem = NSExtensionItem() + resultsItem.attachments = [resultsProvider] + + // + self.extensionContext!.completeRequestReturningItems([resultsItem], completionHandler: nil) + } else { + // 就算我们没有任何要返回的信息,也要执行这段代码,用于告知我们的Action扩展已经完成了逻辑处理。 + self.extensionContext!.completeRequestReturningItems(nil, completionHandler: nil) + } + } + + override func isContentValid() -> Bool { // Do validation of contentText and/or NSExtensionContext attachments here return true @@ -24,6 +76,8 @@ class ShareViewController: SLComposeServiceViewController { self.extensionContext!.completeRequestReturningItems([], completionHandler: nil) } + + override func configurationItems() -> [AnyObject]! { // To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here. diff --git a/libxShareExt/libxShareExt.entitlements b/libxShareExt/libxShareExt.entitlements new file mode 100644 index 0000000..2eb7e33 --- /dev/null +++ b/libxShareExt/libxShareExt.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.application-groups + + +