├── assets ├── tik_tok_framed.png └── using-old-method.png ├── ad-container ├── ad-container │ ├── Assets.xcassets │ │ ├── Contents.json │ │ ├── AccentColor.colorset │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── ViewController.h │ ├── AppDelegate.h │ ├── SceneDelegate.h │ ├── main.m │ ├── Info.plist │ ├── AppDelegate.m │ ├── ViewController.m │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ └── SceneDelegate.m └── ad-container.xcodeproj │ ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ ├── xcuserdata │ └── krausefx.xcuserdatad │ │ └── xcschemes │ │ └── xcschememanagement.plist │ └── project.pbxproj ├── .gitignore ├── LICENSE.md ├── README.md └── index.html /assets/tik_tok_framed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/diracdeltas/InAppBrowser.com/master/assets/tik_tok_framed.png -------------------------------------------------------------------------------- /assets/using-old-method.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/diracdeltas/InAppBrowser.com/master/assets/using-old-method.png -------------------------------------------------------------------------------- /ad-container/ad-container/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_STORE 2 | /ad-container/ad-container.xcodeproj/project.xcworkspace/xcuserdata/krausefx.xcuserdatad/UserInterfaceState.xcuserstate 3 | -------------------------------------------------------------------------------- /ad-container/ad-container.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ad-container/ad-container/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /ad-container/ad-container/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // ad-container 4 | // 5 | // Created by Felix Krause on 07.06.22. 6 | // 7 | 8 | #import 9 | 10 | @interface ViewController : UIViewController 11 | 12 | 13 | @end 14 | 15 | -------------------------------------------------------------------------------- /ad-container/ad-container/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // ad-container 4 | // 5 | // Created by Felix Krause on 07.06.22. 6 | // 7 | 8 | #import 9 | 10 | @interface AppDelegate : UIResponder 11 | 12 | 13 | @end 14 | 15 | -------------------------------------------------------------------------------- /ad-container/ad-container/SceneDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.h 3 | // ad-container 4 | // 5 | // Created by Felix Krause on 07.06.22. 6 | // 7 | 8 | #import 9 | 10 | @interface SceneDelegate : UIResponder 11 | 12 | @property (strong, nonatomic) UIWindow * window; 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /ad-container/ad-container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ad-container/ad-container.xcodeproj/xcuserdata/krausefx.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | ad-container.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /ad-container/ad-container/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // ad-container 4 | // 5 | // Created by Felix Krause on 07.06.22. 6 | // 7 | 8 | #import 9 | #import "AppDelegate.h" 10 | 11 | int main(int argc, char * argv[]) { 12 | NSString * appDelegateClassName; 13 | @autoreleasepool { 14 | // Setup code that might create autoreleased objects goes here. 15 | appDelegateClassName = NSStringFromClass([AppDelegate class]); 16 | } 17 | return UIApplicationMain(argc, argv, nil, appDelegateClassName); 18 | } 19 | -------------------------------------------------------------------------------- /ad-container/ad-container/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UIApplicationSceneManifest 6 | 7 | UIApplicationSupportsMultipleScenes 8 | 9 | UISceneConfigurations 10 | 11 | UIWindowSceneSessionRoleApplication 12 | 13 | 14 | UISceneConfigurationName 15 | Default Configuration 16 | UISceneDelegateClassName 17 | SceneDelegate 18 | UISceneStoryboardFile 19 | Main 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Felix Krause 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /ad-container/ad-container/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // ad-container 4 | // 5 | // Created by Felix Krause on 07.06.22. 6 | // 7 | 8 | #import "AppDelegate.h" 9 | 10 | @interface AppDelegate () 11 | 12 | @end 13 | 14 | @implementation AppDelegate 15 | 16 | 17 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 18 | // Override point for customization after application launch. 19 | return YES; 20 | } 21 | 22 | 23 | #pragma mark - UISceneSession lifecycle 24 | 25 | 26 | - (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options { 27 | // Called when a new scene session is being created. 28 | // Use this method to select a configuration to create the new scene with. 29 | return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role]; 30 | } 31 | 32 | 33 | - (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet *)sceneSessions { 34 | // Called when the user discards a scene session. 35 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. 36 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return. 37 | } 38 | 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /ad-container/ad-container/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // ad-container 4 | // 5 | // Created by Felix Krause on 07.06.22. 6 | // 7 | 8 | #import "ViewController.h" 9 | #import 10 | #import 11 | 12 | @interface ViewController () 13 | @property (weak, nonatomic) IBOutlet WKWebView *webView; 14 | 15 | @end 16 | 17 | @implementation ViewController 18 | 19 | - (void)viewDidLoad { 20 | [super viewDidLoad]; 21 | 22 | [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://InAppBrowser.com"] cachePolicy:0 timeoutInterval:0]]; 23 | 24 | dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * 3); 25 | dispatch_after(delay, dispatch_get_main_queue(), ^(void){ 26 | 27 | 28 | [self.webView evaluateJavaScript:@"document.getElementById('usingNewMethod')" 29 | inFrame:nil 30 | inContentWorld:[WKContentWorld defaultClientWorld] 31 | completionHandler:^(id _Nullable something, NSError * _Nullable error) { 32 | NSLog(@"new: %@", something); 33 | }]; 34 | 35 | [self.webView evaluateJavaScript:@"document.getElementById('usingOldMethod')" 36 | completionHandler:^(id _Nullable something, NSError * _Nullable error) { 37 | NSLog(@"old: %@", something); 38 | }]; 39 | }); 40 | } 41 | - (void)viewDidAppear:(BOOL)animated { 42 | [self.webView reload]; 43 | [super viewDidAppear:animated]; 44 | } 45 | 46 | 47 | @end 48 | -------------------------------------------------------------------------------- /ad-container/ad-container/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 | -------------------------------------------------------------------------------- /ad-container/ad-container/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "20x20" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "3x", 11 | "size" : "20x20" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "3x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "40x40" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "scale" : "2x", 36 | "size" : "60x60" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "scale" : "3x", 41 | "size" : "60x60" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "scale" : "1x", 46 | "size" : "20x20" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "scale" : "2x", 51 | "size" : "20x20" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "scale" : "1x", 56 | "size" : "29x29" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "scale" : "2x", 61 | "size" : "29x29" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "scale" : "1x", 66 | "size" : "40x40" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "scale" : "2x", 71 | "size" : "40x40" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "scale" : "2x", 76 | "size" : "76x76" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "scale" : "2x", 81 | "size" : "83.5x83.5" 82 | }, 83 | { 84 | "idiom" : "ios-marketing", 85 | "scale" : "1x", 86 | "size" : "1024x1024" 87 | } 88 | ], 89 | "info" : { 90 | "author" : "xcode", 91 | "version" : 1 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /ad-container/ad-container/SceneDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.m 3 | // ad-container 4 | // 5 | // Created by Felix Krause on 07.06.22. 6 | // 7 | 8 | #import "SceneDelegate.h" 9 | 10 | @interface SceneDelegate () 11 | 12 | @end 13 | 14 | @implementation SceneDelegate 15 | 16 | 17 | - (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions { 18 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. 19 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. 20 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). 21 | } 22 | 23 | 24 | - (void)sceneDidDisconnect:(UIScene *)scene { 25 | // Called as the scene is being released by the system. 26 | // This occurs shortly after the scene enters the background, or when its session is discarded. 27 | // Release any resources associated with this scene that can be re-created the next time the scene connects. 28 | // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). 29 | } 30 | 31 | 32 | - (void)sceneDidBecomeActive:(UIScene *)scene { 33 | // Called when the scene has moved from an inactive state to an active state. 34 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. 35 | } 36 | 37 | 38 | - (void)sceneWillResignActive:(UIScene *)scene { 39 | // Called when the scene will move from an active state to an inactive state. 40 | // This may occur due to temporary interruptions (ex. an incoming phone call). 41 | } 42 | 43 | 44 | - (void)sceneWillEnterForeground:(UIScene *)scene { 45 | // Called as the scene transitions from the background to the foreground. 46 | // Use this method to undo the changes made on entering the background. 47 | } 48 | 49 | 50 | - (void)sceneDidEnterBackground:(UIScene *)scene { 51 | // Called as the scene transitions from the foreground to the background. 52 | // Use this method to save data, release shared resources, and store enough scene-specific state information 53 | // to restore the scene back to its current state. 54 | } 55 | 56 | 57 | @end 58 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # [InAppBrowser.com](https://InAppBrowser.com) 4 | 5 | ## What is this project? 6 | 7 | Please read [this article](https://krausefx.com/blog/announcing-inappbrowsercom-see-what-javascript-commands-get-executed-in-an-in-app-browser) first 8 | 9 | ## How does it work? 10 | 11 | To my knowledge, there is no good way to monitor all JavaScript commands that get executed by the host iOS app ([would love to hear if there is a better way](https://twitter.com/KrauseFx)). 12 | 13 | I created a new, plain HTML file, with some JS code to override some of the `document.` methods: 14 | 15 | ```javascript 16 | document.getElementById = function(a, b) { 17 | appendCommand('document.getElementById("' + a + '")') 18 | return originalGetElementById.apply(this, arguments); 19 | } 20 | ``` 21 | 22 |

