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/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]; 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 + 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; 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 diff --git a/SVWebViewController/.gitignore b/SVWebViewController/.gitignore new file mode 100644 index 0000000..b25c15b --- /dev/null +++ b/SVWebViewController/.gitignore @@ -0,0 +1 @@ +*~ 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]; diff --git a/SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox-iPad.png b/SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox-iPad.png new file mode 100644 index 0000000..56fb64f Binary files /dev/null and b/SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox-iPad.png differ diff --git a/SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox-iPad@2x.png b/SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox-iPad@2x.png new file mode 100644 index 0000000..e1b047d Binary files /dev/null and b/SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox-iPad@2x.png differ 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 0000000..7649752 Binary files /dev/null and b/SVWebViewController/UIActivities/Firefox/SVWebViewControllerActivityFirefox@2x.png differ 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";