├── Indiepaper.iOS.Share ├── Base.lproj │ └── MainInterface.storyboard ├── Indiepaper.iOS.Share-Bridging-Header.h ├── Indiepaper.iOS.Share.entitlements ├── Info.plist └── SaveViewController.swift ├── Indiepaper.iOS ├── AppDelegate.swift ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── ConfigureViewController.swift ├── Indiepaper.iOS.entitlements ├── Info.plist ├── MainViewController.swift └── ios-Assets.xcassets │ ├── AppIcon.appiconset │ ├── Contents.json │ ├── Icon-App-1024x1024.png │ ├── Icon-App-20x20@1x.png │ ├── Icon-App-20x20@2x-1.png │ ├── Icon-App-20x20@2x.png │ ├── Icon-App-20x20@3x.png │ ├── Icon-App-29x29@1x.png │ ├── Icon-App-29x29@2x-1.png │ ├── Icon-App-29x29@2x.png │ ├── Icon-App-29x29@3x.png │ ├── Icon-App-40x40@1x.png │ ├── Icon-App-40x40@2x-1.png │ ├── Icon-App-40x40@2x.png │ ├── Icon-App-40x40@3x.png │ ├── Icon-App-60x60@2x.png │ ├── Icon-App-60x60@3x.png │ ├── Icon-App-76x76@1x.png │ ├── Icon-App-76x76@2x.png │ └── Icon-App-83.5x83.5@2x.png │ └── Contents.json ├── Indiepaper.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ └── edwardhinkle.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ ├── cleverdevil.xcuserdatad │ └── xcschemes │ │ └── xcschememanagement.plist │ └── edwardhinkle.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ └── xcschememanagement.plist ├── Indiepaper ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Indiepaper-1024.png │ │ ├── Indiepaper-128.png │ │ ├── Indiepaper-256.png │ │ ├── Indiepaper-257.png │ │ ├── Indiepaper-512.png │ │ └── Indiepaper-513.png │ └── Contents.json ├── Base.lproj │ └── MainMenu.xib ├── Indiepaper.entitlements └── Info.plist ├── README.md └── Send to Indiepaper ├── Base.lproj └── ShareViewController.xib ├── Info.plist ├── Send_to_Indiepaper.entitlements ├── ShareViewController.swift └── icon.icns /Indiepaper.iOS.Share/Base.lproj/MainInterface.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /Indiepaper.iOS.Share/Indiepaper.iOS.Share-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | -------------------------------------------------------------------------------- /Indiepaper.iOS.Share/Indiepaper.iOS.Share.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.io.cleverdevil.Indiepaper 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Indiepaper.iOS.Share/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Send to Indiepaper 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | XPC! 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | NSExtension 24 | 25 | NSExtensionAttributes 26 | 27 | NSExtensionActivationRule 28 | TRUEPREDICATE 29 | 30 | NSExtensionMainStoryboard 31 | MainInterface 32 | NSExtensionPointIdentifier 33 | com.apple.share-services 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /Indiepaper.iOS.Share/SaveViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SaveViewController.swift 3 | // Indiepaper.iOS.Share 4 | // 5 | // Created by Edward Hinkle on 7/10/18. 6 | // Copyright © 2018 Jonathan LaCour. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import MobileCoreServices 11 | 12 | class SaveViewController: UIViewController { 13 | 14 | @IBOutlet weak var urlLabel: UILabel! 15 | @IBOutlet weak var modalView: UIView! 16 | private var modalCenterPosition: CGFloat? = nil 17 | private var urlToSave: URL? = nil 18 | private var targetUrl: URL? = nil 19 | private var bearerToken: String? = nil 20 | 21 | @IBAction func cancelTapped(_ sender: Any) { 22 | let originalTransform = modalView.transform 23 | let scaledTransform = originalTransform.scaledBy(x: 0.2, y: 0.2) 24 | let scaledAndTranslatedTransform = scaledTransform.translatedBy(x: 0.1, y: 0.1) 25 | 26 | UIView.animate(withDuration: 0.25, 27 | animations: { [weak self] in 28 | self?.modalView.alpha = 0 29 | self?.modalView.transform = scaledAndTranslatedTransform 30 | }, 31 | completion: { [weak self] _ in self?.extensionContext!.cancelRequest(withError: NSError(domain: "io.indiepaper", code: 1)) 32 | }) 33 | } 34 | 35 | @IBAction func saveTapped(_ sender: Any) { 36 | let originalTransform = modalView.transform 37 | let scaledTransform = originalTransform.scaledBy(x: 0.2, y: 0.2) 38 | let scaledAndTranslatedTransform = scaledTransform.translatedBy(x: 0.1, y: 0.1) 39 | 40 | UIView.animate(withDuration: 0.25, 41 | animations: { [weak self] in 42 | self?.modalView.alpha = 0 43 | self?.modalView.transform = scaledAndTranslatedTransform 44 | }, 45 | completion: { [weak self] _ in self?.extensionContext!.completeRequest(returningItems: nil, completionHandler: nil) 46 | }) 47 | } 48 | 49 | func completeSave() { 50 | DispatchQueue.main.async { [weak self] in 51 | if let url = self?.urlToSave { 52 | self?.urlLabel.text = " Saved \(url.absoluteString)" 53 | // let originalTransform = self?.modalView.transform 54 | // let scaledTransform = originalTransform?.scaledBy(x: 0.2, y: 0.2) 55 | // let scaledAndTranslatedTransform = scaledTransform?.translatedBy(x: 0.1, y: 0.1) 56 | 57 | UIView.animate(withDuration: 0.25, 58 | delay: 2, 59 | animations: { [weak self] in 60 | self?.modalView.alpha = 0 61 | // if scaledAndTranslatedTransform != nil { 62 | // self?.modalView.transform = scaledAndTranslatedTransform! 63 | // } 64 | }, 65 | completion: { [weak self] _ in 66 | var request = URLRequest(url: URL(string: "https://indiepaper.io")!) 67 | request.httpMethod = "POST" 68 | request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 69 | request.setValue("Bearer \(self?.bearerToken! ?? "")", forHTTPHeaderField: "Authorization") 70 | request.setValue(self?.targetUrl!.absoluteString, forHTTPHeaderField: "x-indiepaper-destination") 71 | request.httpBody = "url=\(url.absoluteString)".data(using: .utf8, allowLossyConversion: false) 72 | 73 | // set up the session 74 | let config = URLSessionConfiguration.default 75 | let session = URLSession(configuration: config) 76 | 77 | let task = session.dataTask(with: request) { (data, response, error) in 78 | // check for any errors 79 | guard error == nil else { 80 | print("error sending POST)") 81 | print(error ?? "No error present") 82 | return 83 | } 84 | 85 | if let httpResponse = response as? HTTPURLResponse { 86 | if httpResponse.statusCode == 200 { 87 | self?.extensionContext!.completeRequest(returningItems: nil, completionHandler: nil) 88 | } 89 | } 90 | } 91 | 92 | task.resume() 93 | }) 94 | } 95 | } 96 | } 97 | 98 | override func viewDidLoad() { 99 | super.viewDidLoad() 100 | 101 | let defaults = UserDefaults(suiteName: "group.io.cleverdevil.Indiepaper")! 102 | targetUrl = defaults.url(forKey: "targetURL") 103 | bearerToken = defaults.string(forKey: "bearerToken") 104 | 105 | guard targetUrl != nil, bearerToken != nil else { 106 | print("NO TARGET URL OR BEARER TOKEN") 107 | // TODO: ERROR! No Target Url or Bearer Token 108 | return 109 | } 110 | 111 | let extensionItems = extensionContext?.inputItems as! [NSExtensionItem] 112 | let itemProvider = extensionItems.first?.attachments?.first as! NSItemProvider 113 | // let propertyList = String(kUTTypePropertyList) 114 | let plainText = String(kUTTypePlainText) 115 | let urlAttachment = String(kUTTypeURL) 116 | 117 | DispatchQueue.global(qos: .background).async { 118 | // if itemProvider.hasItemConformingToTypeIdentifier(propertyList) { 119 | // itemProvider.loadItem(forTypeIdentifier: propertyList, options: nil, completionHandler: { (item, error) -> Void in 120 | // guard let dictionary = item as? NSDictionary else { return } 121 | // OperationQueue.main.addOperation { 122 | // print(); 123 | // if let results = dictionary[NSExtensionJavaScriptPreprocessingResultsKey] as? NSDictionary, 124 | // let urlString = results["URL"] as? String, 125 | // let itemUrl = URLComponents(string: urlString){ 126 | // self.shareUrl(url: itemUrl) 127 | // } 128 | // } 129 | // }) 130 | // } else if itemProvider.hasItemConformingToTypeIdentifier(plainText) { 131 | 132 | if itemProvider.hasItemConformingToTypeIdentifier(plainText) { 133 | itemProvider.loadItem(forTypeIdentifier: plainText, options: nil, completionHandler: { [weak self] (item, error) -> Void in 134 | if let itemString = item as? String, 135 | let itemUrl = URL(string: itemString) { 136 | self?.urlToSave = itemUrl 137 | self?.completeSave() 138 | } 139 | }) 140 | } else if itemProvider.hasItemConformingToTypeIdentifier(urlAttachment) { 141 | itemProvider.loadItem(forTypeIdentifier: urlAttachment, options: nil, completionHandler: { [weak self] (item, error) -> Void in 142 | if let itemUrl = item as? URL { 143 | self?.urlToSave = itemUrl 144 | self?.completeSave() 145 | } 146 | }) 147 | } else { 148 | print("error") 149 | // print(extensionItems?.first?.attachments) 150 | } 151 | } 152 | } 153 | 154 | override func viewDidAppear(_ animated: Bool) { 155 | super.viewDidAppear(animated) 156 | 157 | modalView.alpha = 0 158 | view.backgroundColor?.withAlphaComponent(0) 159 | 160 | UIView.animate(withDuration: 0.2) { [weak self] in 161 | self?.modalView.alpha = 1 162 | self?.view.backgroundColor?.withAlphaComponent(0.2) 163 | } 164 | } 165 | 166 | 167 | /* 168 | // MARK: - Navigation 169 | 170 | // In a storyboard-based application, you will often want to do a little preparation before navigation 171 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 172 | // Get the new view controller using segue.destination. 173 | // Pass the selected object to the new view controller. 174 | } 175 | */ 176 | 177 | } 178 | -------------------------------------------------------------------------------- /Indiepaper.iOS/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Indiepaper.iOS 4 | // 5 | // Created by Edward Hinkle on 7/9/18. 6 | // Copyright © 2018 Jonathan LaCour. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | func openDefaultView() { 17 | var rootView: UIViewController 18 | let initialStoryboard = UIStoryboard(name: "Main", bundle: nil) 19 | self.window = UIWindow(frame: UIScreen.main.bounds) 20 | 21 | let defaults = UserDefaults(suiteName: "group.io.cleverdevil.Indiepaper")! 22 | 23 | if defaults.url(forKey: "targetURL") != nil, defaults.string(forKey: "bearerToken") != nil { 24 | // Both Target Url and Bearer Token exist so we are authenticated 25 | rootView = initialStoryboard.instantiateViewController(withIdentifier: "mainView") 26 | } else { 27 | // One or both Target Url and Bearer Token are missing, so we need to authenticate 28 | rootView = initialStoryboard.instantiateViewController(withIdentifier: "configureView") 29 | } 30 | 31 | self.window?.rootViewController = rootView 32 | self.window?.makeKeyAndVisible() 33 | } 34 | 35 | internal func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 36 | openDefaultView() 37 | return true 38 | } 39 | 40 | func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { 41 | // Handle URL's for configuration of the format: 42 | // 43 | // indiepaper://configure?micropubTargetURL=XXX&bearerToken=YYY 44 | // 45 | // Eventually, we could support additional URL options, but only configuration for now. 46 | print("Attempting URL Call in App Delegate") 47 | 48 | // TODO: The line below needs to be uncommented and the suiteName needs to become the App Group name 49 | let defaults = UserDefaults(suiteName: "group.io.cleverdevil.Indiepaper")! 50 | // let defaults = UserDefaults.standard 51 | let urlToOpen = URLComponents(url: url.absoluteURL, resolvingAgainstBaseURL: false) 52 | 53 | if urlToOpen?.host == "configure" { 54 | urlToOpen?.queryItems?.forEach { item in 55 | if item.name == "micropubTargetURL" { 56 | if item.value != nil, let micropubTargetUrl = URL(string: item.value!) { 57 | print("Setting Target Url") 58 | defaults.set(micropubTargetUrl, forKey: "targetURL") 59 | } 60 | } 61 | if item.name == "bearerToken" { 62 | if item.value != nil { 63 | print("Setting Bearer Token") 64 | defaults.set(item.value!, forKey: "bearerToken") 65 | } 66 | } 67 | } 68 | } 69 | 70 | openDefaultView() 71 | 72 | return true 73 | } 74 | 75 | func applicationWillResignActive(_ application: UIApplication) { 76 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 77 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 78 | } 79 | 80 | func applicationDidEnterBackground(_ application: UIApplication) { 81 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 82 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 83 | } 84 | 85 | func applicationWillEnterForeground(_ application: UIApplication) { 86 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 87 | } 88 | 89 | func applicationDidBecomeActive(_ application: UIApplication) { 90 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 91 | } 92 | 93 | func applicationWillTerminate(_ application: UIApplication) { 94 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 95 | } 96 | 97 | 98 | } 99 | 100 | -------------------------------------------------------------------------------- /Indiepaper.iOS/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /Indiepaper.iOS/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 45 | 51 | 57 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 113 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 134 | 141 | 148 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | -------------------------------------------------------------------------------- /Indiepaper.iOS/ConfigureViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConfigureViewController.swift 3 | // Indiepaper.iOS 4 | // 5 | // Created by Edward Hinkle on 7/10/18. 6 | // Copyright © 2018 Jonathan LaCour. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ConfigureViewController: UIViewController { 12 | 13 | @IBOutlet weak var domainUrl: UITextField! 14 | @IBOutlet weak var cancelButton: UIButton! 15 | @IBOutlet weak var titleText: UILabel! 16 | 17 | @IBAction func loginTapped(_ sender: Any) { 18 | if let meUrl = domainUrl.text, let openUrl = URL(string: "https://indiepaper.io/indieauth?app=true&me=\(meUrl)"), 19 | UIApplication.shared.canOpenURL(openUrl) { 20 | UIApplication.shared.open(openUrl) 21 | } 22 | } 23 | 24 | @IBAction func manualTapped(_ sender: Any) { 25 | 26 | } 27 | 28 | @IBAction func cancelTapped(_ sender: Any) { 29 | dismiss(animated: true, completion: nil) 30 | } 31 | 32 | override func viewDidLoad() { 33 | super.viewDidLoad() 34 | 35 | let defaults = UserDefaults(suiteName: "group.io.cleverdevil.Indiepaper")! 36 | 37 | if defaults.url(forKey: "targetURL") != nil, defaults.string(forKey: "bearerToken") != nil { 38 | cancelButton.isHidden = false 39 | titleText.text = "Configure" 40 | } else { 41 | cancelButton.isHidden = true 42 | titleText.text = "Introducing IndiePaper" 43 | } 44 | } 45 | 46 | 47 | /* 48 | // MARK: - Navigation 49 | 50 | // In a storyboard-based application, you will often want to do a little preparation before navigation 51 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 52 | // Get the new view controller using segue.destination. 53 | // Pass the selected object to the new view controller. 54 | } 55 | */ 56 | 57 | } 58 | -------------------------------------------------------------------------------- /Indiepaper.iOS/Indiepaper.iOS.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.io.cleverdevil.Indiepaper 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Indiepaper.iOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Indiepaper 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleURLTypes 22 | 23 | 24 | CFBundleTypeRole 25 | Editor 26 | CFBundleURLName 27 | io.cleverdevil.Indiepaper-iOS 28 | CFBundleURLSchemes 29 | 30 | indiepaper 31 | 32 | 33 | 34 | CFBundleVersion 35 | 1 36 | LSRequiresIPhoneOS 37 | 38 | UILaunchStoryboardName 39 | LaunchScreen 40 | UIRequiredDeviceCapabilities 41 | 42 | armv7 43 | 44 | UISupportedInterfaceOrientations 45 | 46 | UIInterfaceOrientationPortrait 47 | UIInterfaceOrientationLandscapeLeft 48 | UIInterfaceOrientationLandscapeRight 49 | 50 | UISupportedInterfaceOrientations~ipad 51 | 52 | UIInterfaceOrientationPortrait 53 | UIInterfaceOrientationPortraitUpsideDown 54 | UIInterfaceOrientationLandscapeLeft 55 | UIInterfaceOrientationLandscapeRight 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /Indiepaper.iOS/MainViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // Indiepaper.iOS 4 | // 5 | // Created by Edward Hinkle on 7/9/18. 6 | // Copyright © 2018 Jonathan LaCour. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class MainViewController: UIViewController { 12 | 13 | var targetUrl: URL? = nil 14 | var bearerToken: String? = nil 15 | 16 | @IBOutlet weak var targetUrlField: UITextField! 17 | @IBOutlet weak var bearerTokenField: UITextField! 18 | 19 | override func viewDidLoad() { 20 | super.viewDidLoad() 21 | } 22 | 23 | override func viewWillAppear(_ animated: Bool) { 24 | let defaults = UserDefaults(suiteName: "group.io.cleverdevil.Indiepaper")! 25 | 26 | targetUrl = defaults.url(forKey: "targetURL") 27 | bearerToken = defaults.string(forKey: "bearerToken") 28 | 29 | targetUrlField.text = targetUrl?.absoluteString 30 | bearerTokenField.text = bearerToken 31 | } 32 | 33 | 34 | } 35 | 36 | -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x-1.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@2x-1.png", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@3x.png", 25 | "scale" : "3x" 26 | }, 27 | { 28 | "size" : "40x40", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-40x40@2x-1.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@3x.png", 37 | "scale" : "3x" 38 | }, 39 | { 40 | "size" : "60x60", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-60x60@2x.png", 43 | "scale" : "2x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@3x.png", 49 | "scale" : "3x" 50 | }, 51 | { 52 | "size" : "20x20", 53 | "idiom" : "ipad", 54 | "filename" : "Icon-App-20x20@1x.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@2x.png", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "size" : "29x29", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-29x29@1x.png", 67 | "scale" : "1x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@2x.png", 73 | "scale" : "2x" 74 | }, 75 | { 76 | "size" : "40x40", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-40x40@1x.png", 79 | "scale" : "1x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@2x.png", 85 | "scale" : "2x" 86 | }, 87 | { 88 | "size" : "76x76", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-76x76@1x.png", 91 | "scale" : "1x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@2x.png", 97 | "scale" : "2x" 98 | }, 99 | { 100 | "size" : "83.5x83.5", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-83.5x83.5@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "1024x1024", 107 | "idiom" : "ios-marketing", 108 | "filename" : "Icon-App-1024x1024.png", 109 | "scale" : "1x" 110 | } 111 | ], 112 | "info" : { 113 | "version" : 1, 114 | "author" : "xcode" 115 | } 116 | } -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024.png -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x-1.png -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x-1.png -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x-1.png -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper.iOS/ios-Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /Indiepaper.iOS/ios-Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Indiepaper.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 4354DEAD20EC115400FC8219 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4354DEAC20EC115400FC8219 /* AppDelegate.swift */; }; 11 | 4354DEAF20EC115600FC8219 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4354DEAE20EC115600FC8219 /* Assets.xcassets */; }; 12 | 4354DEB220EC115600FC8219 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4354DEB020EC115600FC8219 /* MainMenu.xib */; }; 13 | 4354DEC120EC12CA00FC8219 /* icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 4354DEC020EC12CA00FC8219 /* icon.icns */; }; 14 | 4354DEC320EC12CA00FC8219 /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4354DEC220EC12CA00FC8219 /* ShareViewController.swift */; }; 15 | 4354DEC620EC12CA00FC8219 /* ShareViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4354DEC420EC12CA00FC8219 /* ShareViewController.xib */; }; 16 | 4354DECB20EC12CA00FC8219 /* Send to Indiepaper.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 4354DEBE20EC12CA00FC8219 /* Send to Indiepaper.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 17 | 4354DED020EE89CE00FC8219 /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4354DEC220EC12CA00FC8219 /* ShareViewController.swift */; }; 18 | 4354DED120EE978D00FC8219 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4354DEAE20EC115600FC8219 /* Assets.xcassets */; }; 19 | C854917120F52F9D0084A70B /* ConfigureViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C854917020F52F9D0084A70B /* ConfigureViewController.swift */; }; 20 | C854917C20F537890084A70B /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C854917A20F537890084A70B /* MainInterface.storyboard */; }; 21 | C854918020F537890084A70B /* Indiepaper.iOS.Share.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = C854917620F537890084A70B /* Indiepaper.iOS.Share.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 22 | C854918720F53A570084A70B /* SaveViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C854918620F53A570084A70B /* SaveViewController.swift */; }; 23 | C8A3F91620F3FD5800B94809 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8A3F91520F3FD5800B94809 /* AppDelegate.swift */; }; 24 | C8A3F91820F3FD5800B94809 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8A3F91720F3FD5800B94809 /* MainViewController.swift */; }; 25 | C8A3F91B20F3FD5800B94809 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C8A3F91920F3FD5800B94809 /* Main.storyboard */; }; 26 | C8A3F91D20F3FD5B00B94809 /* ios-Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C8A3F91C20F3FD5B00B94809 /* ios-Assets.xcassets */; }; 27 | C8A3F92020F3FD5B00B94809 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C8A3F91E20F3FD5B00B94809 /* LaunchScreen.storyboard */; }; 28 | /* End PBXBuildFile section */ 29 | 30 | /* Begin PBXContainerItemProxy section */ 31 | 4354DEC920EC12CA00FC8219 /* PBXContainerItemProxy */ = { 32 | isa = PBXContainerItemProxy; 33 | containerPortal = 4354DEA120EC115400FC8219 /* Project object */; 34 | proxyType = 1; 35 | remoteGlobalIDString = 4354DEBD20EC12CA00FC8219; 36 | remoteInfo = "Send to Indiepaper"; 37 | }; 38 | C854917E20F537890084A70B /* PBXContainerItemProxy */ = { 39 | isa = PBXContainerItemProxy; 40 | containerPortal = 4354DEA120EC115400FC8219 /* Project object */; 41 | proxyType = 1; 42 | remoteGlobalIDString = C854917520F537890084A70B; 43 | remoteInfo = Indiepaper.iOS.Share; 44 | }; 45 | /* End PBXContainerItemProxy section */ 46 | 47 | /* Begin PBXCopyFilesBuildPhase section */ 48 | 4354DECF20EC12CA00FC8219 /* Embed App Extensions */ = { 49 | isa = PBXCopyFilesBuildPhase; 50 | buildActionMask = 2147483647; 51 | dstPath = ""; 52 | dstSubfolderSpec = 13; 53 | files = ( 54 | 4354DECB20EC12CA00FC8219 /* Send to Indiepaper.appex in Embed App Extensions */, 55 | ); 56 | name = "Embed App Extensions"; 57 | runOnlyForDeploymentPostprocessing = 0; 58 | }; 59 | C854918420F537890084A70B /* Embed App Extensions */ = { 60 | isa = PBXCopyFilesBuildPhase; 61 | buildActionMask = 2147483647; 62 | dstPath = ""; 63 | dstSubfolderSpec = 13; 64 | files = ( 65 | C854918020F537890084A70B /* Indiepaper.iOS.Share.appex in Embed App Extensions */, 66 | ); 67 | name = "Embed App Extensions"; 68 | runOnlyForDeploymentPostprocessing = 0; 69 | }; 70 | /* End PBXCopyFilesBuildPhase section */ 71 | 72 | /* Begin PBXFileReference section */ 73 | 434676EB20FD624500D7859B /* Indiepaper.iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Indiepaper.iOS.entitlements; sourceTree = ""; }; 74 | 434676EC20FD626200D7859B /* Indiepaper.iOS.Share.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Indiepaper.iOS.Share.entitlements; sourceTree = ""; }; 75 | 4354DEA920EC115400FC8219 /* Indiepaper.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Indiepaper.app; sourceTree = BUILT_PRODUCTS_DIR; }; 76 | 4354DEAC20EC115400FC8219 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 77 | 4354DEAE20EC115600FC8219 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 78 | 4354DEB120EC115600FC8219 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 79 | 4354DEB320EC115600FC8219 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 80 | 4354DEB420EC115600FC8219 /* Indiepaper.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Indiepaper.entitlements; sourceTree = ""; }; 81 | 4354DEBE20EC12CA00FC8219 /* Send to Indiepaper.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Send to Indiepaper.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; 82 | 4354DEC020EC12CA00FC8219 /* icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = icon.icns; sourceTree = ""; }; 83 | 4354DEC220EC12CA00FC8219 /* ShareViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareViewController.swift; sourceTree = ""; }; 84 | 4354DEC520EC12CA00FC8219 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ShareViewController.xib; sourceTree = ""; }; 85 | 4354DEC720EC12CA00FC8219 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 86 | 4354DEC820EC12CA00FC8219 /* Send_to_Indiepaper.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Send_to_Indiepaper.entitlements; sourceTree = ""; }; 87 | 437E6C6F20EEAC4B00B0BE95 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 88 | C854917020F52F9D0084A70B /* ConfigureViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigureViewController.swift; sourceTree = ""; }; 89 | C854917620F537890084A70B /* Indiepaper.iOS.Share.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = Indiepaper.iOS.Share.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 90 | C854917B20F537890084A70B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; 91 | C854917D20F537890084A70B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 92 | C854918520F53A570084A70B /* Indiepaper.iOS.Share-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Indiepaper.iOS.Share-Bridging-Header.h"; sourceTree = ""; }; 93 | C854918620F53A570084A70B /* SaveViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SaveViewController.swift; sourceTree = ""; }; 94 | C8A3F91320F3FD5800B94809 /* Indiepaper.iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Indiepaper.iOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; 95 | C8A3F91520F3FD5800B94809 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 96 | C8A3F91720F3FD5800B94809 /* MainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; }; 97 | C8A3F91A20F3FD5800B94809 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 98 | C8A3F91C20F3FD5B00B94809 /* ios-Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "ios-Assets.xcassets"; sourceTree = ""; }; 99 | C8A3F91F20F3FD5B00B94809 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 100 | C8A3F92120F3FD5B00B94809 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 101 | /* End PBXFileReference section */ 102 | 103 | /* Begin PBXFrameworksBuildPhase section */ 104 | 4354DEA620EC115400FC8219 /* Frameworks */ = { 105 | isa = PBXFrameworksBuildPhase; 106 | buildActionMask = 2147483647; 107 | files = ( 108 | ); 109 | runOnlyForDeploymentPostprocessing = 0; 110 | }; 111 | 4354DEBB20EC12CA00FC8219 /* Frameworks */ = { 112 | isa = PBXFrameworksBuildPhase; 113 | buildActionMask = 2147483647; 114 | files = ( 115 | ); 116 | runOnlyForDeploymentPostprocessing = 0; 117 | }; 118 | C854917320F537890084A70B /* Frameworks */ = { 119 | isa = PBXFrameworksBuildPhase; 120 | buildActionMask = 2147483647; 121 | files = ( 122 | ); 123 | runOnlyForDeploymentPostprocessing = 0; 124 | }; 125 | C8A3F91020F3FD5800B94809 /* Frameworks */ = { 126 | isa = PBXFrameworksBuildPhase; 127 | buildActionMask = 2147483647; 128 | files = ( 129 | ); 130 | runOnlyForDeploymentPostprocessing = 0; 131 | }; 132 | /* End PBXFrameworksBuildPhase section */ 133 | 134 | /* Begin PBXGroup section */ 135 | 4354DEA020EC115400FC8219 = { 136 | isa = PBXGroup; 137 | children = ( 138 | 437E6C6F20EEAC4B00B0BE95 /* README.md */, 139 | 4354DEAB20EC115400FC8219 /* Indiepaper */, 140 | 4354DEBF20EC12CA00FC8219 /* Send to Indiepaper */, 141 | C8A3F91420F3FD5800B94809 /* Indiepaper.iOS */, 142 | C854917720F537890084A70B /* Indiepaper.iOS.Share */, 143 | 4354DEAA20EC115400FC8219 /* Products */, 144 | ); 145 | sourceTree = ""; 146 | }; 147 | 4354DEAA20EC115400FC8219 /* Products */ = { 148 | isa = PBXGroup; 149 | children = ( 150 | 4354DEA920EC115400FC8219 /* Indiepaper.app */, 151 | 4354DEBE20EC12CA00FC8219 /* Send to Indiepaper.appex */, 152 | C8A3F91320F3FD5800B94809 /* Indiepaper.iOS.app */, 153 | C854917620F537890084A70B /* Indiepaper.iOS.Share.appex */, 154 | ); 155 | name = Products; 156 | sourceTree = ""; 157 | }; 158 | 4354DEAB20EC115400FC8219 /* Indiepaper */ = { 159 | isa = PBXGroup; 160 | children = ( 161 | 4354DEAC20EC115400FC8219 /* AppDelegate.swift */, 162 | 4354DEAE20EC115600FC8219 /* Assets.xcassets */, 163 | 4354DEB020EC115600FC8219 /* MainMenu.xib */, 164 | 4354DEB320EC115600FC8219 /* Info.plist */, 165 | 4354DEB420EC115600FC8219 /* Indiepaper.entitlements */, 166 | ); 167 | path = Indiepaper; 168 | sourceTree = ""; 169 | }; 170 | 4354DEBF20EC12CA00FC8219 /* Send to Indiepaper */ = { 171 | isa = PBXGroup; 172 | children = ( 173 | 4354DEC020EC12CA00FC8219 /* icon.icns */, 174 | 4354DEC220EC12CA00FC8219 /* ShareViewController.swift */, 175 | 4354DEC420EC12CA00FC8219 /* ShareViewController.xib */, 176 | 4354DEC720EC12CA00FC8219 /* Info.plist */, 177 | 4354DEC820EC12CA00FC8219 /* Send_to_Indiepaper.entitlements */, 178 | ); 179 | path = "Send to Indiepaper"; 180 | sourceTree = ""; 181 | }; 182 | C854917720F537890084A70B /* Indiepaper.iOS.Share */ = { 183 | isa = PBXGroup; 184 | children = ( 185 | 434676EC20FD626200D7859B /* Indiepaper.iOS.Share.entitlements */, 186 | C854917A20F537890084A70B /* MainInterface.storyboard */, 187 | C854917D20F537890084A70B /* Info.plist */, 188 | C854918620F53A570084A70B /* SaveViewController.swift */, 189 | C854918520F53A570084A70B /* Indiepaper.iOS.Share-Bridging-Header.h */, 190 | ); 191 | path = Indiepaper.iOS.Share; 192 | sourceTree = ""; 193 | }; 194 | C8A3F91420F3FD5800B94809 /* Indiepaper.iOS */ = { 195 | isa = PBXGroup; 196 | children = ( 197 | 434676EB20FD624500D7859B /* Indiepaper.iOS.entitlements */, 198 | C8A3F91520F3FD5800B94809 /* AppDelegate.swift */, 199 | C8A3F91720F3FD5800B94809 /* MainViewController.swift */, 200 | C8A3F91920F3FD5800B94809 /* Main.storyboard */, 201 | C8A3F91C20F3FD5B00B94809 /* ios-Assets.xcassets */, 202 | C8A3F91E20F3FD5B00B94809 /* LaunchScreen.storyboard */, 203 | C8A3F92120F3FD5B00B94809 /* Info.plist */, 204 | C854917020F52F9D0084A70B /* ConfigureViewController.swift */, 205 | ); 206 | path = Indiepaper.iOS; 207 | sourceTree = ""; 208 | }; 209 | /* End PBXGroup section */ 210 | 211 | /* Begin PBXNativeTarget section */ 212 | 4354DEA820EC115400FC8219 /* Indiepaper */ = { 213 | isa = PBXNativeTarget; 214 | buildConfigurationList = 4354DEB720EC115600FC8219 /* Build configuration list for PBXNativeTarget "Indiepaper" */; 215 | buildPhases = ( 216 | 4354DEA520EC115400FC8219 /* Sources */, 217 | 4354DEA620EC115400FC8219 /* Frameworks */, 218 | 4354DEA720EC115400FC8219 /* Resources */, 219 | 4354DECF20EC12CA00FC8219 /* Embed App Extensions */, 220 | ); 221 | buildRules = ( 222 | ); 223 | dependencies = ( 224 | 4354DECA20EC12CA00FC8219 /* PBXTargetDependency */, 225 | ); 226 | name = Indiepaper; 227 | productName = Indiepaper; 228 | productReference = 4354DEA920EC115400FC8219 /* Indiepaper.app */; 229 | productType = "com.apple.product-type.application"; 230 | }; 231 | 4354DEBD20EC12CA00FC8219 /* Send to Indiepaper */ = { 232 | isa = PBXNativeTarget; 233 | buildConfigurationList = 4354DECC20EC12CA00FC8219 /* Build configuration list for PBXNativeTarget "Send to Indiepaper" */; 234 | buildPhases = ( 235 | 4354DEBA20EC12CA00FC8219 /* Sources */, 236 | 4354DEBB20EC12CA00FC8219 /* Frameworks */, 237 | 4354DEBC20EC12CA00FC8219 /* Resources */, 238 | ); 239 | buildRules = ( 240 | ); 241 | dependencies = ( 242 | ); 243 | name = "Send to Indiepaper"; 244 | productName = "Send to Indiepaper"; 245 | productReference = 4354DEBE20EC12CA00FC8219 /* Send to Indiepaper.appex */; 246 | productType = "com.apple.product-type.app-extension"; 247 | }; 248 | C854917520F537890084A70B /* Indiepaper.iOS.Share */ = { 249 | isa = PBXNativeTarget; 250 | buildConfigurationList = C854918120F537890084A70B /* Build configuration list for PBXNativeTarget "Indiepaper.iOS.Share" */; 251 | buildPhases = ( 252 | C854917220F537890084A70B /* Sources */, 253 | C854917320F537890084A70B /* Frameworks */, 254 | C854917420F537890084A70B /* Resources */, 255 | ); 256 | buildRules = ( 257 | ); 258 | dependencies = ( 259 | ); 260 | name = Indiepaper.iOS.Share; 261 | productName = Indiepaper.iOS.Share; 262 | productReference = C854917620F537890084A70B /* Indiepaper.iOS.Share.appex */; 263 | productType = "com.apple.product-type.app-extension"; 264 | }; 265 | C8A3F91220F3FD5800B94809 /* Indiepaper.iOS */ = { 266 | isa = PBXNativeTarget; 267 | buildConfigurationList = C8A3F92420F3FD5B00B94809 /* Build configuration list for PBXNativeTarget "Indiepaper.iOS" */; 268 | buildPhases = ( 269 | C8A3F90F20F3FD5800B94809 /* Sources */, 270 | C8A3F91020F3FD5800B94809 /* Frameworks */, 271 | C8A3F91120F3FD5800B94809 /* Resources */, 272 | C854918420F537890084A70B /* Embed App Extensions */, 273 | ); 274 | buildRules = ( 275 | ); 276 | dependencies = ( 277 | C854917F20F537890084A70B /* PBXTargetDependency */, 278 | ); 279 | name = Indiepaper.iOS; 280 | productName = Indiepaper.iOS; 281 | productReference = C8A3F91320F3FD5800B94809 /* Indiepaper.iOS.app */; 282 | productType = "com.apple.product-type.application"; 283 | }; 284 | /* End PBXNativeTarget section */ 285 | 286 | /* Begin PBXProject section */ 287 | 4354DEA120EC115400FC8219 /* Project object */ = { 288 | isa = PBXProject; 289 | attributes = { 290 | LastSwiftUpdateCheck = 1000; 291 | LastUpgradeCheck = 0940; 292 | ORGANIZATIONNAME = "Jonathan LaCour"; 293 | TargetAttributes = { 294 | 4354DEA820EC115400FC8219 = { 295 | CreatedOnToolsVersion = 9.4.1; 296 | SystemCapabilities = { 297 | com.apple.ApplicationGroups.Mac = { 298 | enabled = 1; 299 | }; 300 | com.apple.Sandbox = { 301 | enabled = 1; 302 | }; 303 | }; 304 | }; 305 | 4354DEBD20EC12CA00FC8219 = { 306 | CreatedOnToolsVersion = 9.4.1; 307 | SystemCapabilities = { 308 | com.apple.ApplicationGroups.Mac = { 309 | enabled = 1; 310 | }; 311 | com.apple.Sandbox = { 312 | enabled = 1; 313 | }; 314 | }; 315 | }; 316 | C854917520F537890084A70B = { 317 | SystemCapabilities = { 318 | com.apple.ApplicationGroups.iOS = { 319 | enabled = 1; 320 | }; 321 | }; 322 | }; 323 | C8A3F91220F3FD5800B94809 = { 324 | CreatedOnToolsVersion = 10.0; 325 | SystemCapabilities = { 326 | com.apple.ApplicationGroups.iOS = { 327 | enabled = 1; 328 | }; 329 | }; 330 | }; 331 | }; 332 | }; 333 | buildConfigurationList = 4354DEA420EC115400FC8219 /* Build configuration list for PBXProject "Indiepaper" */; 334 | compatibilityVersion = "Xcode 9.3"; 335 | developmentRegion = en; 336 | hasScannedForEncodings = 0; 337 | knownRegions = ( 338 | en, 339 | Base, 340 | ); 341 | mainGroup = 4354DEA020EC115400FC8219; 342 | productRefGroup = 4354DEAA20EC115400FC8219 /* Products */; 343 | projectDirPath = ""; 344 | projectRoot = ""; 345 | targets = ( 346 | 4354DEA820EC115400FC8219 /* Indiepaper */, 347 | 4354DEBD20EC12CA00FC8219 /* Send to Indiepaper */, 348 | C8A3F91220F3FD5800B94809 /* Indiepaper.iOS */, 349 | C854917520F537890084A70B /* Indiepaper.iOS.Share */, 350 | ); 351 | }; 352 | /* End PBXProject section */ 353 | 354 | /* Begin PBXResourcesBuildPhase section */ 355 | 4354DEA720EC115400FC8219 /* Resources */ = { 356 | isa = PBXResourcesBuildPhase; 357 | buildActionMask = 2147483647; 358 | files = ( 359 | 4354DEAF20EC115600FC8219 /* Assets.xcassets in Resources */, 360 | 4354DEB220EC115600FC8219 /* MainMenu.xib in Resources */, 361 | ); 362 | runOnlyForDeploymentPostprocessing = 0; 363 | }; 364 | 4354DEBC20EC12CA00FC8219 /* Resources */ = { 365 | isa = PBXResourcesBuildPhase; 366 | buildActionMask = 2147483647; 367 | files = ( 368 | 4354DEC620EC12CA00FC8219 /* ShareViewController.xib in Resources */, 369 | 4354DED120EE978D00FC8219 /* Assets.xcassets in Resources */, 370 | 4354DEC120EC12CA00FC8219 /* icon.icns in Resources */, 371 | ); 372 | runOnlyForDeploymentPostprocessing = 0; 373 | }; 374 | C854917420F537890084A70B /* Resources */ = { 375 | isa = PBXResourcesBuildPhase; 376 | buildActionMask = 2147483647; 377 | files = ( 378 | C854917C20F537890084A70B /* MainInterface.storyboard in Resources */, 379 | ); 380 | runOnlyForDeploymentPostprocessing = 0; 381 | }; 382 | C8A3F91120F3FD5800B94809 /* Resources */ = { 383 | isa = PBXResourcesBuildPhase; 384 | buildActionMask = 2147483647; 385 | files = ( 386 | C8A3F92020F3FD5B00B94809 /* LaunchScreen.storyboard in Resources */, 387 | C8A3F91D20F3FD5B00B94809 /* ios-Assets.xcassets in Resources */, 388 | C8A3F91B20F3FD5800B94809 /* Main.storyboard in Resources */, 389 | ); 390 | runOnlyForDeploymentPostprocessing = 0; 391 | }; 392 | /* End PBXResourcesBuildPhase section */ 393 | 394 | /* Begin PBXSourcesBuildPhase section */ 395 | 4354DEA520EC115400FC8219 /* Sources */ = { 396 | isa = PBXSourcesBuildPhase; 397 | buildActionMask = 2147483647; 398 | files = ( 399 | 4354DED020EE89CE00FC8219 /* ShareViewController.swift in Sources */, 400 | 4354DEAD20EC115400FC8219 /* AppDelegate.swift in Sources */, 401 | ); 402 | runOnlyForDeploymentPostprocessing = 0; 403 | }; 404 | 4354DEBA20EC12CA00FC8219 /* Sources */ = { 405 | isa = PBXSourcesBuildPhase; 406 | buildActionMask = 2147483647; 407 | files = ( 408 | 4354DEC320EC12CA00FC8219 /* ShareViewController.swift in Sources */, 409 | ); 410 | runOnlyForDeploymentPostprocessing = 0; 411 | }; 412 | C854917220F537890084A70B /* Sources */ = { 413 | isa = PBXSourcesBuildPhase; 414 | buildActionMask = 2147483647; 415 | files = ( 416 | C854918720F53A570084A70B /* SaveViewController.swift in Sources */, 417 | ); 418 | runOnlyForDeploymentPostprocessing = 0; 419 | }; 420 | C8A3F90F20F3FD5800B94809 /* Sources */ = { 421 | isa = PBXSourcesBuildPhase; 422 | buildActionMask = 2147483647; 423 | files = ( 424 | C8A3F91820F3FD5800B94809 /* MainViewController.swift in Sources */, 425 | C8A3F91620F3FD5800B94809 /* AppDelegate.swift in Sources */, 426 | C854917120F52F9D0084A70B /* ConfigureViewController.swift in Sources */, 427 | ); 428 | runOnlyForDeploymentPostprocessing = 0; 429 | }; 430 | /* End PBXSourcesBuildPhase section */ 431 | 432 | /* Begin PBXTargetDependency section */ 433 | 4354DECA20EC12CA00FC8219 /* PBXTargetDependency */ = { 434 | isa = PBXTargetDependency; 435 | target = 4354DEBD20EC12CA00FC8219 /* Send to Indiepaper */; 436 | targetProxy = 4354DEC920EC12CA00FC8219 /* PBXContainerItemProxy */; 437 | }; 438 | C854917F20F537890084A70B /* PBXTargetDependency */ = { 439 | isa = PBXTargetDependency; 440 | target = C854917520F537890084A70B /* Indiepaper.iOS.Share */; 441 | targetProxy = C854917E20F537890084A70B /* PBXContainerItemProxy */; 442 | }; 443 | /* End PBXTargetDependency section */ 444 | 445 | /* Begin PBXVariantGroup section */ 446 | 4354DEB020EC115600FC8219 /* MainMenu.xib */ = { 447 | isa = PBXVariantGroup; 448 | children = ( 449 | 4354DEB120EC115600FC8219 /* Base */, 450 | ); 451 | name = MainMenu.xib; 452 | sourceTree = ""; 453 | }; 454 | 4354DEC420EC12CA00FC8219 /* ShareViewController.xib */ = { 455 | isa = PBXVariantGroup; 456 | children = ( 457 | 4354DEC520EC12CA00FC8219 /* Base */, 458 | ); 459 | name = ShareViewController.xib; 460 | sourceTree = ""; 461 | }; 462 | C854917A20F537890084A70B /* MainInterface.storyboard */ = { 463 | isa = PBXVariantGroup; 464 | children = ( 465 | C854917B20F537890084A70B /* Base */, 466 | ); 467 | name = MainInterface.storyboard; 468 | sourceTree = ""; 469 | }; 470 | C8A3F91920F3FD5800B94809 /* Main.storyboard */ = { 471 | isa = PBXVariantGroup; 472 | children = ( 473 | C8A3F91A20F3FD5800B94809 /* Base */, 474 | ); 475 | name = Main.storyboard; 476 | sourceTree = ""; 477 | }; 478 | C8A3F91E20F3FD5B00B94809 /* LaunchScreen.storyboard */ = { 479 | isa = PBXVariantGroup; 480 | children = ( 481 | C8A3F91F20F3FD5B00B94809 /* Base */, 482 | ); 483 | name = LaunchScreen.storyboard; 484 | sourceTree = ""; 485 | }; 486 | /* End PBXVariantGroup section */ 487 | 488 | /* Begin XCBuildConfiguration section */ 489 | 4354DEB520EC115600FC8219 /* Debug */ = { 490 | isa = XCBuildConfiguration; 491 | buildSettings = { 492 | ALWAYS_SEARCH_USER_PATHS = NO; 493 | CLANG_ANALYZER_NONNULL = YES; 494 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 495 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 496 | CLANG_CXX_LIBRARY = "libc++"; 497 | CLANG_ENABLE_MODULES = YES; 498 | CLANG_ENABLE_OBJC_ARC = YES; 499 | CLANG_ENABLE_OBJC_WEAK = YES; 500 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 501 | CLANG_WARN_BOOL_CONVERSION = YES; 502 | CLANG_WARN_COMMA = YES; 503 | CLANG_WARN_CONSTANT_CONVERSION = YES; 504 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 505 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 506 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 507 | CLANG_WARN_EMPTY_BODY = YES; 508 | CLANG_WARN_ENUM_CONVERSION = YES; 509 | CLANG_WARN_INFINITE_RECURSION = YES; 510 | CLANG_WARN_INT_CONVERSION = YES; 511 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 512 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 513 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 514 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 515 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 516 | CLANG_WARN_STRICT_PROTOTYPES = YES; 517 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 518 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 519 | CLANG_WARN_UNREACHABLE_CODE = YES; 520 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 521 | CODE_SIGN_IDENTITY = "Mac Developer"; 522 | COPY_PHASE_STRIP = NO; 523 | DEBUG_INFORMATION_FORMAT = dwarf; 524 | ENABLE_STRICT_OBJC_MSGSEND = YES; 525 | ENABLE_TESTABILITY = YES; 526 | GCC_C_LANGUAGE_STANDARD = gnu11; 527 | GCC_DYNAMIC_NO_PIC = NO; 528 | GCC_NO_COMMON_BLOCKS = YES; 529 | GCC_OPTIMIZATION_LEVEL = 0; 530 | GCC_PREPROCESSOR_DEFINITIONS = ( 531 | "DEBUG=1", 532 | "$(inherited)", 533 | ); 534 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 535 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 536 | GCC_WARN_UNDECLARED_SELECTOR = YES; 537 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 538 | GCC_WARN_UNUSED_FUNCTION = YES; 539 | GCC_WARN_UNUSED_VARIABLE = YES; 540 | MACOSX_DEPLOYMENT_TARGET = 10.13; 541 | MTL_ENABLE_DEBUG_INFO = YES; 542 | ONLY_ACTIVE_ARCH = YES; 543 | SDKROOT = macosx; 544 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 545 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 546 | }; 547 | name = Debug; 548 | }; 549 | 4354DEB620EC115600FC8219 /* Release */ = { 550 | isa = XCBuildConfiguration; 551 | buildSettings = { 552 | ALWAYS_SEARCH_USER_PATHS = NO; 553 | CLANG_ANALYZER_NONNULL = YES; 554 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 555 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 556 | CLANG_CXX_LIBRARY = "libc++"; 557 | CLANG_ENABLE_MODULES = YES; 558 | CLANG_ENABLE_OBJC_ARC = YES; 559 | CLANG_ENABLE_OBJC_WEAK = YES; 560 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 561 | CLANG_WARN_BOOL_CONVERSION = YES; 562 | CLANG_WARN_COMMA = YES; 563 | CLANG_WARN_CONSTANT_CONVERSION = YES; 564 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 565 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 566 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 567 | CLANG_WARN_EMPTY_BODY = YES; 568 | CLANG_WARN_ENUM_CONVERSION = YES; 569 | CLANG_WARN_INFINITE_RECURSION = YES; 570 | CLANG_WARN_INT_CONVERSION = YES; 571 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 572 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 573 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 574 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 575 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 576 | CLANG_WARN_STRICT_PROTOTYPES = YES; 577 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 578 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 579 | CLANG_WARN_UNREACHABLE_CODE = YES; 580 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 581 | CODE_SIGN_IDENTITY = "Mac Developer"; 582 | COPY_PHASE_STRIP = NO; 583 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 584 | ENABLE_NS_ASSERTIONS = NO; 585 | ENABLE_STRICT_OBJC_MSGSEND = YES; 586 | GCC_C_LANGUAGE_STANDARD = gnu11; 587 | GCC_NO_COMMON_BLOCKS = YES; 588 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 589 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 590 | GCC_WARN_UNDECLARED_SELECTOR = YES; 591 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 592 | GCC_WARN_UNUSED_FUNCTION = YES; 593 | GCC_WARN_UNUSED_VARIABLE = YES; 594 | MACOSX_DEPLOYMENT_TARGET = 10.13; 595 | MTL_ENABLE_DEBUG_INFO = NO; 596 | SDKROOT = macosx; 597 | SWIFT_COMPILATION_MODE = wholemodule; 598 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 599 | }; 600 | name = Release; 601 | }; 602 | 4354DEB820EC115600FC8219 /* Debug */ = { 603 | isa = XCBuildConfiguration; 604 | buildSettings = { 605 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 606 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 607 | CODE_SIGN_ENTITLEMENTS = Indiepaper/Indiepaper.entitlements; 608 | CODE_SIGN_STYLE = Automatic; 609 | COMBINE_HIDPI_IMAGES = YES; 610 | DEVELOPMENT_TEAM = 7V6W525663; 611 | INFOPLIST_FILE = Indiepaper/Info.plist; 612 | LD_RUNPATH_SEARCH_PATHS = ( 613 | "$(inherited)", 614 | "@executable_path/../Frameworks", 615 | ); 616 | PRODUCT_BUNDLE_IDENTIFIER = io.cleverdevil.Indiepaper; 617 | PRODUCT_NAME = "$(TARGET_NAME)"; 618 | SWIFT_VERSION = 4.0; 619 | }; 620 | name = Debug; 621 | }; 622 | 4354DEB920EC115600FC8219 /* Release */ = { 623 | isa = XCBuildConfiguration; 624 | buildSettings = { 625 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 626 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 627 | CODE_SIGN_ENTITLEMENTS = Indiepaper/Indiepaper.entitlements; 628 | CODE_SIGN_STYLE = Automatic; 629 | COMBINE_HIDPI_IMAGES = YES; 630 | DEVELOPMENT_TEAM = 7V6W525663; 631 | INFOPLIST_FILE = Indiepaper/Info.plist; 632 | LD_RUNPATH_SEARCH_PATHS = ( 633 | "$(inherited)", 634 | "@executable_path/../Frameworks", 635 | ); 636 | PRODUCT_BUNDLE_IDENTIFIER = io.cleverdevil.Indiepaper; 637 | PRODUCT_NAME = "$(TARGET_NAME)"; 638 | SWIFT_VERSION = 4.0; 639 | }; 640 | name = Release; 641 | }; 642 | 4354DECD20EC12CA00FC8219 /* Debug */ = { 643 | isa = XCBuildConfiguration; 644 | buildSettings = { 645 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 646 | CODE_SIGN_ENTITLEMENTS = "Send to Indiepaper/Send_to_Indiepaper.entitlements"; 647 | CODE_SIGN_STYLE = Automatic; 648 | COMBINE_HIDPI_IMAGES = YES; 649 | DEVELOPMENT_TEAM = 7V6W525663; 650 | INFOPLIST_FILE = "Send to Indiepaper/Info.plist"; 651 | LD_RUNPATH_SEARCH_PATHS = ( 652 | "$(inherited)", 653 | "@executable_path/../Frameworks", 654 | "@executable_path/../../../../Frameworks", 655 | ); 656 | PRODUCT_BUNDLE_IDENTIFIER = "io.cleverdevil.Indiepaper.Send-to-Indiepaper"; 657 | PRODUCT_NAME = "$(TARGET_NAME)"; 658 | SKIP_INSTALL = YES; 659 | SWIFT_VERSION = 4.0; 660 | }; 661 | name = Debug; 662 | }; 663 | 4354DECE20EC12CA00FC8219 /* Release */ = { 664 | isa = XCBuildConfiguration; 665 | buildSettings = { 666 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 667 | CODE_SIGN_ENTITLEMENTS = "Send to Indiepaper/Send_to_Indiepaper.entitlements"; 668 | CODE_SIGN_STYLE = Automatic; 669 | COMBINE_HIDPI_IMAGES = YES; 670 | DEVELOPMENT_TEAM = 7V6W525663; 671 | INFOPLIST_FILE = "Send to Indiepaper/Info.plist"; 672 | LD_RUNPATH_SEARCH_PATHS = ( 673 | "$(inherited)", 674 | "@executable_path/../Frameworks", 675 | "@executable_path/../../../../Frameworks", 676 | ); 677 | PRODUCT_BUNDLE_IDENTIFIER = "io.cleverdevil.Indiepaper.Send-to-Indiepaper"; 678 | PRODUCT_NAME = "$(TARGET_NAME)"; 679 | SKIP_INSTALL = YES; 680 | SWIFT_VERSION = 4.0; 681 | }; 682 | name = Release; 683 | }; 684 | C854918220F537890084A70B /* Debug */ = { 685 | isa = XCBuildConfiguration; 686 | buildSettings = { 687 | CLANG_ENABLE_MODULES = YES; 688 | CODE_SIGN_ENTITLEMENTS = Indiepaper.iOS.Share/Indiepaper.iOS.Share.entitlements; 689 | CODE_SIGN_IDENTITY = "iPhone Developer"; 690 | CODE_SIGN_STYLE = Automatic; 691 | DEVELOPMENT_TEAM = 7V6W525663; 692 | FRAMEWORK_SEARCH_PATHS = ( 693 | "$(inherited)", 694 | "$(PROJECT_DIR)/Carthage/Build/iOS", 695 | ); 696 | INFOPLIST_FILE = Indiepaper.iOS.Share/Info.plist; 697 | IPHONEOS_DEPLOYMENT_TARGET = 11.4; 698 | LD_RUNPATH_SEARCH_PATHS = ( 699 | "$(inherited)", 700 | "@executable_path/Frameworks", 701 | "@executable_path/../../Frameworks", 702 | ); 703 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 704 | PRODUCT_BUNDLE_IDENTIFIER = "io.cleverdevil.Indiepaper-iOS.Indiepaper-iOS-Share"; 705 | PRODUCT_NAME = "$(TARGET_NAME)"; 706 | SDKROOT = iphoneos; 707 | SKIP_INSTALL = YES; 708 | SWIFT_OBJC_BRIDGING_HEADER = "Indiepaper.iOS.Share/Indiepaper.iOS.Share-Bridging-Header.h"; 709 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 710 | SWIFT_VERSION = 4.2; 711 | TARGETED_DEVICE_FAMILY = "1,2"; 712 | }; 713 | name = Debug; 714 | }; 715 | C854918320F537890084A70B /* Release */ = { 716 | isa = XCBuildConfiguration; 717 | buildSettings = { 718 | CLANG_ENABLE_MODULES = YES; 719 | CODE_SIGN_ENTITLEMENTS = Indiepaper.iOS.Share/Indiepaper.iOS.Share.entitlements; 720 | CODE_SIGN_IDENTITY = "iPhone Developer"; 721 | CODE_SIGN_STYLE = Automatic; 722 | DEVELOPMENT_TEAM = 7V6W525663; 723 | FRAMEWORK_SEARCH_PATHS = ( 724 | "$(inherited)", 725 | "$(PROJECT_DIR)/Carthage/Build/iOS", 726 | ); 727 | INFOPLIST_FILE = Indiepaper.iOS.Share/Info.plist; 728 | IPHONEOS_DEPLOYMENT_TARGET = 11.4; 729 | LD_RUNPATH_SEARCH_PATHS = ( 730 | "$(inherited)", 731 | "@executable_path/Frameworks", 732 | "@executable_path/../../Frameworks", 733 | ); 734 | PRODUCT_BUNDLE_IDENTIFIER = "io.cleverdevil.Indiepaper-iOS.Indiepaper-iOS-Share"; 735 | PRODUCT_NAME = "$(TARGET_NAME)"; 736 | SDKROOT = iphoneos; 737 | SKIP_INSTALL = YES; 738 | SWIFT_OBJC_BRIDGING_HEADER = "Indiepaper.iOS.Share/Indiepaper.iOS.Share-Bridging-Header.h"; 739 | SWIFT_VERSION = 4.2; 740 | TARGETED_DEVICE_FAMILY = "1,2"; 741 | VALIDATE_PRODUCT = YES; 742 | }; 743 | name = Release; 744 | }; 745 | C8A3F92220F3FD5B00B94809 /* Debug */ = { 746 | isa = XCBuildConfiguration; 747 | buildSettings = { 748 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 749 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 750 | CODE_SIGN_ENTITLEMENTS = Indiepaper.iOS/Indiepaper.iOS.entitlements; 751 | CODE_SIGN_IDENTITY = "iPhone Developer"; 752 | CODE_SIGN_STYLE = Automatic; 753 | DEVELOPMENT_TEAM = 7V6W525663; 754 | INFOPLIST_FILE = Indiepaper.iOS/Info.plist; 755 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 756 | LD_RUNPATH_SEARCH_PATHS = ( 757 | "$(inherited)", 758 | "@executable_path/Frameworks", 759 | ); 760 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 761 | PRODUCT_BUNDLE_IDENTIFIER = "io.cleverdevil.Indiepaper-iOS"; 762 | PRODUCT_NAME = "$(TARGET_NAME)"; 763 | SDKROOT = iphoneos; 764 | SWIFT_VERSION = 4.0; 765 | TARGETED_DEVICE_FAMILY = "1,2"; 766 | }; 767 | name = Debug; 768 | }; 769 | C8A3F92320F3FD5B00B94809 /* Release */ = { 770 | isa = XCBuildConfiguration; 771 | buildSettings = { 772 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 773 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 774 | CODE_SIGN_ENTITLEMENTS = Indiepaper.iOS/Indiepaper.iOS.entitlements; 775 | CODE_SIGN_IDENTITY = "iPhone Developer"; 776 | CODE_SIGN_STYLE = Automatic; 777 | DEVELOPMENT_TEAM = 7V6W525663; 778 | INFOPLIST_FILE = Indiepaper.iOS/Info.plist; 779 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 780 | LD_RUNPATH_SEARCH_PATHS = ( 781 | "$(inherited)", 782 | "@executable_path/Frameworks", 783 | ); 784 | PRODUCT_BUNDLE_IDENTIFIER = "io.cleverdevil.Indiepaper-iOS"; 785 | PRODUCT_NAME = "$(TARGET_NAME)"; 786 | SDKROOT = iphoneos; 787 | SWIFT_VERSION = 4.0; 788 | TARGETED_DEVICE_FAMILY = "1,2"; 789 | VALIDATE_PRODUCT = YES; 790 | }; 791 | name = Release; 792 | }; 793 | /* End XCBuildConfiguration section */ 794 | 795 | /* Begin XCConfigurationList section */ 796 | 4354DEA420EC115400FC8219 /* Build configuration list for PBXProject "Indiepaper" */ = { 797 | isa = XCConfigurationList; 798 | buildConfigurations = ( 799 | 4354DEB520EC115600FC8219 /* Debug */, 800 | 4354DEB620EC115600FC8219 /* Release */, 801 | ); 802 | defaultConfigurationIsVisible = 0; 803 | defaultConfigurationName = Release; 804 | }; 805 | 4354DEB720EC115600FC8219 /* Build configuration list for PBXNativeTarget "Indiepaper" */ = { 806 | isa = XCConfigurationList; 807 | buildConfigurations = ( 808 | 4354DEB820EC115600FC8219 /* Debug */, 809 | 4354DEB920EC115600FC8219 /* Release */, 810 | ); 811 | defaultConfigurationIsVisible = 0; 812 | defaultConfigurationName = Release; 813 | }; 814 | 4354DECC20EC12CA00FC8219 /* Build configuration list for PBXNativeTarget "Send to Indiepaper" */ = { 815 | isa = XCConfigurationList; 816 | buildConfigurations = ( 817 | 4354DECD20EC12CA00FC8219 /* Debug */, 818 | 4354DECE20EC12CA00FC8219 /* Release */, 819 | ); 820 | defaultConfigurationIsVisible = 0; 821 | defaultConfigurationName = Release; 822 | }; 823 | C854918120F537890084A70B /* Build configuration list for PBXNativeTarget "Indiepaper.iOS.Share" */ = { 824 | isa = XCConfigurationList; 825 | buildConfigurations = ( 826 | C854918220F537890084A70B /* Debug */, 827 | C854918320F537890084A70B /* Release */, 828 | ); 829 | defaultConfigurationIsVisible = 0; 830 | defaultConfigurationName = Release; 831 | }; 832 | C8A3F92420F3FD5B00B94809 /* Build configuration list for PBXNativeTarget "Indiepaper.iOS" */ = { 833 | isa = XCConfigurationList; 834 | buildConfigurations = ( 835 | C8A3F92220F3FD5B00B94809 /* Debug */, 836 | C8A3F92320F3FD5B00B94809 /* Release */, 837 | ); 838 | defaultConfigurationIsVisible = 0; 839 | defaultConfigurationName = Release; 840 | }; 841 | /* End XCConfigurationList section */ 842 | }; 843 | rootObject = 4354DEA120EC115400FC8219 /* Project object */; 844 | } 845 | -------------------------------------------------------------------------------- /Indiepaper.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Indiepaper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Indiepaper.xcodeproj/project.xcworkspace/xcuserdata/edwardhinkle.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper.xcodeproj/project.xcworkspace/xcuserdata/edwardhinkle.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Indiepaper.xcodeproj/xcuserdata/cleverdevil.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Indiepaper.iOS.Share.xcscheme 8 | 9 | orderHint 10 | 3 11 | 12 | Indiepaper.iOS.xcscheme 13 | 14 | orderHint 15 | 2 16 | 17 | Indiepaper.xcscheme 18 | 19 | orderHint 20 | 1 21 | 22 | Send to Indiepaper.xcscheme 23 | 24 | orderHint 25 | 0 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /Indiepaper.xcodeproj/xcuserdata/edwardhinkle.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /Indiepaper.xcodeproj/xcuserdata/edwardhinkle.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Indiepaper.iOS.Share.xcscheme 8 | 9 | orderHint 10 | 3 11 | 12 | Indiepaper.iOS.xcscheme 13 | 14 | orderHint 15 | 1 16 | 17 | Indiepaper.xcscheme 18 | 19 | orderHint 20 | 0 21 | 22 | Send to Indiepaper.xcscheme 23 | 24 | orderHint 25 | 2 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /Indiepaper/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Indiepaper 4 | // 5 | // Created by Jonathan LaCour on 7/3/18. 6 | // Copyright © 2018 Jonathan LaCour. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | @NSApplicationMain 12 | class AppDelegate: NSObject, NSApplicationDelegate { 13 | 14 | @IBOutlet weak var saveButton: NSButton! 15 | @IBOutlet weak var logoView: NSImageView! 16 | @IBOutlet weak var window: NSWindow! 17 | @IBOutlet weak var targetURLField: NSTextField! 18 | @IBOutlet weak var bearerTokenField: NSTextField! 19 | 20 | @IBAction func targetURLUpdated(_ sender: Any) { 21 | let defaults = UserDefaults(suiteName: "io.cleverdevil.Indiepaper.SharedPreferences")! 22 | defaults.set(targetURLField.stringValue, forKey: "targetURL") 23 | } 24 | 25 | @IBAction func bearerTokenUpdated(_ sender: Any) { 26 | let defaults = UserDefaults(suiteName: "io.cleverdevil.Indiepaper.SharedPreferences")! 27 | defaults.set(bearerTokenField.stringValue, forKey: "bearerToken") 28 | } 29 | 30 | @IBAction func saveClicked(_ sender: Any) { 31 | let defaults = UserDefaults(suiteName: "io.cleverdevil.Indiepaper.SharedPreferences")! 32 | 33 | defaults.set(targetURLField.stringValue, forKey: "targetURL") 34 | defaults.set(bearerTokenField.stringValue, forKey: "bearerToken") 35 | 36 | showConfirmation() 37 | } 38 | 39 | @IBAction func indieAuthClicked(_ sender: Any) { 40 | NSWorkspace.shared.open(NSURL(string: "https://www.indiepaper.io/indieauth.html?app=true")! as URL) 41 | } 42 | 43 | func applicationWillFinishLaunching(_ aNotification: Notification) { 44 | // register URL handler 45 | let aem = NSAppleEventManager.shared(); 46 | aem.setEventHandler( 47 | self, 48 | andSelector: #selector(handleURL(event:replyEvent:)), 49 | forEventClass: AEEventClass(kInternetEventClass), 50 | andEventID: AEEventID(kAEGetURL) 51 | ) 52 | } 53 | 54 | func applicationDidFinishLaunching(_ aNotification: Notification) { 55 | self.logoView.image = NSImage(named: NSImage.Name("AppIcon")) 56 | 57 | let defaults = UserDefaults(suiteName: "io.cleverdevil.Indiepaper.SharedPreferences")! 58 | 59 | let targetURL = defaults.value(forKey: "targetURL") 60 | let bearerToken = defaults.value(forKey: "bearerToken") 61 | 62 | if ((targetURL != nil) && (bearerToken != nil)) { 63 | targetURLField.stringValue = defaults.value(forKey: "targetURL") as! String 64 | bearerTokenField.stringValue = defaults.value(forKey: "bearerToken") as! String 65 | } 66 | } 67 | 68 | @objc func handleURL(event: NSAppleEventDescriptor, replyEvent: NSAppleEventDescriptor) { 69 | // Handle URL's for configuration of the format: 70 | // 71 | // indiepaper://configure?micropubTargetURL=XXX&bearerToken=YYY 72 | // 73 | // Eventually, we could support additional URL options, but only configuration for now. 74 | 75 | let defaults = UserDefaults(suiteName: "io.cleverdevil.Indiepaper.SharedPreferences")! 76 | 77 | let urlString = event.paramDescriptor(forKeyword: AEKeyword(keyDirectObject))?.stringValue! 78 | let url = URL(string: urlString!)! 79 | 80 | var foundTargetURL = false 81 | var foundToken = false 82 | 83 | let components = URLComponents(url: url, resolvingAgainstBaseURL: false)! 84 | if let queryItems = components.queryItems { 85 | for item in queryItems { 86 | if (item.name == "micropubTargetURL") { 87 | foundTargetURL = true 88 | targetURLField.stringValue = item.value! 89 | defaults.set(targetURLField.stringValue, forKey: "targetURL") 90 | } else if (item.name == "bearerToken") { 91 | foundToken = true 92 | bearerTokenField.stringValue = item.value! 93 | defaults.set(bearerTokenField.stringValue, forKey: "bearerToken") 94 | } 95 | } 96 | } 97 | 98 | if (foundTargetURL && foundToken) { 99 | showConfirmation() 100 | } 101 | } 102 | 103 | private func showConfirmation() { 104 | let alert = NSAlert() 105 | alert.messageText = "Settings Saved" 106 | alert.informativeText = "You should now have a \"Send to Indiepaper\" option available from sharing menus throughout macOS. You may now quit Indiepaper!" 107 | alert.alertStyle = .informational 108 | alert.addButton(withTitle: "OK") 109 | alert.runModal() 110 | } 111 | 112 | func applicationWillTerminate(_ aNotification: Notification) { 113 | } 114 | } 115 | 116 | -------------------------------------------------------------------------------- /Indiepaper/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "size" : "32x32", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "size" : "32x32", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "size" : "128x128", 25 | "idiom" : "mac", 26 | "filename" : "Indiepaper-128.png", 27 | "scale" : "1x" 28 | }, 29 | { 30 | "size" : "128x128", 31 | "idiom" : "mac", 32 | "filename" : "Indiepaper-257.png", 33 | "scale" : "2x" 34 | }, 35 | { 36 | "size" : "256x256", 37 | "idiom" : "mac", 38 | "filename" : "Indiepaper-256.png", 39 | "scale" : "1x" 40 | }, 41 | { 42 | "size" : "256x256", 43 | "idiom" : "mac", 44 | "filename" : "Indiepaper-513.png", 45 | "scale" : "2x" 46 | }, 47 | { 48 | "size" : "512x512", 49 | "idiom" : "mac", 50 | "filename" : "Indiepaper-512.png", 51 | "scale" : "1x" 52 | }, 53 | { 54 | "size" : "512x512", 55 | "idiom" : "mac", 56 | "filename" : "Indiepaper-1024.png", 57 | "scale" : "2x" 58 | } 59 | ], 60 | "info" : { 61 | "version" : 1, 62 | "author" : "xcode" 63 | } 64 | } -------------------------------------------------------------------------------- /Indiepaper/Assets.xcassets/AppIcon.appiconset/Indiepaper-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper/Assets.xcassets/AppIcon.appiconset/Indiepaper-1024.png -------------------------------------------------------------------------------- /Indiepaper/Assets.xcassets/AppIcon.appiconset/Indiepaper-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper/Assets.xcassets/AppIcon.appiconset/Indiepaper-128.png -------------------------------------------------------------------------------- /Indiepaper/Assets.xcassets/AppIcon.appiconset/Indiepaper-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper/Assets.xcassets/AppIcon.appiconset/Indiepaper-256.png -------------------------------------------------------------------------------- /Indiepaper/Assets.xcassets/AppIcon.appiconset/Indiepaper-257.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper/Assets.xcassets/AppIcon.appiconset/Indiepaper-257.png -------------------------------------------------------------------------------- /Indiepaper/Assets.xcassets/AppIcon.appiconset/Indiepaper-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper/Assets.xcassets/AppIcon.appiconset/Indiepaper-512.png -------------------------------------------------------------------------------- /Indiepaper/Assets.xcassets/AppIcon.appiconset/Indiepaper-513.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Indiepaper/Assets.xcassets/AppIcon.appiconset/Indiepaper-513.png -------------------------------------------------------------------------------- /Indiepaper/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Indiepaper/Base.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | Default 543 | 544 | 545 | 546 | 547 | 548 | 549 | Left to Right 550 | 551 | 552 | 553 | 554 | 555 | 556 | Right to Left 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | Default 568 | 569 | 570 | 571 | 572 | 573 | 574 | Left to Right 575 | 576 | 577 | 578 | 579 | 580 | 581 | Right to Left 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | Indiepaper is a service which saves articles from the web for later reading. To get started, enter the URL for your Micropub server and a token for authorization, and click "Save," or configure with IndieAuth. 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | NSAllRomanInputSourcesLocaleIdentifier 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 775 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | -------------------------------------------------------------------------------- /Indiepaper/Indiepaper.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.application-groups 8 | 9 | io.cleverdevil.Indiepaper.SharedPreferences 10 | 11 | com.apple.security.files.user-selected.read-only 12 | 13 | com.apple.security.network.client 14 | 15 | com.apple.security.network.server 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Indiepaper/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleURLTypes 22 | 23 | 24 | CFBundleTypeRole 25 | Viewer 26 | CFBundleURLName 27 | io.cleverdevil.indiepaper 28 | CFBundleURLSchemes 29 | 30 | indiepaper 31 | 32 | 33 | 34 | CFBundleVersion 35 | 6 36 | LSMinimumSystemVersion 37 | $(MACOSX_DEPLOYMENT_TARGET) 38 | NSHumanReadableCopyright 39 | Copyright © 2018 Jonathan LaCour. All rights reserved. 40 | NSMainNibFile 41 | MainMenu 42 | NSPrincipalClass 43 | NSApplication 44 | 45 | 46 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Indiepaper for macOS 2 | 3 | This application adds system-wide support to macOS for sending links to [Indiepaper](https://www.indiepaper.io). 4 | 5 | For the latest version, please see [the releases page for this project](https://github.com/cleverdevil/Indiepaper-macOS/releases). 6 | 7 | You can automatically configure the macOS client using a URL of the format: 8 | 9 | `indiepaper://configure?micropubTargetURL=XXX&bearerToken=YYY` 10 | -------------------------------------------------------------------------------- /Send to Indiepaper/Base.lproj/ShareViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 31 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /Send to Indiepaper/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Send to Indiepaper 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | XPC! 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 6 23 | LSMinimumSystemVersion 24 | $(MACOSX_DEPLOYMENT_TARGET) 25 | NSExtension 26 | 27 | NSExtensionAttributes 28 | 29 | NSExtensionActivationRule 30 | TRUEPREDICATE 31 | 32 | NSExtensionPointIdentifier 33 | com.apple.share-services 34 | NSExtensionPrincipalClass 35 | $(PRODUCT_MODULE_NAME).ShareViewController 36 | 37 | NSHumanReadableCopyright 38 | Copyright © 2018 Jonathan LaCour. All rights reserved. 39 | 40 | 41 | -------------------------------------------------------------------------------- /Send to Indiepaper/Send_to_Indiepaper.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.application-groups 8 | 9 | io.cleverdevil.Indiepaper.SharedPreferences 10 | 11 | com.apple.security.files.user-selected.read-only 12 | 13 | com.apple.security.network.client 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Send to Indiepaper/ShareViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ShareViewController.swift 3 | // Send to Indiepaper 4 | // 5 | // Created by Jonathan LaCour on 7/3/18. 6 | // Copyright © 2018 Jonathan LaCour. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class ShareViewController: NSViewController { 12 | 13 | @IBOutlet weak var targetURL: NSTextField! 14 | @IBOutlet weak var bearerToken: NSTextField! 15 | @IBOutlet weak var categoryField: NSTokenField! 16 | 17 | override var nibName: NSNib.Name? { 18 | return NSNib.Name("ShareViewController") 19 | } 20 | 21 | override func loadView() { 22 | super.loadView() 23 | } 24 | 25 | @IBAction func cancel(_ sender: AnyObject?) { 26 | let cancelError = NSError(domain: NSCocoaErrorDomain, code: NSUserCancelledError, userInfo: nil) 27 | self.extensionContext!.cancelRequest(withError: cancelError) 28 | } 29 | 30 | @IBAction func send(_ sender: AnyObject?) { 31 | self.didSelectPost() 32 | } 33 | 34 | func sendToIndiepaper(url: String, destinationURL: String, bearerToken: String) { 35 | let indiepaperURL = URL(string: "https://indiepaper.io/")! 36 | 37 | var request = URLRequest(url: indiepaperURL) 38 | request.httpMethod = "POST" 39 | 40 | request.setValue("Bearer \(bearerToken)", forHTTPHeaderField: "Authorization") 41 | request.setValue(destinationURL, forHTTPHeaderField: "x-indiepaper-destination") 42 | 43 | request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 44 | let categories = categoryField.objectValue as! [String] 45 | var postString = "url=" + url 46 | 47 | for category in categories { 48 | let escapedCategory = category.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) 49 | postString = postString + "&category=" + escapedCategory! 50 | } 51 | 52 | request.httpBody = postString.data(using: .utf8) 53 | 54 | let task = URLSession.shared.dataTask(with: request) { data, response, error in 55 | guard let data = data, error == nil else { 56 | print("error=\(error!)") 57 | self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil) 58 | return 59 | } 60 | 61 | if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { 62 | NSLog("statusCode should be 200, but is \(httpStatus.statusCode)") 63 | print("response = \(response!)") 64 | } 65 | 66 | let responseString = String(data: data, encoding: .utf8) 67 | print("responseString = \(responseString!)") 68 | } 69 | task.resume() 70 | } 71 | 72 | func didSelectPost() { 73 | let defaults = UserDefaults(suiteName: "io.cleverdevil.Indiepaper.SharedPreferences")! 74 | 75 | if let item = extensionContext?.inputItems.first as? NSExtensionItem { 76 | if let itemProvider = item.attachments?.first as? NSItemProvider { 77 | if itemProvider.hasItemConformingToTypeIdentifier("public.url") { 78 | itemProvider.loadItem(forTypeIdentifier: "public.url", options: nil, completionHandler: { (url, error) -> Void in 79 | if let shareURL = url as? NSURL { 80 | let targetURL = defaults.value(forKey: "targetURL") as! String 81 | let bearerToken = defaults.value(forKey: "bearerToken") as! String 82 | self.sendToIndiepaper(url: shareURL.absoluteString!, destinationURL: targetURL, bearerToken: bearerToken) 83 | } 84 | self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil) 85 | }) 86 | } 87 | } 88 | } 89 | } 90 | 91 | } 92 | -------------------------------------------------------------------------------- /Send to Indiepaper/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cleverdevil/Indiepaper-macOS/b8fd2101d24ca21d17b2407de8368b4d022ef57f/Send to Indiepaper/icon.icns --------------------------------------------------------------------------------