View the Source Code here

23 | 24 |

Check out the full announcement

25 | 26 | ## How to use 27 | 28 | Open [InAppBrowser.com](https://InAppBrowser.com) through the iOS/Android app of your choice. For a social media app post the link, or for messengers send the link to yourself, and try opening the page as part of their in-app web browser. 29 | 30 | ## `ad-container` folder 31 | 32 | This folder contains an empty iOS app project, that renders the [`InAppBrowser.com`](InAppBrowser.com) website. 33 | 34 | ```objective-c 35 | [self.webView evaluateJavaScript:@"document.getElementById('usingNewMethod')" 36 | inFrame:nil 37 | inContentWorld:[WKContentWorld defaultClientWorld] 38 | completionHandler:^(id _Nullable something, NSError * _Nullable error) { 39 | NSLog(@"new: %@", something); 40 | }]; 41 | 42 | [self.webView evaluateJavaScript:@"document.getElementById('usingOldMethod')" 43 | copletionHandler:^(id _Nullable something, NSError * _Nullable error) { 44 | NSLog(@"old: %@", something); 45 | }]; 46 | ``` 47 | 48 | The above code uses the new and the old method of running JavaScript code on websites. For more deatils, check out [WKContentWorld](https://developer.apple.com/documentation/webkit/wkcontentworld). 49 | 50 | When you open the InAppBrowser.com website through that app, you can see how only the "usingOldMethod" output is shown, while the "usingNewMethod" output doesn't show up. 51 | 52 | 53 | -------------------------------------------------------------------------------- /ad-container/ad-container/Base.lproj/Main.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 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /ad-container/ad-container.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 55; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | F237CCD5284FB1600041AEB9 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F237CCD4284FB1600041AEB9 /* AppDelegate.m */; }; 11 | F237CCD8284FB1600041AEB9 /* SceneDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F237CCD7284FB1600041AEB9 /* SceneDelegate.m */; }; 12 | F237CCDB284FB1600041AEB9 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F237CCDA284FB1600041AEB9 /* ViewController.m */; }; 13 | F237CCDE284FB1600041AEB9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F237CCDC284FB1600041AEB9 /* Main.storyboard */; }; 14 | F237CCE0284FB1610041AEB9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F237CCDF284FB1610041AEB9 /* Assets.xcassets */; }; 15 | F237CCE3284FB1610041AEB9 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F237CCE1284FB1610041AEB9 /* LaunchScreen.storyboard */; }; 16 | F237CCE6284FB1610041AEB9 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F237CCE5284FB1610041AEB9 /* main.m */; }; 17 | F237CCEE284FB2790041AEB9 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F237CCED284FB2790041AEB9 /* WebKit.framework */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXFileReference section */ 21 | F237CCD0284FB1600041AEB9 /* ad-container.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ad-container.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 22 | F237CCD3284FB1600041AEB9 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 23 | F237CCD4284FB1600041AEB9 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 24 | F237CCD6284FB1600041AEB9 /* SceneDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SceneDelegate.h; sourceTree = ""; }; 25 | F237CCD7284FB1600041AEB9 /* SceneDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SceneDelegate.m; sourceTree = ""; }; 26 | F237CCD9284FB1600041AEB9 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 27 | F237CCDA284FB1600041AEB9 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 28 | F237CCDD284FB1600041AEB9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 29 | F237CCDF284FB1610041AEB9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 30 | F237CCE2284FB1610041AEB9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 31 | F237CCE4284FB1610041AEB9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 32 | F237CCE5284FB1610041AEB9 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 33 | F237CCED284FB2790041AEB9 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; 34 | /* End PBXFileReference section */ 35 | 36 | /* Begin PBXFrameworksBuildPhase section */ 37 | F237CCCD284FB1600041AEB9 /* Frameworks */ = { 38 | isa = PBXFrameworksBuildPhase; 39 | buildActionMask = 2147483647; 40 | files = ( 41 | F237CCEE284FB2790041AEB9 /* WebKit.framework in Frameworks */, 42 | ); 43 | runOnlyForDeploymentPostprocessing = 0; 44 | }; 45 | /* End PBXFrameworksBuildPhase section */ 46 | 47 | /* Begin PBXGroup section */ 48 | F237CCC7284FB1600041AEB9 = { 49 | isa = PBXGroup; 50 | children = ( 51 | F237CCD2284FB1600041AEB9 /* ad-container */, 52 | F237CCD1284FB1600041AEB9 /* Products */, 53 | F237CCEC284FB2790041AEB9 /* Frameworks */, 54 | ); 55 | sourceTree = ""; 56 | }; 57 | F237CCD1284FB1600041AEB9 /* Products */ = { 58 | isa = PBXGroup; 59 | children = ( 60 | F237CCD0284FB1600041AEB9 /* ad-container.app */, 61 | ); 62 | name = Products; 63 | sourceTree = ""; 64 | }; 65 | F237CCD2284FB1600041AEB9 /* ad-container */ = { 66 | isa = PBXGroup; 67 | children = ( 68 | F237CCD3284FB1600041AEB9 /* AppDelegate.h */, 69 | F237CCD4284FB1600041AEB9 /* AppDelegate.m */, 70 | F237CCD6284FB1600041AEB9 /* SceneDelegate.h */, 71 | F237CCD7284FB1600041AEB9 /* SceneDelegate.m */, 72 | F237CCD9284FB1600041AEB9 /* ViewController.h */, 73 | F237CCDA284FB1600041AEB9 /* ViewController.m */, 74 | F237CCDC284FB1600041AEB9 /* Main.storyboard */, 75 | F237CCDF284FB1610041AEB9 /* Assets.xcassets */, 76 | F237CCE1284FB1610041AEB9 /* LaunchScreen.storyboard */, 77 | F237CCE4284FB1610041AEB9 /* Info.plist */, 78 | F237CCE5284FB1610041AEB9 /* main.m */, 79 | ); 80 | path = "ad-container"; 81 | sourceTree = ""; 82 | }; 83 | F237CCEC284FB2790041AEB9 /* Frameworks */ = { 84 | isa = PBXGroup; 85 | children = ( 86 | F237CCED284FB2790041AEB9 /* WebKit.framework */, 87 | ); 88 | name = Frameworks; 89 | sourceTree = ""; 90 | }; 91 | /* End PBXGroup section */ 92 | 93 | /* Begin PBXNativeTarget section */ 94 | F237CCCF284FB1600041AEB9 /* ad-container */ = { 95 | isa = PBXNativeTarget; 96 | buildConfigurationList = F237CCE9284FB1610041AEB9 /* Build configuration list for PBXNativeTarget "ad-container" */; 97 | buildPhases = ( 98 | F237CCCC284FB1600041AEB9 /* Sources */, 99 | F237CCCD284FB1600041AEB9 /* Frameworks */, 100 | F237CCCE284FB1600041AEB9 /* Resources */, 101 | ); 102 | buildRules = ( 103 | ); 104 | dependencies = ( 105 | ); 106 | name = "ad-container"; 107 | productName = "ad-container"; 108 | productReference = F237CCD0284FB1600041AEB9 /* ad-container.app */; 109 | productType = "com.apple.product-type.application"; 110 | }; 111 | /* End PBXNativeTarget section */ 112 | 113 | /* Begin PBXProject section */ 114 | F237CCC8284FB1600041AEB9 /* Project object */ = { 115 | isa = PBXProject; 116 | attributes = { 117 | BuildIndependentTargetsInParallel = 1; 118 | LastUpgradeCheck = 1340; 119 | TargetAttributes = { 120 | F237CCCF284FB1600041AEB9 = { 121 | CreatedOnToolsVersion = 13.4; 122 | }; 123 | }; 124 | }; 125 | buildConfigurationList = F237CCCB284FB1600041AEB9 /* Build configuration list for PBXProject "ad-container" */; 126 | compatibilityVersion = "Xcode 13.0"; 127 | developmentRegion = en; 128 | hasScannedForEncodings = 0; 129 | knownRegions = ( 130 | en, 131 | Base, 132 | ); 133 | mainGroup = F237CCC7284FB1600041AEB9; 134 | productRefGroup = F237CCD1284FB1600041AEB9 /* Products */; 135 | projectDirPath = ""; 136 | projectRoot = ""; 137 | targets = ( 138 | F237CCCF284FB1600041AEB9 /* ad-container */, 139 | ); 140 | }; 141 | /* End PBXProject section */ 142 | 143 | /* Begin PBXResourcesBuildPhase section */ 144 | F237CCCE284FB1600041AEB9 /* Resources */ = { 145 | isa = PBXResourcesBuildPhase; 146 | buildActionMask = 2147483647; 147 | files = ( 148 | F237CCE3284FB1610041AEB9 /* LaunchScreen.storyboard in Resources */, 149 | F237CCE0284FB1610041AEB9 /* Assets.xcassets in Resources */, 150 | F237CCDE284FB1600041AEB9 /* Main.storyboard in Resources */, 151 | ); 152 | runOnlyForDeploymentPostprocessing = 0; 153 | }; 154 | /* End PBXResourcesBuildPhase section */ 155 | 156 | /* Begin PBXSourcesBuildPhase section */ 157 | F237CCCC284FB1600041AEB9 /* Sources */ = { 158 | isa = PBXSourcesBuildPhase; 159 | buildActionMask = 2147483647; 160 | files = ( 161 | F237CCDB284FB1600041AEB9 /* ViewController.m in Sources */, 162 | F237CCD5284FB1600041AEB9 /* AppDelegate.m in Sources */, 163 | F237CCE6284FB1610041AEB9 /* main.m in Sources */, 164 | F237CCD8284FB1600041AEB9 /* SceneDelegate.m in Sources */, 165 | ); 166 | runOnlyForDeploymentPostprocessing = 0; 167 | }; 168 | /* End PBXSourcesBuildPhase section */ 169 | 170 | /* Begin PBXVariantGroup section */ 171 | F237CCDC284FB1600041AEB9 /* Main.storyboard */ = { 172 | isa = PBXVariantGroup; 173 | children = ( 174 | F237CCDD284FB1600041AEB9 /* Base */, 175 | ); 176 | name = Main.storyboard; 177 | sourceTree = ""; 178 | }; 179 | F237CCE1284FB1610041AEB9 /* LaunchScreen.storyboard */ = { 180 | isa = PBXVariantGroup; 181 | children = ( 182 | F237CCE2284FB1610041AEB9 /* Base */, 183 | ); 184 | name = LaunchScreen.storyboard; 185 | sourceTree = ""; 186 | }; 187 | /* End PBXVariantGroup section */ 188 | 189 | /* Begin XCBuildConfiguration section */ 190 | F237CCE7284FB1610041AEB9 /* Debug */ = { 191 | isa = XCBuildConfiguration; 192 | buildSettings = { 193 | ALWAYS_SEARCH_USER_PATHS = NO; 194 | CLANG_ANALYZER_NONNULL = YES; 195 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 196 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; 197 | CLANG_ENABLE_MODULES = YES; 198 | CLANG_ENABLE_OBJC_ARC = YES; 199 | CLANG_ENABLE_OBJC_WEAK = YES; 200 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 201 | CLANG_WARN_BOOL_CONVERSION = YES; 202 | CLANG_WARN_COMMA = YES; 203 | CLANG_WARN_CONSTANT_CONVERSION = YES; 204 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 205 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 206 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 207 | CLANG_WARN_EMPTY_BODY = YES; 208 | CLANG_WARN_ENUM_CONVERSION = YES; 209 | CLANG_WARN_INFINITE_RECURSION = YES; 210 | CLANG_WARN_INT_CONVERSION = YES; 211 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 212 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 213 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 214 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 215 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 216 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 217 | CLANG_WARN_STRICT_PROTOTYPES = YES; 218 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 219 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 220 | CLANG_WARN_UNREACHABLE_CODE = YES; 221 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 222 | COPY_PHASE_STRIP = NO; 223 | DEBUG_INFORMATION_FORMAT = dwarf; 224 | ENABLE_STRICT_OBJC_MSGSEND = YES; 225 | ENABLE_TESTABILITY = YES; 226 | GCC_C_LANGUAGE_STANDARD = gnu11; 227 | GCC_DYNAMIC_NO_PIC = NO; 228 | GCC_NO_COMMON_BLOCKS = YES; 229 | GCC_OPTIMIZATION_LEVEL = 0; 230 | GCC_PREPROCESSOR_DEFINITIONS = ( 231 | "DEBUG=1", 232 | "$(inherited)", 233 | ); 234 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 235 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 236 | GCC_WARN_UNDECLARED_SELECTOR = YES; 237 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 238 | GCC_WARN_UNUSED_FUNCTION = YES; 239 | GCC_WARN_UNUSED_VARIABLE = YES; 240 | IPHONEOS_DEPLOYMENT_TARGET = 15.5; 241 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 242 | MTL_FAST_MATH = YES; 243 | ONLY_ACTIVE_ARCH = YES; 244 | SDKROOT = iphoneos; 245 | }; 246 | name = Debug; 247 | }; 248 | F237CCE8284FB1610041AEB9 /* Release */ = { 249 | isa = XCBuildConfiguration; 250 | buildSettings = { 251 | ALWAYS_SEARCH_USER_PATHS = NO; 252 | CLANG_ANALYZER_NONNULL = YES; 253 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 254 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; 255 | CLANG_ENABLE_MODULES = YES; 256 | CLANG_ENABLE_OBJC_ARC = YES; 257 | CLANG_ENABLE_OBJC_WEAK = YES; 258 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 259 | CLANG_WARN_BOOL_CONVERSION = YES; 260 | CLANG_WARN_COMMA = YES; 261 | CLANG_WARN_CONSTANT_CONVERSION = YES; 262 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 263 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 264 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 265 | CLANG_WARN_EMPTY_BODY = YES; 266 | CLANG_WARN_ENUM_CONVERSION = YES; 267 | CLANG_WARN_INFINITE_RECURSION = YES; 268 | CLANG_WARN_INT_CONVERSION = YES; 269 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 270 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 271 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 272 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 273 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 274 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 275 | CLANG_WARN_STRICT_PROTOTYPES = YES; 276 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 277 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 278 | CLANG_WARN_UNREACHABLE_CODE = YES; 279 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 280 | COPY_PHASE_STRIP = NO; 281 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 282 | ENABLE_NS_ASSERTIONS = NO; 283 | ENABLE_STRICT_OBJC_MSGSEND = YES; 284 | GCC_C_LANGUAGE_STANDARD = gnu11; 285 | GCC_NO_COMMON_BLOCKS = YES; 286 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 287 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 288 | GCC_WARN_UNDECLARED_SELECTOR = YES; 289 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 290 | GCC_WARN_UNUSED_FUNCTION = YES; 291 | GCC_WARN_UNUSED_VARIABLE = YES; 292 | IPHONEOS_DEPLOYMENT_TARGET = 15.5; 293 | MTL_ENABLE_DEBUG_INFO = NO; 294 | MTL_FAST_MATH = YES; 295 | SDKROOT = iphoneos; 296 | VALIDATE_PRODUCT = YES; 297 | }; 298 | name = Release; 299 | }; 300 | F237CCEA284FB1610041AEB9 /* Debug */ = { 301 | isa = XCBuildConfiguration; 302 | buildSettings = { 303 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 304 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 305 | CODE_SIGN_STYLE = Automatic; 306 | CURRENT_PROJECT_VERSION = 1; 307 | GENERATE_INFOPLIST_FILE = YES; 308 | INFOPLIST_FILE = "ad-container/Info.plist"; 309 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 310 | INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; 311 | INFOPLIST_KEY_UIMainStoryboardFile = Main; 312 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 313 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 314 | LD_RUNPATH_SEARCH_PATHS = ( 315 | "$(inherited)", 316 | "@executable_path/Frameworks", 317 | ); 318 | MARKETING_VERSION = 1.0; 319 | PRODUCT_BUNDLE_IDENTIFIER = "test.ad-container"; 320 | PRODUCT_NAME = "$(TARGET_NAME)"; 321 | SWIFT_EMIT_LOC_STRINGS = YES; 322 | TARGETED_DEVICE_FAMILY = "1,2"; 323 | }; 324 | name = Debug; 325 | }; 326 | F237CCEB284FB1610041AEB9 /* Release */ = { 327 | isa = XCBuildConfiguration; 328 | buildSettings = { 329 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 330 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 331 | CODE_SIGN_STYLE = Automatic; 332 | CURRENT_PROJECT_VERSION = 1; 333 | GENERATE_INFOPLIST_FILE = YES; 334 | INFOPLIST_FILE = "ad-container/Info.plist"; 335 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 336 | INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; 337 | INFOPLIST_KEY_UIMainStoryboardFile = Main; 338 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 339 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 340 | LD_RUNPATH_SEARCH_PATHS = ( 341 | "$(inherited)", 342 | "@executable_path/Frameworks", 343 | ); 344 | MARKETING_VERSION = 1.0; 345 | PRODUCT_BUNDLE_IDENTIFIER = "test.ad-container"; 346 | PRODUCT_NAME = "$(TARGET_NAME)"; 347 | SWIFT_EMIT_LOC_STRINGS = YES; 348 | TARGETED_DEVICE_FAMILY = "1,2"; 349 | }; 350 | name = Release; 351 | }; 352 | /* End XCBuildConfiguration section */ 353 | 354 | /* Begin XCConfigurationList section */ 355 | F237CCCB284FB1600041AEB9 /* Build configuration list for PBXProject "ad-container" */ = { 356 | isa = XCConfigurationList; 357 | buildConfigurations = ( 358 | F237CCE7284FB1610041AEB9 /* Debug */, 359 | F237CCE8284FB1610041AEB9 /* Release */, 360 | ); 361 | defaultConfigurationIsVisible = 0; 362 | defaultConfigurationName = Release; 363 | }; 364 | F237CCE9284FB1610041AEB9 /* Build configuration list for PBXNativeTarget "ad-container" */ = { 365 | isa = XCConfigurationList; 366 | buildConfigurations = ( 367 | F237CCEA284FB1610041AEB9 /* Debug */, 368 | F237CCEB284FB1610041AEB9 /* Release */, 369 | ); 370 | defaultConfigurationIsVisible = 0; 371 | defaultConfigurationName = Release; 372 | }; 373 | /* End XCConfigurationList section */ 374 | }; 375 | rootObject = F237CCC8284FB1600041AEB9 /* Project object */; 376 | } 377 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | inAppBrowser.com 5 | 6 |

