├── 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 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
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 |
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
--------------------------------------------------------------------------------