From 7f79e20807183a988172b42b59aee469d5e2a203 Mon Sep 17 00:00:00 2001 From: Richard Newman Date: Mon, 16 Nov 2015 13:04:32 -0800 Subject: [PATCH 1/8] .gitignore. --- .gitignore | 3 +++ SVWebViewController/.gitignore | 1 + 2 files changed, 4 insertions(+) create mode 100644 SVWebViewController/.gitignore diff --git a/.gitignore b/.gitignore index 630bd0b..5321c02 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,6 @@ build/ # Cocoapods Pods + +# Editor. +*~ diff --git a/SVWebViewController/.gitignore b/SVWebViewController/.gitignore new file mode 100644 index 0000000..b25c15b --- /dev/null +++ b/SVWebViewController/.gitignore @@ -0,0 +1 @@ +*~ From e671531158a5f6455acb6f61ef5f45ca881680c2 Mon Sep 17 00:00:00 2001 From: Richard Newman Date: Mon, 16 Nov 2015 13:36:50 -0800 Subject: [PATCH 2/8] Use https://archive.org for the demo app's web view, because plain http loads are no longer permitted. --- Demo/Classes/ViewController.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Demo/Classes/ViewController.m b/Demo/Classes/ViewController.m index a074f4d..ac64922 100644 --- a/Demo/Classes/ViewController.m +++ b/Demo/Classes/ViewController.m @@ -14,14 +14,14 @@ @implementation ViewController - (void)pushWebViewController { - NSURL *URL = [NSURL URLWithString:@"http://samvermette.com"]; + NSURL *URL = [NSURL URLWithString:@"https://archive.org"]; SVWebViewController *webViewController = [[SVWebViewController alloc] initWithURL:URL]; [self.navigationController pushViewController:webViewController animated:YES]; } - (void)presentWebViewController { - NSURL *URL = [NSURL URLWithString:@"http://samvermette.com"]; + NSURL *URL = [NSURL URLWithString:@"https://archive.org"]; SVModalWebViewController *webViewController = [[SVModalWebViewController alloc] initWithURL:URL]; webViewController.modalPresentationStyle = UIModalPresentationPageSheet; [self presentViewController:webViewController animated:YES completion:NULL]; From 3460d69c13190ade70413ae96e457dddbd0a71f6 Mon Sep 17 00:00:00 2001 From: Richard Newman Date: Mon, 16 Nov 2015 13:37:07 -0800 Subject: [PATCH 3/8] List the URL schemes that the demo app queries in its Info.plist. --- Demo/SVWeb-Info.plist | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Demo/SVWeb-Info.plist b/Demo/SVWeb-Info.plist index 44be994..a3443f4 100644 --- a/Demo/SVWeb-Info.plist +++ b/Demo/SVWeb-Info.plist @@ -28,5 +28,11 @@ MainWindow NSMainNibFile~ipad MainWindow-iPad + LSApplicationQueriesSchemes + + firefox + googlechrome + googlechromes + From 7936c9d5d6b2fd640b19b4c70ca47b76737dee67 Mon Sep 17 00:00:00 2001 From: Richard Newman Date: Mon, 16 Nov 2015 13:05:11 -0800 Subject: [PATCH 4/8] Add strings for Open in Firefox. --- SVWebViewController/da.lproj/SVWebViewController.strings | 3 ++- SVWebViewController/de.lproj/SVWebViewController.strings | 3 ++- SVWebViewController/en.lproj/SVWebViewController.strings | 3 ++- SVWebViewController/es-ES.lproj/SVWebViewController.strings | 3 ++- SVWebViewController/es.lproj/SVWebViewController.strings | 3 ++- SVWebViewController/fr.lproj/SVWebViewController.strings | 3 ++- SVWebViewController/ja.lproj/SVWebViewController.strings | 1 + SVWebViewController/pt.lproj/SVWebViewController.strings | 3 ++- SVWebViewController/zh-Hans.lproj/SVWebViewController.strings | 1 + SVWebViewController/zh-Hant.lproj/SVWebViewController.strings | 3 ++- 10 files changed, 18 insertions(+), 8 deletions(-) diff --git a/SVWebViewController/da.lproj/SVWebViewController.strings b/SVWebViewController/da.lproj/SVWebViewController.strings index 56b673e..ea1604b 100644 --- a/SVWebViewController/da.lproj/SVWebViewController.strings +++ b/SVWebViewController/da.lproj/SVWebViewController.strings @@ -1,5 +1,6 @@ // Copyright (c) 2013 Anders Fogh Eriksen "Open in Safari" = "Åbn i Safari"; "Open in Chrome" = "Åbn i Chrome"; +"Open in Firefox" = "Åbn i Firefox"; "Copy Link" = "Kopier Link"; -"Mail Link to this Page" = "Mail Link til denne side"; \ No newline at end of file +"Mail Link to this Page" = "Mail Link til denne side"; diff --git a/SVWebViewController/de.lproj/SVWebViewController.strings b/SVWebViewController/de.lproj/SVWebViewController.strings index 71ee711..cb79451 100644 --- a/SVWebViewController/de.lproj/SVWebViewController.strings +++ b/SVWebViewController/de.lproj/SVWebViewController.strings @@ -1,2 +1,3 @@ "Open in Safari" = "In Safari öffnen"; -"Open in Chrome" = "In Chrome öffnen"; \ No newline at end of file +"Open in Chrome" = "In Chrome öffnen"; +"Open in Firefox" = "In Firefox öffnen"; diff --git a/SVWebViewController/en.lproj/SVWebViewController.strings b/SVWebViewController/en.lproj/SVWebViewController.strings index 77fdeb3..012388e 100644 --- a/SVWebViewController/en.lproj/SVWebViewController.strings +++ b/SVWebViewController/en.lproj/SVWebViewController.strings @@ -1,3 +1,4 @@ // Copyright (c) 2013 Alex Ruperez "Open in Safari" = "Open in Safari"; -"Open in Chrome" = "Open in Chrome"; \ No newline at end of file +"Open in Chrome" = "Open in Chrome"; +"Open in Firefox" = "Open in Firefox"; diff --git a/SVWebViewController/es-ES.lproj/SVWebViewController.strings b/SVWebViewController/es-ES.lproj/SVWebViewController.strings index 1021f64..0e0f7f2 100644 --- a/SVWebViewController/es-ES.lproj/SVWebViewController.strings +++ b/SVWebViewController/es-ES.lproj/SVWebViewController.strings @@ -1,3 +1,4 @@ // Copyright (c) 2013 Alex Ruperez "Open in Safari" = "Abrir en Safari"; -"Open in Chrome" = "Abrir en Chrome"; \ No newline at end of file +"Open in Chrome" = "Abrir en Chrome"; +"Open in Firefox" = "Abrir en Firefox"; diff --git a/SVWebViewController/es.lproj/SVWebViewController.strings b/SVWebViewController/es.lproj/SVWebViewController.strings index 1021f64..0e0f7f2 100644 --- a/SVWebViewController/es.lproj/SVWebViewController.strings +++ b/SVWebViewController/es.lproj/SVWebViewController.strings @@ -1,3 +1,4 @@ // Copyright (c) 2013 Alex Ruperez "Open in Safari" = "Abrir en Safari"; -"Open in Chrome" = "Abrir en Chrome"; \ No newline at end of file +"Open in Chrome" = "Abrir en Chrome"; +"Open in Firefox" = "Abrir en Firefox"; diff --git a/SVWebViewController/fr.lproj/SVWebViewController.strings b/SVWebViewController/fr.lproj/SVWebViewController.strings index 6fff9d7..1ae2b17 100644 --- a/SVWebViewController/fr.lproj/SVWebViewController.strings +++ b/SVWebViewController/fr.lproj/SVWebViewController.strings @@ -1,3 +1,4 @@ // Copyright (c) 2013 Benjamin Michotte "Open in Safari" = "Ouvrir dans Safari"; -"Open in Chrome" = "Ouvrir dans Chrome"; \ No newline at end of file +"Open in Chrome" = "Ouvrir dans Chrome"; +"Open in Firefox" = "Ouvrir dans Firefox"; diff --git a/SVWebViewController/ja.lproj/SVWebViewController.strings b/SVWebViewController/ja.lproj/SVWebViewController.strings index 2dd560b..e5af636 100644 --- a/SVWebViewController/ja.lproj/SVWebViewController.strings +++ b/SVWebViewController/ja.lproj/SVWebViewController.strings @@ -1,2 +1,3 @@ "Open in Safari" = "Safariで開く"; "Open in Chrome" = "Chromeで開く"; +"Open in Firefox" = "Firefoxで開く"; diff --git a/SVWebViewController/pt.lproj/SVWebViewController.strings b/SVWebViewController/pt.lproj/SVWebViewController.strings index 4857973..944565a 100644 --- a/SVWebViewController/pt.lproj/SVWebViewController.strings +++ b/SVWebViewController/pt.lproj/SVWebViewController.strings @@ -1,2 +1,3 @@ "Open in Safari" = "Abrir no Safari"; -"Open in Chrome" = "Abrir no Chrome"; \ No newline at end of file +"Open in Chrome" = "Abrir no Chrome"; +"Open in Firefox" = "Abrir no Firefox"; diff --git a/SVWebViewController/zh-Hans.lproj/SVWebViewController.strings b/SVWebViewController/zh-Hans.lproj/SVWebViewController.strings index 5926fea..1d6924a 100644 --- a/SVWebViewController/zh-Hans.lproj/SVWebViewController.strings +++ b/SVWebViewController/zh-Hans.lproj/SVWebViewController.strings @@ -1,6 +1,7 @@ // Copyright (c) 2013 James Stout "Open in Safari" = "在Safari中打开"; "Open in Chrome" = "在Chrome中打开"; +"Open in Firefox" = "在Firefox中打开"; "Copy Link" = "复制网页链接"; "Mail Link to this Page" = "以电邮传送此页链接"; "Cancel"="取消"; diff --git a/SVWebViewController/zh-Hant.lproj/SVWebViewController.strings b/SVWebViewController/zh-Hant.lproj/SVWebViewController.strings index af4f4a4..af1180c 100644 --- a/SVWebViewController/zh-Hant.lproj/SVWebViewController.strings +++ b/SVWebViewController/zh-Hant.lproj/SVWebViewController.strings @@ -1,3 +1,4 @@ // Copyright (c) 2013 James Stout "Open in Safari" = "打開Safari"; -"Open in Chrome" = "打開Chrome"; \ No newline at end of file +"Open in Chrome" = "打開Chrome"; +"Open in Firefox" = "打開Firefox"; From d2454003fe3441c39862f7ba2f53114bbe862f10 Mon Sep 17 00:00:00 2001 From: Richard Newman Date: Mon, 16 Nov 2015 13:05:37 -0800 Subject: [PATCH 5/8] Add SVWebViewControllerActivityFirefox and icons. --- ...VWebViewControllerActivityFirefox-iPad.png | Bin 0 -> 29965 bytes ...bViewControllerActivityFirefox-iPad@2x.png | Bin 0 -> 32052 bytes .../SVWebViewControllerActivityFirefox.h | 9 ++++ .../SVWebViewControllerActivityFirefox.m | 50 ++++++++++++++++++ .../SVWebViewControllerActivityFirefox@2x.png | Bin 0 -> 31193 bytes 5 files changed, 59 insertions(+) create mode 100644 SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox-iPad.png create mode 100644 SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox-iPad@2x.png create mode 100644 SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox.h create mode 100644 SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox.m create mode 100644 SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox@2x.png diff --git a/SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox-iPad.png b/SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox-iPad.png new file mode 100644 index 0000000000000000000000000000000000000000..56fb64ff22d866d743fb17c02be69bc65fd4a4c5 GIT binary patch literal 29965 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 literal 0 HcmV?d00001 diff --git a/SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox.h b/SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox.h new file mode 100644 index 0000000..a006e51 --- /dev/null +++ b/SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox.h @@ -0,0 +1,9 @@ +// Copyright 2013 Sam Vermette. All rights reserved. +// +// https://github.com/samvermette/SVWebViewController + +#import "SVWebViewControllerActivity.h" + +@interface SVWebViewControllerActivityFirefox : SVWebViewControllerActivity + +@end diff --git a/SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox.m b/SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox.m new file mode 100644 index 0000000..81a6ab4 --- /dev/null +++ b/SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox.m @@ -0,0 +1,50 @@ +// Created by Sam Vermette on 11 Nov, 2013. +// Copyright 2013 Sam Vermette. All rights reserved. +// +// https://github.com/samvermette/SVWebViewController + +#import "SVWebViewControllerActivityFirefox.h" + +@implementation SVWebViewControllerActivityFirefox + +- (NSString *)activityTitle { + return NSLocalizedStringFromTable(@"Open in Firefox", @"SVWebViewController", nil); +} + +- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems { + for (id activityItem in activityItems) { + if ([activityItem isKindOfClass:[NSURL class]] && [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"firefox://"]]) { + return YES; + } + } + return NO; +} + +static NSString *encodeByAddingPercentEscapes(NSString *string) { + NSString *encodedString = (NSString *)CFBridgingRelease + (CFURLCreateStringByAddingPercentEscapes + (kCFAllocatorDefault, + (CFStringRef)string, + NULL, + (CFStringRef)@"!*'();:@&=+$,/?%#[]", + kCFStringEncodingUTF8)); + return encodedString; +} + +- (void)performActivity { + NSURL *inputURL = self.URLToOpen; + NSString *scheme = inputURL.scheme; + + if (![scheme isEqualToString:@"http"] && ![scheme isEqualToString:@"https"]) { + return; + } + + NSString *urlString = [inputURL absoluteString]; + NSString *firefoxURLString = [NSString stringWithFormat: @"firefox://open-url?url=%@", encodeByAddingPercentEscapes(urlString)]; + NSURL *firefoxURL = [NSURL URLWithString: firefoxURLString]; + + // Open the URL with Firefox. + [[UIApplication sharedApplication] openURL:firefoxURL]; +} + +@end diff --git a/SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox@2x.png b/SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..764975237c1593890ccac414d5d0febdf2a3062a GIT binary patch literal 31193 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 literal 0 HcmV?d00001 From 1a77d065db829411a74d38f8e248efb665e996f0 Mon Sep 17 00:00:00 2001 From: Richard Newman Date: Mon, 16 Nov 2015 13:06:04 -0800 Subject: [PATCH 6/8] Add Firefox to activity list. --- SVWebViewController/SVWebViewController.m | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/SVWebViewController/SVWebViewController.m b/SVWebViewController/SVWebViewController.m index b9b2aea..39b162b 100644 --- a/SVWebViewController/SVWebViewController.m +++ b/SVWebViewController/SVWebViewController.m @@ -8,6 +8,7 @@ #import "SVWebViewControllerActivityChrome.h" #import "SVWebViewControllerActivitySafari.h" +#import "SVWebViewControllerActivityFirefox.h" #import "SVWebViewController.h" @interface SVWebViewController () @@ -281,7 +282,11 @@ - (void)stopTapped:(UIBarButtonItem *)sender { - (void)actionButtonTapped:(id)sender { NSURL *url = self.webView.request.URL ? self.webView.request.URL : self.request.URL; if (url != nil) { - NSArray *activities = @[[SVWebViewControllerActivitySafari new], [SVWebViewControllerActivityChrome new]]; + NSArray *activities = @[ + [SVWebViewControllerActivitySafari new], + [SVWebViewControllerActivityChrome new], + [SVWebViewControllerActivityFirefox new] + ]; if ([[url absoluteString] hasPrefix:@"file:///"]) { UIDocumentInteractionController *dc = [UIDocumentInteractionController interactionControllerWithURL:url]; From 1e3df7c8c9387f36c128d71b10ba63d5ab796cb2 Mon Sep 17 00:00:00 2001 From: Richard Newman Date: Mon, 16 Nov 2015 13:11:18 -0800 Subject: [PATCH 7/8] Add Firefox to Demo project. --- Demo/SVWeb.xcodeproj/project.pbxproj | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/Demo/SVWeb.xcodeproj/project.pbxproj b/Demo/SVWeb.xcodeproj/project.pbxproj index 9072982..539475a 100755 --- a/Demo/SVWeb.xcodeproj/project.pbxproj +++ b/Demo/SVWeb.xcodeproj/project.pbxproj @@ -28,6 +28,10 @@ 28AD73600D9D9599002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD735F0D9D9599002E5188 /* MainWindow.xib */; }; 28C286E10D94DF7D0034E888 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28C286E00D94DF7D0034E888 /* ViewController.m */; }; 28F335F11007B36200424DE2 /* ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28F335F01007B36200424DE2 /* ViewController.xib */; }; + 28FBEDBB1BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 28FBEDB61BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox-iPad.png */; }; + 28FBEDBC1BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox-iPad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 28FBEDB71BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox-iPad@2x.png */; }; + 28FBEDBD1BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox.m in Sources */ = {isa = PBXBuildFile; fileRef = 28FBEDB91BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox.m */; }; + 28FBEDBE1BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 28FBEDBA1BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox@2x.png */; }; D53D8F1316A8688600711E30 /* SVWebViewController.strings in Resources */ = {isa = PBXBuildFile; fileRef = D53D8F1516A8688600711E30 /* SVWebViewController.strings */; }; D5FA63C516A8707A0087531C /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D5FA63C416A8707A0087531C /* Default-568h@2x.png */; }; /* End PBXBuildFile section */ @@ -65,6 +69,11 @@ 28C286DF0D94DF7D0034E888 /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 28C286E00D94DF7D0034E888 /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 28F335F01007B36200424DE2 /* ViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ViewController.xib; path = ../ViewController.xib; sourceTree = ""; }; + 28FBEDB61BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "SVWebViewControllerActivityFirefox-iPad.png"; sourceTree = ""; }; + 28FBEDB71BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox-iPad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "SVWebViewControllerActivityFirefox-iPad@2x.png"; sourceTree = ""; }; + 28FBEDB81BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVWebViewControllerActivityFirefox.h; sourceTree = ""; }; + 28FBEDB91BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVWebViewControllerActivityFirefox.m; sourceTree = ""; }; + 28FBEDBA1BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "SVWebViewControllerActivityFirefox@2x.png"; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 431F485D17145A510045AA32 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/SVWebViewController.strings; sourceTree = ""; }; 627D469418D9EA4300E514BB /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/SVWebViewController.strings; sourceTree = ""; }; @@ -162,12 +171,25 @@ children = ( 22DBB6681831E05D0008887C /* SVWebViewControllerActivity.h */, 22DBB6691831E05D0008887C /* SVWebViewControllerActivity.m */, + 28FBEDB51BFA7DC300BD2A8A /* Firefox */, 22AAF0B01831F52F00AB15C4 /* Safari */, 22AAF0AA1831F52F00AB15C4 /* Chrome */, ); path = UIActivities; sourceTree = ""; }; + 28FBEDB51BFA7DC300BD2A8A /* Firefox */ = { + isa = PBXGroup; + children = ( + 28FBEDB61BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox-iPad.png */, + 28FBEDB71BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox-iPad@2x.png */, + 28FBEDB81BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox.h */, + 28FBEDB91BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox.m */, + 28FBEDBA1BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox@2x.png */, + ); + path = Firefox; + sourceTree = ""; + }; 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( @@ -287,6 +309,7 @@ buildActionMask = 2147483647; files = ( 28AD73600D9D9599002E5188 /* MainWindow.xib in Resources */, + 28FBEDBC1BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox-iPad@2x.png in Resources */, 22AAF0BA1831F52F00AB15C4 /* SVWebViewControllerActivitySafari-iPad.png in Resources */, 22AAF0BB1831F52F00AB15C4 /* SVWebViewControllerActivitySafari-iPad@2x.png in Resources */, 22AAF0B71831F52F00AB15C4 /* SVWebViewControllerActivityChrome-iPad@2x.png in Resources */, @@ -297,8 +320,10 @@ 22AAF0BD1831F52F00AB15C4 /* SVWebViewControllerActivitySafari@2x.png in Resources */, 22AAF0BF1831F5B300AB15C4 /* README.md in Resources */, D53D8F1316A8688600711E30 /* SVWebViewController.strings in Resources */, + 28FBEDBE1BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox@2x.png in Resources */, 22AAF0B91831F52F00AB15C4 /* SVWebViewControllerActivityChrome@2x.png in Resources */, D5FA63C516A8707A0087531C /* Default-568h@2x.png in Resources */, + 28FBEDBB1BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox-iPad.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -316,6 +341,7 @@ 221C80AF13BBDA2F005F0AB8 /* SVWebViewController.m in Sources */, 22F087701458794B003ECD31 /* SVModalWebViewController.m in Sources */, 22AAF0B81831F52F00AB15C4 /* SVWebViewControllerActivityChrome.m in Sources */, + 28FBEDBD1BFA7DC300BD2A8A /* SVWebViewControllerActivityFirefox.m in Sources */, 22AAF0BC1831F52F00AB15C4 /* SVWebViewControllerActivitySafari.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; From 622a89437bf685cc5930290bdf141cc0fb587b2e Mon Sep 17 00:00:00 2001 From: Richard Newman Date: Mon, 16 Nov 2015 13:07:57 -0800 Subject: [PATCH 8/8] Update README to mention Firefox. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6e69359..4b79bb7 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ SVWebViewController is a simple inline browser for your iOS 7 app. * iPhone and iPad distinct UIs * full landscape orientation support * back, forward, stop/refresh and share buttons -* Open in Safari and Chrome UIActivities +* Open in Safari, Firefox, and Chrome UIActivities * navbar title set to the currently visible web page * talks with `setNetworkActivityIndicatorVisible` @@ -44,7 +44,7 @@ SVModalWebViewController *webViewController = [[SVModalWebViewController alloc] ### SVWebViewControllerActivity -Starting in iOS 6 Apple uses `UIActivity` to let you show additional sharing methods in share sheets. `SVWebViewController` comes with "Open in Safari" and "Open in Chrome" activities. You can easily add your own activity by subclassing `SVWebViewControllerActivity` which takes care of a few things automatically for you. Have a look at the Safari and Chrome activities for implementation examples. Feel free to send it as a pull request once you're done! +Starting in iOS 6 Apple uses `UIActivity` to let you show additional sharing methods in share sheets. `SVWebViewController` comes with "Open in Safari", "Open in Firefox", and "Open in Chrome" activities. You can easily add your own activity by subclassing `SVWebViewControllerActivity` which takes care of a few things automatically for you. Have a look at the Safari, Firefox, and Chrome activities for implementation examples. Feel free to send it as a pull request once you're done! ## Credits