InAppBrowser.com

7 |

Check if an in-app browser is injecting JavaScript code

8 |

9 | Some iOS and Android apps make use of a custom in-app browser (full details). This causes potential security 10 | and privacy risks to the user. 11 |

12 | 13 |
14 |

✅ This tool couldn't detect any JavaScript injections. However, this doesn't mean there were no code injections. As of iOS 14.3, Apple introduced a new way of running JavaScript code in an "Isolated World", making it impossible for a website to verify 15 | what code is being executed.

16 |

If you opened this website in iOS Safari, or it's being rendered by SFSafariViewController, you are on the safe side when it comes to injecting JavaScript code.

17 |

Please read the Disclaimer below, as well as the full explanation

18 |
19 |
20 |

🕵️‍♂️ Javascript injection detected. This does not necessarily imply malicious behaviour.

21 | However, this doesn't mean there were no other code injections. As of iOS 14.3, Apple introduced a new way of running JavaScript code in an "Isolated World", making it impossible for a website to verify what code is being executed.

22 |

Please read the Disclaimer below, as well as the full explanation

23 |
24 |
25 |

🚨 JavaScript injection detected, with some potentially dangerous commands.

26 |

There might be additional JavaScript commands executed using "Isolated World" JavaScript, which can't be detected on this page.

