diff --git a/NetNewsWire.entitlements b/NetNewsWire.entitlements new file mode 100644 index 000000000..0c67376eb --- /dev/null +++ b/NetNewsWire.entitlements @@ -0,0 +1,5 @@ + + + + + diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index 49b9d9b98..45c4628cc 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -23,6 +23,27 @@ 512E09012268907400BDCFDD /* MasterFeedTableViewSectionHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 512E08F722688F7C00BDCFDD /* MasterFeedTableViewSectionHeader.swift */; }; 512E09352268B25900BDCFDD /* UISplitViewController-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 512E092B2268B25500BDCFDD /* UISplitViewController-Extensions.swift */; }; 512E094D2268B8AB00BDCFDD /* DeleteCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B99C9C1FAE83C600ECDEDB /* DeleteCommand.swift */; }; + 513C5CE9232571C2003D4054 /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 513C5CE8232571C2003D4054 /* ShareViewController.swift */; }; + 513C5CEC232571C2003D4054 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 513C5CEA232571C2003D4054 /* MainInterface.storyboard */; }; + 513C5CF0232571C2003D4054 /* NetNewsWire Share Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 513C5CE6232571C2003D4054 /* NetNewsWire Share Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 513C5CFD2325749A003D4054 /* Account.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8407166A2262A60D00344432 /* Account.framework */; }; + 513C5CFE2325749A003D4054 /* Account.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8407166A2262A60D00344432 /* Account.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 513C5D00232574AF003D4054 /* Articles.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 840716732262A60F00344432 /* Articles.framework */; }; + 513C5D01232574AF003D4054 /* Articles.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 840716732262A60F00344432 /* Articles.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 513C5D02232574B4003D4054 /* ArticlesDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8407167F2262A61100344432 /* ArticlesDatabase.framework */; }; + 513C5D03232574B4003D4054 /* ArticlesDatabase.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8407167F2262A61100344432 /* ArticlesDatabase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 513C5D04232574B9003D4054 /* RSCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F8520DD8CF200CA8CF5 /* RSCore.framework */; }; + 513C5D05232574B9003D4054 /* RSCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F8520DD8CF200CA8CF5 /* RSCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 513C5D06232574C0003D4054 /* RSDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37FC420DD8E0C00CA8CF5 /* RSDatabase.framework */; }; + 513C5D07232574C0003D4054 /* RSDatabase.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37FC420DD8E0C00CA8CF5 /* RSDatabase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 513C5D08232574C6003D4054 /* RSParser.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F8C20DD8CF800CA8CF5 /* RSParser.framework */; }; + 513C5D09232574C6003D4054 /* RSParser.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F8C20DD8CF800CA8CF5 /* RSParser.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 513C5D0A232574D2003D4054 /* RSWeb.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37FA320DD8D0500CA8CF5 /* RSWeb.framework */; }; + 513C5D0B232574D2003D4054 /* RSWeb.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37FA320DD8D0500CA8CF5 /* RSWeb.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 513C5D0C232574DA003D4054 /* RSTree.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F9520DD8CFE00CA8CF5 /* RSTree.framework */; }; + 513C5D0D232574DA003D4054 /* RSTree.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84C37F9520DD8CFE00CA8CF5 /* RSTree.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 513C5D0E232574E4003D4054 /* SyncDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; }; + 513C5D0F232574E4003D4054 /* SyncDatabase.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 5144EA2F2279FAB600D19003 /* AccountsDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5144EA2E2279FAB600D19003 /* AccountsDetailViewController.swift */; }; 5144EA362279FC3D00D19003 /* AccountsAddLocal.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5144EA352279FC3D00D19003 /* AccountsAddLocal.xib */; }; 5144EA382279FC6200D19003 /* AccountsAddLocalWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5144EA372279FC6200D19003 /* AccountsAddLocalWindowController.swift */; }; @@ -42,6 +63,9 @@ 51554C30228B71A10055115A /* SyncDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; }; 51554C31228B71A10055115A /* SyncDatabase.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 515ADE4022E11FAE006B2460 /* SystemMessageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515ADE3F22E11FAE006B2460 /* SystemMessageViewController.swift */; }; + 515D4FC123257A3200EE1167 /* FolderTreeControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A97A11ED9F180007D329B /* FolderTreeControllerDelegate.swift */; }; + 515D4FCA23257CB500EE1167 /* Node-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A97971ED9EFAA007D329B /* Node-Extensions.swift */; }; + 515D4FCC2325815A00EE1167 /* SafariExt.js in Resources */ = {isa = PBXBuildFile; fileRef = 515D4FCB2325815A00EE1167 /* SafariExt.js */; }; 5183CCD0226E1E880010922C /* NonIntrinsicLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCCF226E1E880010922C /* NonIntrinsicLabel.swift */; }; 5183CCDA226E31A50010922C /* NonIntrinsicImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCD9226E31A50010922C /* NonIntrinsicImageView.swift */; }; 5183CCDD226F1F5C0010922C /* NavigationProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCDC226F1F5C0010922C /* NavigationProgressView.swift */; }; @@ -343,6 +367,13 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 513C5CEE232571C2003D4054 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 849C64581ED37A5D003D8FC0 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 513C5CE5232571C2003D4054; + remoteInfo = "NetNewsWire iOS Share Extension"; + }; 51554C00228B6EB50055115A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 51554BFC228B6EB50055115A /* SyncDatabase.xcodeproj */; @@ -619,6 +650,36 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ + 513C5CF1232571C2003D4054 /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 513C5CF0232571C2003D4054 /* NetNewsWire Share Extension.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; + 513C5CFF2325749A003D4054 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 513C5D0B232574D2003D4054 /* RSWeb.framework in Embed Frameworks */, + 513C5D0D232574DA003D4054 /* RSTree.framework in Embed Frameworks */, + 513C5CFE2325749A003D4054 /* Account.framework in Embed Frameworks */, + 513C5D01232574AF003D4054 /* Articles.framework in Embed Frameworks */, + 513C5D09232574C6003D4054 /* RSParser.framework in Embed Frameworks */, + 513C5D07232574C0003D4054 /* RSDatabase.framework in Embed Frameworks */, + 513C5D0F232574E4003D4054 /* SyncDatabase.framework in Embed Frameworks */, + 513C5D05232574B9003D4054 /* RSCore.framework in Embed Frameworks */, + 513C5D03232574B4003D4054 /* ArticlesDatabase.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; 51C451DF2264C7F200C03939 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -695,6 +756,10 @@ 5127B237222B4849006D641D /* DetailKeyboardShortcuts.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = DetailKeyboardShortcuts.plist; sourceTree = ""; }; 512E08F722688F7C00BDCFDD /* MasterFeedTableViewSectionHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MasterFeedTableViewSectionHeader.swift; sourceTree = ""; }; 512E092B2268B25500BDCFDD /* UISplitViewController-Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UISplitViewController-Extensions.swift"; sourceTree = ""; }; + 513C5CE6232571C2003D4054 /* NetNewsWire Share Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "NetNewsWire Share Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + 513C5CE8232571C2003D4054 /* ShareViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareViewController.swift; sourceTree = ""; }; + 513C5CEB232571C2003D4054 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; + 513C5CED232571C2003D4054 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 5144EA2E2279FAB600D19003 /* AccountsDetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountsDetailViewController.swift; sourceTree = ""; }; 5144EA352279FC3D00D19003 /* AccountsAddLocal.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AccountsAddLocal.xib; sourceTree = ""; }; 5144EA372279FC6200D19003 /* AccountsAddLocalWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsAddLocalWindowController.swift; sourceTree = ""; }; @@ -711,6 +776,9 @@ 515436892291FED9005E1CDF /* FeedbinAccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinAccountViewController.swift; sourceTree = ""; }; 51554BFC228B6EB50055115A /* SyncDatabase.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SyncDatabase.xcodeproj; path = Frameworks/SyncDatabase/SyncDatabase.xcodeproj; sourceTree = SOURCE_ROOT; }; 515ADE3F22E11FAE006B2460 /* SystemMessageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemMessageViewController.swift; sourceTree = ""; }; + 515D4FCB2325815A00EE1167 /* SafariExt.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = SafariExt.js; sourceTree = ""; }; + 515D4FCD2325909200EE1167 /* NetNewsWire.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NetNewsWire.entitlements; sourceTree = ""; }; + 515D4FCE2325B3D000EE1167 /* NetNewsWire_iOSshareextension_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = NetNewsWire_iOSshareextension_target.xcconfig; sourceTree = ""; }; 5183CCCF226E1E880010922C /* NonIntrinsicLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonIntrinsicLabel.swift; sourceTree = ""; }; 5183CCD9226E31A50010922C /* NonIntrinsicImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonIntrinsicImageView.swift; sourceTree = ""; }; 5183CCDC226F1F5C0010922C /* NavigationProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationProgressView.swift; sourceTree = ""; }; @@ -978,6 +1046,22 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 513C5CE3232571C2003D4054 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 513C5D0A232574D2003D4054 /* RSWeb.framework in Frameworks */, + 513C5D0C232574DA003D4054 /* RSTree.framework in Frameworks */, + 513C5CFD2325749A003D4054 /* Account.framework in Frameworks */, + 513C5D00232574AF003D4054 /* Articles.framework in Frameworks */, + 513C5D08232574C6003D4054 /* RSParser.framework in Frameworks */, + 513C5D06232574C0003D4054 /* RSDatabase.framework in Frameworks */, + 513C5D0E232574E4003D4054 /* SyncDatabase.framework in Frameworks */, + 513C5D04232574B9003D4054 /* RSCore.framework in Frameworks */, + 513C5D02232574B4003D4054 /* ArticlesDatabase.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 6581C73020CED60000F4AD34 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1057,6 +1141,17 @@ path = Tree; sourceTree = ""; }; + 513C5CE7232571C2003D4054 /* ShareExtension */ = { + isa = PBXGroup; + children = ( + 513C5CE8232571C2003D4054 /* ShareViewController.swift */, + 513C5CEA232571C2003D4054 /* MainInterface.storyboard */, + 513C5CED232571C2003D4054 /* Info.plist */, + 515D4FCB2325815A00EE1167 /* SafariExt.js */, + ); + path = ShareExtension; + sourceTree = ""; + }; 5144EA39227A377700D19003 /* OPML */ = { isa = PBXGroup; children = ( @@ -1574,6 +1669,7 @@ 849C64571ED37A5D003D8FC0 = { isa = PBXGroup; children = ( + 515D4FCD2325909200EE1167 /* NetNewsWire.entitlements */, 845B14A51FC2299E0013CF92 /* README.md */, 84D2200922B0BC4B0019E085 /* CONTRIBUTING.md */, 84CBDDAE1FD3674C005A61AA /* Technotes */, @@ -1600,6 +1696,7 @@ 849C64711ED37A5D003D8FC0 /* NetNewsWireTests.xctest */, 840D617C2029031C009BC708 /* NetNewsWire.app */, 6581C73320CED60000F4AD34 /* Subscribe to Feed.appex */, + 513C5CE6232571C2003D4054 /* NetNewsWire Share Extension.appex */, ); name = Products; sourceTree = ""; @@ -1818,6 +1915,7 @@ 519D740423243C68008BB345 /* Model Extensions */, 5F3237FF231DF9D000706F6B /* Views */, 5194B5E222B693EC00144881 /* Wrappers */, + 513C5CE7232571C2003D4054 /* ShareExtension */, 84C9FC9A2262A1A900D921D6 /* Resources */, ); path = iOS; @@ -1938,6 +2036,7 @@ D5907CDF2002F0F9005947E5 /* NetNewsWireTests_target.xcconfig */, D519E74722EE553300923F27 /* NetNewsWire_safariextension_target.xcconfig */, 51121AA12265430A00BC0EC1 /* NetNewsWire_iOSapp_target.xcconfig */, + 515D4FCE2325B3D000EE1167 /* NetNewsWire_iOSshareextension_target.xcconfig */, 6543108B2322D90900658221 /* common */, ); path = xcconfig; @@ -1964,6 +2063,24 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 513C5CE5232571C2003D4054 /* NetNewsWire iOS Share Extension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 513C5CFC232571C2003D4054 /* Build configuration list for PBXNativeTarget "NetNewsWire iOS Share Extension" */; + buildPhases = ( + 513C5CE2232571C2003D4054 /* Sources */, + 513C5CE3232571C2003D4054 /* Frameworks */, + 513C5CE4232571C2003D4054 /* Resources */, + 513C5CFF2325749A003D4054 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "NetNewsWire iOS Share Extension"; + productName = "NetNewsWire iOS Share Extension"; + productReference = 513C5CE6232571C2003D4054 /* NetNewsWire Share Extension.appex */; + productType = "com.apple.product-type.app-extension"; + }; 6581C73220CED60000F4AD34 /* Subscribe to Feed */ = { isa = PBXNativeTarget; buildConfigurationList = 6581C75620CED60100F4AD34 /* Build configuration list for PBXNativeTarget "Subscribe to Feed" */; @@ -1989,6 +2106,7 @@ 840D61792029031C009BC708 /* Frameworks */, 840D617A2029031C009BC708 /* Resources */, 51C451DF2264C7F200C03939 /* Embed Frameworks */, + 513C5CF1232571C2003D4054 /* Embed App Extensions */, ); buildRules = ( ); @@ -2002,6 +2120,7 @@ 51C451F72264C83900C03939 /* PBXTargetDependency */, 51C451FB2264C83E00C03939 /* PBXTargetDependency */, 51554C33228B71A10055115A /* PBXTargetDependency */, + 513C5CEF232571C2003D4054 /* PBXTargetDependency */, ); name = "NetNewsWire-iOS"; productName = "NetNewsWire-iOS"; @@ -2064,10 +2183,14 @@ 849C64581ED37A5D003D8FC0 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0930; + LastSwiftUpdateCheck = 1100; LastUpgradeCheck = 0930; ORGANIZATIONNAME = "Ranchero Software"; TargetAttributes = { + 513C5CE5232571C2003D4054 = { + CreatedOnToolsVersion = 11.0; + ProvisioningStyle = Automatic; + }; 6581C73220CED60000F4AD34 = { DevelopmentTeam = SHJK2V3AJG; ProvisioningStyle = Automatic; @@ -2156,6 +2279,7 @@ 849C64701ED37A5D003D8FC0 /* NetNewsWireTests */, 840D617B2029031C009BC708 /* NetNewsWire-iOS */, 6581C73220CED60000F4AD34 /* Subscribe to Feed */, + 513C5CE5232571C2003D4054 /* NetNewsWire iOS Share Extension */, ); }; /* End PBXProject section */ @@ -2304,6 +2428,15 @@ /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ + 513C5CE4232571C2003D4054 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 515D4FCC2325815A00EE1167 /* SafariExt.js in Resources */, + 513C5CEC232571C2003D4054 /* MainInterface.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 6581C73120CED60000F4AD34 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -2436,6 +2569,16 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 513C5CE2232571C2003D4054 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 515D4FC123257A3200EE1167 /* FolderTreeControllerDelegate.swift in Sources */, + 515D4FCA23257CB500EE1167 /* Node-Extensions.swift in Sources */, + 513C5CE9232571C2003D4054 /* ShareViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 6581C72F20CED60000F4AD34 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2712,6 +2855,11 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 513C5CEF232571C2003D4054 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 513C5CE5232571C2003D4054 /* NetNewsWire iOS Share Extension */; + targetProxy = 513C5CEE232571C2003D4054 /* PBXContainerItemProxy */; + }; 51554C27228B71910055115A /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SyncDatabase; @@ -2818,6 +2966,14 @@ name = LaunchScreenPad.storyboard; sourceTree = ""; }; + 513C5CEA232571C2003D4054 /* MainInterface.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 513C5CEB232571C2003D4054 /* Base */, + ); + name = MainInterface.storyboard; + sourceTree = ""; + }; 6581C73B20CED60100F4AD34 /* SafariExtensionViewController.xib */ = { isa = PBXVariantGroup; children = ( @@ -2893,6 +3049,137 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 513C5CF2232571C2003D4054 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 515D4FCE2325B3D000EE1167 /* NetNewsWire_iOSshareextension_target.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = iOS/ShareExtension/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.NetNewsWire-Evergreen.iOS.NetNewsWire-iOS-Share-Extension"; + PRODUCT_NAME = "NetNewsWire Share Extension"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 513C5CF3232571C2003D4054 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 515D4FCE2325B3D000EE1167 /* NetNewsWire_iOSshareextension_target.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = iOS/ShareExtension/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.NetNewsWire-Evergreen.iOS.NetNewsWire-iOS-Share-Extension"; + PRODUCT_NAME = "NetNewsWire Share Extension"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; 6581C74720CED60100F4AD34 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = D519E74722EE553300923F27 /* NetNewsWire_safariextension_target.xcconfig */; @@ -2911,6 +3198,8 @@ isa = XCBuildConfiguration; baseConfigurationReference = 51121AA12265430A00BC0EC1 /* NetNewsWire_iOSapp_target.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_ENTITLEMENTS = NetNewsWire.entitlements; }; name = Debug; }; @@ -2918,6 +3207,8 @@ isa = XCBuildConfiguration; baseConfigurationReference = 51121AA12265430A00BC0EC1 /* NetNewsWire_iOSapp_target.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_ENTITLEMENTS = NetNewsWire.entitlements; }; name = Release; }; @@ -2966,6 +3257,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 513C5CFC232571C2003D4054 /* Build configuration list for PBXNativeTarget "NetNewsWire iOS Share Extension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 513C5CF2232571C2003D4054 /* Debug */, + 513C5CF3232571C2003D4054 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 6581C75620CED60100F4AD34 /* Build configuration list for PBXNativeTarget "Subscribe to Feed" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/iOS/ShareExtension/Base.lproj/MainInterface.storyboard b/iOS/ShareExtension/Base.lproj/MainInterface.storyboard new file mode 100644 index 000000000..286a50894 --- /dev/null +++ b/iOS/ShareExtension/Base.lproj/MainInterface.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iOS/ShareExtension/Info.plist b/iOS/ShareExtension/Info.plist new file mode 100644 index 000000000..2ecaf1743 --- /dev/null +++ b/iOS/ShareExtension/Info.plist @@ -0,0 +1,41 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + $(PRODUCT_NAME) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + NSExtension + + NSExtensionAttributes + + NSExtensionActivationRule + + NSExtensionActivationSupportsWebURLWithMaxCount + 1 + + NSExtensionJavaScriptPreprocessingFile + SafariExt + + NSExtensionMainStoryboard + MainInterface + NSExtensionPointIdentifier + com.apple.share-services + + + diff --git a/iOS/ShareExtension/SafariExt.js b/iOS/ShareExtension/SafariExt.js new file mode 100644 index 000000000..2a2296453 --- /dev/null +++ b/iOS/ShareExtension/SafariExt.js @@ -0,0 +1,12 @@ +var SafariExtPreprocessorClass = function() {}; + +SafariExtPreprocessorClass.prototype = { + + run: function(arguments) { + arguments.completionFunction({ "url": document.URL }); + } + +}; + +// The JavaScript file must contain a global object named "ExtensionPreprocessingJS". +var ExtensionPreprocessingJS = new SafariExtPreprocessorClass; diff --git a/iOS/ShareExtension/ShareViewController.swift b/iOS/ShareExtension/ShareViewController.swift new file mode 100644 index 000000000..7e8bcfbf0 --- /dev/null +++ b/iOS/ShareExtension/ShareViewController.swift @@ -0,0 +1,152 @@ +// +// ShareViewController.swift +// NetNewsWire iOS Share Extension +// +// Created by Maurice Parker on 9/8/19. +// Copyright © 2019 Ranchero Software. All rights reserved. +// + +import UIKit +import MobileCoreServices +import Social +import Account +import Articles +import RSCore +import RSTree + +class ShareViewController: SLComposeServiceViewController { + + private var url: URL? + + override func viewDidLoad() { + + title = "NetNewsWire" + placeholder = "Feed Name (Optional)" + if let button = navigationController?.navigationBar.topItem?.rightBarButtonItem { + button.title = "Add Feed" + button.isEnabled = true + } + + // Hack the bottom table rows to be smaller since the controller itself doesn't have enough sense to size itself correctly + if let nav = self.children.first as? UINavigationController, let tableView = nav.children.first?.view.subviews.first as? UITableView { + tableView.rowHeight = 38 + } + + var provider: NSItemProvider? = nil + + // Try to get any HTML that is maybe passed in + for item in self.extensionContext!.inputItems as! [NSExtensionItem] { + for itemProvider in item.attachments! { + if itemProvider.hasItemConformingToTypeIdentifier(kUTTypePropertyList as String) { + provider = itemProvider + } + } + } + + if provider != nil { + provider!.loadItem(forTypeIdentifier: kUTTypePropertyList as String, options: nil, completionHandler: { [weak self] (pList, error) in + if error != nil { + return + } + guard let dataGraph = pList as? NSDictionary else { + return + } + guard let results = dataGraph["NSExtensionJavaScriptPreprocessingResultsKey"] as? NSDictionary else { + return + } + if let url = URL(string: results["url"] as! String) { + self?.url = url + } + }) + return + } + + // Try to get the URL if it is passed in + for item in self.extensionContext!.inputItems as! [NSExtensionItem] { + for itemProvider in item.attachments! { + if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeURL as String) { + provider = itemProvider + } + } + } + + if provider != nil { + provider!.loadItem(forTypeIdentifier: kUTTypeURL as String, options: nil, completionHandler: { [weak self] (urlCoded, error) in + if error != nil { + return + } + guard let url = urlCoded as? URL else { + return + } + self?.url = url + }) + } + + } + + override func isContentValid() -> Bool { + return url != nil + } + + override func didSelectPost() { + + // Temporarily hardcoded + let account = AccountManager.shared.activeAccounts.first + let container = account! + + let feedName = contentText.isEmpty ? nil : contentText + + account!.createFeed(url: url!.absoluteString, name: feedName, container: container) { result in + + self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil) + + switch result { + case .success(let feed): + break + case .failure(let error): + print(error.localizedDescription) + } + + } + + + + // This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments. + + // Inform the host that we're done, so it un-blocks its UI. Note: Alternatively you could call super's -didSelectPost, which will similarly complete the extension context. + } + + override func configurationItems() -> [Any]! { + + // To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here. + guard let urlItem = SLComposeSheetConfigurationItem() else { return nil } + urlItem.title = "URL" + urlItem.value = url?.absoluteString ?? "" + + guard let folderItem = SLComposeSheetConfigurationItem() else { return nil } + folderItem.title = "Folder" + folderItem.value = "On My iPhone" + folderItem.tapHandler = { + print("Tapped that!") + } + + // Example how you might navigate to a UIViewController with an edit field... + // aliasConfigItem.tapHandler = { + // + // let aliasEditViewController = UIViewController() + // aliasEditViewController.navigationController?.title = "Alias" + // + // let textField = UITextField(frame: CGRectMake(10,10,self.view.frame.width - 50,50)) + // textField.borderStyle = UITextBorderStyle.RoundedRect; + // textField.placeholder = "enter your alias"; + // textField.keyboardType = UIKeyboardType.Default; + // textField.returnKeyType = UIReturnKeyType.Done; + // aliasEditViewController.view.addSubview(textField) + // + // self.pushConfigurationViewController(aliasEditViewController) + // } + + return [folderItem, urlItem] + } + +} diff --git a/xcconfig/NetNewsWire_iOSshareextension_target.xcconfig b/xcconfig/NetNewsWire_iOSshareextension_target.xcconfig new file mode 100644 index 000000000..eb5e32cfd --- /dev/null +++ b/xcconfig/NetNewsWire_iOSshareextension_target.xcconfig @@ -0,0 +1,6 @@ + +#include "./NetNewsWire_iOSapp_target.xcconfig" + +INFOPLIST_FILE = iOS/ShareExtensionExtension/Info.plist +PRODUCT_BUNDLE_IDENTIFIER = com.ranchero.NetNewsWire-Evergreen.iOS.NetNewsWire-iOS-Share-Extension +PRODUCT_NAME = $(TARGET_NAME)