|
// |
|
// ShareViewController.swift |
|
// Stample-clipper |
|
// |
|
// Created by Sébastien Lorber on 15/10/2015. |
|
// |
|
// |
|
|
|
import UIKit |
|
import Social |
|
import MobileCoreServices |
|
|
|
@available(iOSApplicationExtension 8.0, *) |
|
class ShareViewController: SLComposeServiceViewController { |
|
|
|
// We don't want to show the view actually |
|
// as we directly open our app! |
|
override func viewWillAppear(animated: Bool) { |
|
self.view.hidden = true |
|
self.cancel() |
|
self.doClipping() |
|
} |
|
|
|
// We directly forward all the values retrieved from Action.js to our app |
|
private func doClipping() { |
|
self.loadJsExtensionValues { dict in |
|
let url = "stample://mobileclipper?" + self.dictionaryToQueryString(dict) |
|
self.doOpenUrl(url) |
|
} |
|
} |
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////// |
|
/////////////////////////////////////////////////////////////////////////////////////////////// |
|
/////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
private func dictionaryToQueryString(dict: Dictionary<String,String>) -> String { |
|
return dict.map({ entry in |
|
let value = entry.1 |
|
let valueEncoded = value.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet()) |
|
return entry.0 + "=" + valueEncoded! |
|
}).joinWithSeparator("&") |
|
} |
|
|
|
// See https://github.com/extendedmind/extendedmind/blob/master/frontend/cordova/app/platforms/ios/extmd-share/ShareViewController.swift |
|
private func loadJsExtensionValues(f: Dictionary<String,String> -> Void) { |
|
let content = extensionContext!.inputItems[0] as! NSExtensionItem |
|
let contentType = kUTTypePropertyList as String |
|
for attachment in content.attachments as! [NSItemProvider] { |
|
if attachment.hasItemConformingToTypeIdentifier(contentType) { |
|
attachment.loadItemForTypeIdentifier(contentType, options: nil) { data, error in |
|
if ( error == nil && data != nil ) { |
|
let jsDict = data as! NSDictionary |
|
if let jsPreprocessingResults = jsDict[NSExtensionJavaScriptPreprocessingResultsKey] { |
|
let values = jsPreprocessingResults as! Dictionary<String,String> |
|
f(values) |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
// See http://stackoverflow.com/a/28037297/82609 |
|
// Works fine for iOS 8.x and 9.0 but may not work anymore in the future :( |
|
private func doOpenUrl(url: String) { |
|
let urlNS = NSURL(string: url)! |
|
var responder = self as UIResponder? |
|
while (responder != nil){ |
|
if responder!.respondsToSelector(Selector("openURL:")) == true{ |
|
responder!.callSelector(Selector("openURL:"), object: urlNS, delay: 0) |
|
} |
|
responder = responder!.nextResponder() |
|
} |
|
} |
|
} |
|
|
|
// See http://stackoverflow.com/a/28037297/82609 |
|
extension NSObject { |
|
func callSelector(selector: Selector, object: AnyObject?, delay: NSTimeInterval) { |
|
let delay = delay * Double(NSEC_PER_SEC) |
|
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) |
|
dispatch_after(time, dispatch_get_main_queue(), { |
|
NSThread.detachNewThreadSelector(selector, toTarget:self, withObject: object) |
|
}) |
|
} |
|
} |