27 |

Please read the Disclaimer below, as well as the full explanation

28 |
29 |
30 |

✅ It looks like you're opening this page on a third party iOS/Android browser.

31 |

It doesn't really make sense to show the JavaScript commands executed, as the browser needs to run JavaScript commands to offer their features, like a password manager, the print dialog, search on page, and media management

32 |

This page will still show the commands detected by this page, however some mobile browsers already leverage the "Isolated World" JavaScript, which can't be detected by this page

33 |

Please read the Disclaimer below, as well as the full explanation

34 |

Please note that there aren't any meaningful conclusions on the output below for browser apps.

35 |
36 |
37 |
    38 |
39 |
40 | 41 |
42 | The summary above shows a list of things the in-app browser did when you opened this website. However, there might be other things happening as well. The raw output below should be carefully studied to better understand what's happening. 43 |
44 | 45 |
    46 |
    Detected JavaScript Commands:
    47 |
48 | 49 |
50 |

Disclaimer: This tool works by overriding the most common JavaScript functions, however the host app may still inject other commands. As of iOS 14.3, Apple introduced a new way of running JavaScript code in an "Isolated World", making it impossible for a website to verify what code is being executed. Also this tool cannot detect other app tracking that may occur, such as custom gesture recognition, 52 | screenshot detection, or tracking of web request events.

53 |

Important: Before jumping to any conclusions, please read this post.

54 |
55 | 56 | 66 | 67 | 312 | 313 | 506 | --------------------------------------------------------------------------------