├── .gitignore ├── LICENSE.txt ├── LLInstalledApps.h ├── LLInstalledApps.m ├── README.md ├── iOSInstalledApps.xcodeproj └── project.pbxproj └── iOSInstalledApps ├── LLAppDelegate.h ├── LLAppDelegate.m ├── LLDetailViewController.h ├── LLDetailViewController.m ├── LLMasterViewController.h ├── LLMasterViewController.m ├── en.lproj ├── InfoPlist.strings ├── MainStoryboard_iPad.storyboard └── MainStoryboard_iPhone.storyboard ├── iOSInstalledApps-Info.plist ├── iOSInstalledApps-Prefix.pch └── main.m /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | build/* 3 | *.pbxuser 4 | !default.pbxuser 5 | *.mode1v3 6 | !default.mode1v3 7 | *.mode2v3 8 | !default.mode2v3 9 | *.perspectivev3 10 | !default.perspectivev3 11 | *.xcworkspace 12 | !default.xcworkspace 13 | xcuserdata 14 | profile 15 | *.moved-aside 16 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012 Aravind Krishnaswamy. All rights reserved. 2 | 3 | Redistribution and use in source and binary forms, with or without 4 | modification, are permitted provided that the following conditions are met: 5 | 6 | Redistributions of source code must retain the above copyright notice, this 7 | list of conditions and the following disclaimer. 8 | 9 | Redistributions in binary form must reproduce the above copyright notice, this 10 | list of conditions and the following disclaimer in the documentation and/or 11 | other materials provided with the distribution. 12 | 13 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 14 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 15 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 17 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 19 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 20 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 21 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 22 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 | -------------------------------------------------------------------------------- /LLInstalledApps.h: -------------------------------------------------------------------------------- 1 | // 2 | // LLInstalledApps.h 3 | // iOSInstalledApps 4 | // 5 | // Created by Aravind Krishnaswamy on 02/09/12. 6 | // Copyright (c) 2012 Aravind Krishnaswamy. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface LLInstalledApps : NSObject 12 | 13 | + (NSArray *) runningApps; 14 | - (BOOL) appsInstalledWithScheme:(NSString *)applicationScheme; 15 | + (NSDictionary *) appsInstalledWithSchemes:(NSArray *)applicationSchemes; 16 | + (NSDictionary* ) appsInstalledWithSchemes:(NSArray *)applicationSchemes withProgressCallback:(void (^)(id))callbackBlock; 17 | + (NSArray* ) appsInstalledWithSchemes:(NSArray *)applicationSchemes withProgressCallback:(void (^)(id))callbackBlock maxSize:(int) maxSize; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /LLInstalledApps.m: -------------------------------------------------------------------------------- 1 | // 2 | // LLInstalledApps.m 3 | // iOSInstalledApps 4 | // 5 | // Created by Aravind Krishnaswamy on 02/09/12. 6 | // Copyright (c) 2012 Aravind Krishnaswamy. All rights reserved. 7 | // 8 | 9 | #import "LLInstalledApps.h" 10 | #import 11 | 12 | @implementation LLInstalledApps 13 | 14 | static LLInstalledApps *singleton= nil; 15 | 16 | + (LLInstalledApps *)sharedInstance 17 | { 18 | if (singleton == nil) { 19 | singleton = [[LLInstalledApps alloc] init]; 20 | } 21 | return singleton; 22 | } 23 | 24 | - (NSArray *) _sysctl_ps { 25 | 26 | int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0}; 27 | size_t miblen = 4; 28 | size_t size; 29 | int st = sysctl(mib, miblen, NULL, &size, NULL, 0); 30 | struct kinfo_proc * process = NULL; 31 | struct kinfo_proc * newprocess = NULL; 32 | 33 | do { 34 | size += size / 10; 35 | newprocess = realloc(process, size); 36 | if (!newprocess){ 37 | if (process){ 38 | free(process); 39 | } 40 | return nil; 41 | } 42 | process = newprocess; 43 | st = sysctl(mib, miblen, process, &size, NULL, 0); 44 | } while (st == -1 && errno == ENOMEM); 45 | 46 | if (st == 0){ 47 | if (size % sizeof(struct kinfo_proc) == 0){ 48 | int nprocess = size / sizeof(struct kinfo_proc); 49 | if (nprocess){ 50 | NSMutableArray * array = [[NSMutableArray alloc] init]; 51 | for (int i = nprocess - 1; i >= 0; i--){ 52 | NSString * processID = [[NSString alloc] initWithFormat:@"%d", process[i].kp_proc.p_pid]; 53 | NSString * processName = [[NSString alloc] initWithFormat:@"%s", process[i].kp_proc.p_comm]; 54 | NSDictionary * dict = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:processID, processName, nil] forKeys:[NSArray arrayWithObjects:@"ProcessID", @"ProcessName", nil]]; 55 | [array addObject:dict]; 56 | } 57 | free(process); 58 | return array; 59 | } 60 | } 61 | } 62 | 63 | return nil; 64 | } 65 | 66 | + (NSArray *) runningApps{ 67 | 68 | NSArray* foo = [[LLInstalledApps sharedInstance] _sysctl_ps]; 69 | assert(foo); 70 | NSMutableArray* processes = [NSMutableArray array]; 71 | for (NSDictionary* spam in foo) { 72 | [processes addObject:[spam objectForKey:@"ProcessName"]]; 73 | } 74 | return [NSArray arrayWithArray:processes]; 75 | } 76 | 77 | - (BOOL) appsInstalledWithScheme:(NSString *)applicationScheme { 78 | return [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:applicationScheme]]; 79 | } 80 | 81 | 82 | + (NSDictionary* ) appsInstalledWithSchemes:(NSArray *)applicationSchemes { 83 | LLInstalledApps* instance = [LLInstalledApps sharedInstance]; 84 | NSMutableDictionary* dict = [@{} mutableCopy]; 85 | for (NSString* scheme in applicationSchemes) { 86 | [dict setObject:[NSNumber numberWithBool: 87 | [instance appsInstalledWithScheme:scheme]] 88 | forKey:scheme]; 89 | } 90 | return dict; 91 | } 92 | 93 | + (NSDictionary* ) appsInstalledWithSchemes:(NSArray *)applicationSchemes withProgressCallback:(void (^)(id))callbackBlock{ 94 | LLInstalledApps* instance = [LLInstalledApps sharedInstance]; 95 | NSMutableDictionary* dict = [@{} mutableCopy]; 96 | 97 | [applicationSchemes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 98 | NSString* scheme = obj; 99 | [dict setObject:[NSNumber numberWithBool: 100 | [instance appsInstalledWithScheme:scheme]] 101 | forKey:scheme]; 102 | callbackBlock([NSNumber numberWithInteger:idx]); 103 | }]; 104 | return dict; 105 | } 106 | 107 | + (NSArray* ) appsInstalledWithSchemes:(NSArray *)applicationSchemes withProgressCallback:(void (^)(id))callbackBlock maxSize:(int) maxSize{ 108 | LLInstalledApps* instance = [LLInstalledApps sharedInstance]; 109 | NSMutableArray* installed_schemes = [@[] mutableCopy]; 110 | 111 | [applicationSchemes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 112 | NSString* scheme = obj; 113 | if([installed_schemes count]>maxSize){ 114 | *stop=YES; 115 | return; 116 | } 117 | if ([instance appsInstalledWithScheme:scheme]) { 118 | [installed_schemes addObject:scheme]; 119 | } 120 | callbackBlock([NSNumber numberWithInteger:idx]); 121 | }]; 122 | return installed_schemes; 123 | } 124 | 125 | 126 | 127 | @end 128 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #iOSInstalledApps 2 | 3 | Utility functions to fetch installed apps on iOS by a combination of reading running processes & investigating custom URL schemes implemented. 4 | 5 | ## Background 6 | 7 | Unlike Android & other mobile operating systems, iOS doesnt let you query for a list of installed applications. Developers have had to resort to circumventing this by a few techniques: 8 | 9 | * reading running processes & maintaining a map to their iTunes data 10 | * examining whether it is possible to launch an installed iOS app via the custom URL schemes that are publicly available, and thereby infer that it is installed 11 | 12 | This repo provides a few utility functions that you can use for both these approaches in conjunction with your dataset mappings (not included). 13 | 14 | ## Usage 15 | 16 | Refer to a simple example in the App Delegate 17 | -------------------------------------------------------------------------------- /iOSInstalledApps.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 16FE887615F35F020034F41F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 16FE887515F35F020034F41F /* UIKit.framework */; }; 11 | 16FE887815F35F020034F41F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 16FE887715F35F020034F41F /* Foundation.framework */; }; 12 | 16FE887A15F35F020034F41F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 16FE887915F35F020034F41F /* CoreGraphics.framework */; }; 13 | 16FE888015F35F020034F41F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 16FE887E15F35F020034F41F /* InfoPlist.strings */; }; 14 | 16FE888215F35F020034F41F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 16FE888115F35F020034F41F /* main.m */; }; 15 | 16FE888615F35F020034F41F /* LLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 16FE888515F35F020034F41F /* LLAppDelegate.m */; }; 16 | 16FE888915F35F020034F41F /* MainStoryboard_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 16FE888715F35F020034F41F /* MainStoryboard_iPhone.storyboard */; }; 17 | 16FE888C15F35F020034F41F /* MainStoryboard_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 16FE888A15F35F020034F41F /* MainStoryboard_iPad.storyboard */; }; 18 | 16FE888F15F35F020034F41F /* LLMasterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 16FE888E15F35F020034F41F /* LLMasterViewController.m */; }; 19 | 16FE889215F35F020034F41F /* LLDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 16FE889115F35F020034F41F /* LLDetailViewController.m */; }; 20 | 16FE889A15F35F760034F41F /* LLInstalledApps.m in Sources */ = {isa = PBXBuildFile; fileRef = 16FE889915F35F760034F41F /* LLInstalledApps.m */; }; 21 | 16FE889C15F36CE90034F41F /* LICENSE.txt in Resources */ = {isa = PBXBuildFile; fileRef = 16FE889B15F36CE90034F41F /* LICENSE.txt */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXFileReference section */ 25 | 16FE887115F35F020034F41F /* iOSInstalledApps.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iOSInstalledApps.app; sourceTree = BUILT_PRODUCTS_DIR; }; 26 | 16FE887515F35F020034F41F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 27 | 16FE887715F35F020034F41F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 28 | 16FE887915F35F020034F41F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 29 | 16FE887D15F35F020034F41F /* iOSInstalledApps-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "iOSInstalledApps-Info.plist"; sourceTree = ""; }; 30 | 16FE887F15F35F020034F41F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 31 | 16FE888115F35F020034F41F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32 | 16FE888315F35F020034F41F /* iOSInstalledApps-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "iOSInstalledApps-Prefix.pch"; sourceTree = ""; }; 33 | 16FE888415F35F020034F41F /* LLAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LLAppDelegate.h; sourceTree = ""; }; 34 | 16FE888515F35F020034F41F /* LLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LLAppDelegate.m; sourceTree = ""; }; 35 | 16FE888815F35F020034F41F /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPhone.storyboard; sourceTree = ""; }; 36 | 16FE888B15F35F020034F41F /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPad.storyboard; sourceTree = ""; }; 37 | 16FE888D15F35F020034F41F /* LLMasterViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LLMasterViewController.h; sourceTree = ""; }; 38 | 16FE888E15F35F020034F41F /* LLMasterViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LLMasterViewController.m; sourceTree = ""; }; 39 | 16FE889015F35F020034F41F /* LLDetailViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LLDetailViewController.h; sourceTree = ""; }; 40 | 16FE889115F35F020034F41F /* LLDetailViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LLDetailViewController.m; sourceTree = ""; }; 41 | 16FE889815F35F760034F41F /* LLInstalledApps.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LLInstalledApps.h; sourceTree = ""; }; 42 | 16FE889915F35F760034F41F /* LLInstalledApps.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LLInstalledApps.m; sourceTree = ""; }; 43 | 16FE889B15F36CE90034F41F /* LICENSE.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE.txt; sourceTree = ""; }; 44 | /* End PBXFileReference section */ 45 | 46 | /* Begin PBXFrameworksBuildPhase section */ 47 | 16FE886E15F35F020034F41F /* Frameworks */ = { 48 | isa = PBXFrameworksBuildPhase; 49 | buildActionMask = 2147483647; 50 | files = ( 51 | 16FE887615F35F020034F41F /* UIKit.framework in Frameworks */, 52 | 16FE887815F35F020034F41F /* Foundation.framework in Frameworks */, 53 | 16FE887A15F35F020034F41F /* CoreGraphics.framework in Frameworks */, 54 | ); 55 | runOnlyForDeploymentPostprocessing = 0; 56 | }; 57 | /* End PBXFrameworksBuildPhase section */ 58 | 59 | /* Begin PBXGroup section */ 60 | 16FE886615F35F010034F41F = { 61 | isa = PBXGroup; 62 | children = ( 63 | 16FE889B15F36CE90034F41F /* LICENSE.txt */, 64 | 16FE889815F35F760034F41F /* LLInstalledApps.h */, 65 | 16FE889915F35F760034F41F /* LLInstalledApps.m */, 66 | 16FE887B15F35F020034F41F /* iOSInstalledApps */, 67 | 16FE887415F35F020034F41F /* Frameworks */, 68 | 16FE887215F35F020034F41F /* Products */, 69 | ); 70 | sourceTree = ""; 71 | }; 72 | 16FE887215F35F020034F41F /* Products */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | 16FE887115F35F020034F41F /* iOSInstalledApps.app */, 76 | ); 77 | name = Products; 78 | sourceTree = ""; 79 | }; 80 | 16FE887415F35F020034F41F /* Frameworks */ = { 81 | isa = PBXGroup; 82 | children = ( 83 | 16FE887515F35F020034F41F /* UIKit.framework */, 84 | 16FE887715F35F020034F41F /* Foundation.framework */, 85 | 16FE887915F35F020034F41F /* CoreGraphics.framework */, 86 | ); 87 | name = Frameworks; 88 | sourceTree = ""; 89 | }; 90 | 16FE887B15F35F020034F41F /* iOSInstalledApps */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 16FE888415F35F020034F41F /* LLAppDelegate.h */, 94 | 16FE888515F35F020034F41F /* LLAppDelegate.m */, 95 | 16FE888715F35F020034F41F /* MainStoryboard_iPhone.storyboard */, 96 | 16FE888A15F35F020034F41F /* MainStoryboard_iPad.storyboard */, 97 | 16FE888D15F35F020034F41F /* LLMasterViewController.h */, 98 | 16FE888E15F35F020034F41F /* LLMasterViewController.m */, 99 | 16FE889015F35F020034F41F /* LLDetailViewController.h */, 100 | 16FE889115F35F020034F41F /* LLDetailViewController.m */, 101 | 16FE887C15F35F020034F41F /* Supporting Files */, 102 | ); 103 | path = iOSInstalledApps; 104 | sourceTree = ""; 105 | }; 106 | 16FE887C15F35F020034F41F /* Supporting Files */ = { 107 | isa = PBXGroup; 108 | children = ( 109 | 16FE887D15F35F020034F41F /* iOSInstalledApps-Info.plist */, 110 | 16FE887E15F35F020034F41F /* InfoPlist.strings */, 111 | 16FE888115F35F020034F41F /* main.m */, 112 | 16FE888315F35F020034F41F /* iOSInstalledApps-Prefix.pch */, 113 | ); 114 | name = "Supporting Files"; 115 | sourceTree = ""; 116 | }; 117 | /* End PBXGroup section */ 118 | 119 | /* Begin PBXNativeTarget section */ 120 | 16FE887015F35F020034F41F /* iOSInstalledApps */ = { 121 | isa = PBXNativeTarget; 122 | buildConfigurationList = 16FE889515F35F020034F41F /* Build configuration list for PBXNativeTarget "iOSInstalledApps" */; 123 | buildPhases = ( 124 | 16FE886D15F35F020034F41F /* Sources */, 125 | 16FE886E15F35F020034F41F /* Frameworks */, 126 | 16FE886F15F35F020034F41F /* Resources */, 127 | ); 128 | buildRules = ( 129 | ); 130 | dependencies = ( 131 | ); 132 | name = iOSInstalledApps; 133 | productName = iOSInstalledApps; 134 | productReference = 16FE887115F35F020034F41F /* iOSInstalledApps.app */; 135 | productType = "com.apple.product-type.application"; 136 | }; 137 | /* End PBXNativeTarget section */ 138 | 139 | /* Begin PBXProject section */ 140 | 16FE886815F35F010034F41F /* Project object */ = { 141 | isa = PBXProject; 142 | attributes = { 143 | CLASSPREFIX = LL; 144 | LastUpgradeCheck = 0440; 145 | ORGANIZATIONNAME = "Aravind Krishnaswamy"; 146 | }; 147 | buildConfigurationList = 16FE886B15F35F010034F41F /* Build configuration list for PBXProject "iOSInstalledApps" */; 148 | compatibilityVersion = "Xcode 3.2"; 149 | developmentRegion = English; 150 | hasScannedForEncodings = 0; 151 | knownRegions = ( 152 | en, 153 | ); 154 | mainGroup = 16FE886615F35F010034F41F; 155 | productRefGroup = 16FE887215F35F020034F41F /* Products */; 156 | projectDirPath = ""; 157 | projectRoot = ""; 158 | targets = ( 159 | 16FE887015F35F020034F41F /* iOSInstalledApps */, 160 | ); 161 | }; 162 | /* End PBXProject section */ 163 | 164 | /* Begin PBXResourcesBuildPhase section */ 165 | 16FE886F15F35F020034F41F /* Resources */ = { 166 | isa = PBXResourcesBuildPhase; 167 | buildActionMask = 2147483647; 168 | files = ( 169 | 16FE888015F35F020034F41F /* InfoPlist.strings in Resources */, 170 | 16FE888915F35F020034F41F /* MainStoryboard_iPhone.storyboard in Resources */, 171 | 16FE888C15F35F020034F41F /* MainStoryboard_iPad.storyboard in Resources */, 172 | 16FE889C15F36CE90034F41F /* LICENSE.txt in Resources */, 173 | ); 174 | runOnlyForDeploymentPostprocessing = 0; 175 | }; 176 | /* End PBXResourcesBuildPhase section */ 177 | 178 | /* Begin PBXSourcesBuildPhase section */ 179 | 16FE886D15F35F020034F41F /* Sources */ = { 180 | isa = PBXSourcesBuildPhase; 181 | buildActionMask = 2147483647; 182 | files = ( 183 | 16FE888215F35F020034F41F /* main.m in Sources */, 184 | 16FE888615F35F020034F41F /* LLAppDelegate.m in Sources */, 185 | 16FE888F15F35F020034F41F /* LLMasterViewController.m in Sources */, 186 | 16FE889215F35F020034F41F /* LLDetailViewController.m in Sources */, 187 | 16FE889A15F35F760034F41F /* LLInstalledApps.m in Sources */, 188 | ); 189 | runOnlyForDeploymentPostprocessing = 0; 190 | }; 191 | /* End PBXSourcesBuildPhase section */ 192 | 193 | /* Begin PBXVariantGroup section */ 194 | 16FE887E15F35F020034F41F /* InfoPlist.strings */ = { 195 | isa = PBXVariantGroup; 196 | children = ( 197 | 16FE887F15F35F020034F41F /* en */, 198 | ); 199 | name = InfoPlist.strings; 200 | sourceTree = ""; 201 | }; 202 | 16FE888715F35F020034F41F /* MainStoryboard_iPhone.storyboard */ = { 203 | isa = PBXVariantGroup; 204 | children = ( 205 | 16FE888815F35F020034F41F /* en */, 206 | ); 207 | name = MainStoryboard_iPhone.storyboard; 208 | sourceTree = ""; 209 | }; 210 | 16FE888A15F35F020034F41F /* MainStoryboard_iPad.storyboard */ = { 211 | isa = PBXVariantGroup; 212 | children = ( 213 | 16FE888B15F35F020034F41F /* en */, 214 | ); 215 | name = MainStoryboard_iPad.storyboard; 216 | sourceTree = ""; 217 | }; 218 | /* End PBXVariantGroup section */ 219 | 220 | /* Begin XCBuildConfiguration section */ 221 | 16FE889315F35F020034F41F /* Debug */ = { 222 | isa = XCBuildConfiguration; 223 | buildSettings = { 224 | ALWAYS_SEARCH_USER_PATHS = NO; 225 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 226 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 227 | CLANG_ENABLE_OBJC_ARC = YES; 228 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 229 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 230 | COPY_PHASE_STRIP = NO; 231 | GCC_C_LANGUAGE_STANDARD = gnu99; 232 | GCC_DYNAMIC_NO_PIC = NO; 233 | GCC_OPTIMIZATION_LEVEL = 0; 234 | GCC_PREPROCESSOR_DEFINITIONS = ( 235 | "DEBUG=1", 236 | "$(inherited)", 237 | ); 238 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 239 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 240 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 241 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 242 | GCC_WARN_UNUSED_VARIABLE = YES; 243 | IPHONEOS_DEPLOYMENT_TARGET = 5.1; 244 | SDKROOT = iphoneos; 245 | TARGETED_DEVICE_FAMILY = "1,2"; 246 | }; 247 | name = Debug; 248 | }; 249 | 16FE889415F35F020034F41F /* Release */ = { 250 | isa = XCBuildConfiguration; 251 | buildSettings = { 252 | ALWAYS_SEARCH_USER_PATHS = NO; 253 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 254 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 255 | CLANG_ENABLE_OBJC_ARC = YES; 256 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 257 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 258 | COPY_PHASE_STRIP = YES; 259 | GCC_C_LANGUAGE_STANDARD = gnu99; 260 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 261 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 262 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 263 | GCC_WARN_UNUSED_VARIABLE = YES; 264 | IPHONEOS_DEPLOYMENT_TARGET = 5.1; 265 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 266 | SDKROOT = iphoneos; 267 | TARGETED_DEVICE_FAMILY = "1,2"; 268 | VALIDATE_PRODUCT = YES; 269 | }; 270 | name = Release; 271 | }; 272 | 16FE889615F35F020034F41F /* Debug */ = { 273 | isa = XCBuildConfiguration; 274 | buildSettings = { 275 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 276 | GCC_PREFIX_HEADER = "iOSInstalledApps/iOSInstalledApps-Prefix.pch"; 277 | INFOPLIST_FILE = "iOSInstalledApps/iOSInstalledApps-Info.plist"; 278 | PRODUCT_NAME = "$(TARGET_NAME)"; 279 | WRAPPER_EXTENSION = app; 280 | }; 281 | name = Debug; 282 | }; 283 | 16FE889715F35F020034F41F /* Release */ = { 284 | isa = XCBuildConfiguration; 285 | buildSettings = { 286 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 287 | GCC_PREFIX_HEADER = "iOSInstalledApps/iOSInstalledApps-Prefix.pch"; 288 | INFOPLIST_FILE = "iOSInstalledApps/iOSInstalledApps-Info.plist"; 289 | PRODUCT_NAME = "$(TARGET_NAME)"; 290 | WRAPPER_EXTENSION = app; 291 | }; 292 | name = Release; 293 | }; 294 | /* End XCBuildConfiguration section */ 295 | 296 | /* Begin XCConfigurationList section */ 297 | 16FE886B15F35F010034F41F /* Build configuration list for PBXProject "iOSInstalledApps" */ = { 298 | isa = XCConfigurationList; 299 | buildConfigurations = ( 300 | 16FE889315F35F020034F41F /* Debug */, 301 | 16FE889415F35F020034F41F /* Release */, 302 | ); 303 | defaultConfigurationIsVisible = 0; 304 | defaultConfigurationName = Release; 305 | }; 306 | 16FE889515F35F020034F41F /* Build configuration list for PBXNativeTarget "iOSInstalledApps" */ = { 307 | isa = XCConfigurationList; 308 | buildConfigurations = ( 309 | 16FE889615F35F020034F41F /* Debug */, 310 | 16FE889715F35F020034F41F /* Release */, 311 | ); 312 | defaultConfigurationIsVisible = 0; 313 | }; 314 | /* End XCConfigurationList section */ 315 | }; 316 | rootObject = 16FE886815F35F010034F41F /* Project object */; 317 | } 318 | -------------------------------------------------------------------------------- /iOSInstalledApps/LLAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // LLAppDelegate.h 3 | // iOSInstalledApps 4 | // 5 | // Created by Aravind Krishnaswamy on 02/09/12. 6 | // Copyright (c) 2012 Aravind Krishnaswamy. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface LLAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /iOSInstalledApps/LLAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // LLAppDelegate.m 3 | // iOSInstalledApps 4 | // 5 | // Created by Aravind Krishnaswamy on 02/09/12. 6 | // Copyright (c) 2012 Aravind Krishnaswamy. All rights reserved. 7 | // 8 | 9 | #import "LLAppDelegate.h" 10 | #import "LLInstalledApps.h" 11 | 12 | @implementation LLAppDelegate 13 | 14 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 15 | { 16 | // Override point for customization after application launch. 17 | if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 18 | UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController; 19 | UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; 20 | splitViewController.delegate = (id)navigationController.topViewController; 21 | } 22 | 23 | // Get list of running apps (process names) 24 | NSArray* processes = [LLInstalledApps runningApps]; 25 | assert(processes); 26 | NSLog(@"Process List: %@", processes); 27 | 28 | // Pass in a few URL schemes to lookup 29 | NSArray* schemes = @[ @"tel:", @"sms:", @"mailto:",@"mailto:",@"fb:",@"twitter:",@"instagram",@"fb130329363652431:", @"angrybirds-free:", @"gplus:", @"dbapi-1:", @"soundhound:", @"crystal-46339:", @"doodlejump:", @"fb138713932872514:", @"angrybirds-seasons:", @"WordsWithFriendsFree:", @"fb137333456313198:", @"fb116792795017163:", @"twc:", @"comgoogleearth:", @"nflx:", @"fb216177331814175Regular:", @"quora:", @"path:", @"evernote:", @"templerun:", @"fb:", @"twitter:", @"skype:", @"shazam:", @"instagram:", @"googleapp:", @"foursquare:", @"kindle:", @"imdb:", @"nook:", @"audible:", @"wattpad:", @"x-marvel:", @"kobo:", @"overdrive:", @"com.goodreads.tt:", @"googlebooks:", @"x-comixology:", @"fb134946456646651:", @"ebooks:", @"taleapp:", @"comicsplus:", @"archiecomics:", @"bluefirereader:", @"deseretbookshelf:", @"earthday:", @"sbo:", @"com.adobe.Adobe-Reader:", @"geniusscan:", @"fb239974426079801:", @"com.citrix.securid:", @"COL-G2M-2:", @"GoToMyPC:", @"camcard:", @"mobileiron:", @"force:", @"ushud:", @"fcpm:", @"guidebook:", @"fb144594245582108:", @"asurionMobileLocate:", @"yammer:", @"pcowebview:", @"fb251196928288322:", @"ifaxpro:", @"fb259699454069234:", @"tuxclient:", @"salesforce.chatter:", @"thumbspeak:", @"fb149064151823702:", @"x-autoniq-vinkeyboard:", @"gmarket:", @"attconnect:", @"ssa:", @"coffeetable:", @"fb151295584961392:", @"fb201021956610141:", @"fb283058048395364:", @"db-s88xnnuq25gizve:", @"fb102540830008:", @"fb156995864320881:", @"everydayasl.SignLanguageFree:", @"Pepi Bath Lite:", @"fb302283319859041:", @"fb160354420696853:", @"dunkindonuts:", @"vbk:", @"o7talkingcat:", @"fb194714260574159:", @"fb207419089277486:", @"fb391965177512181:", @"fb173721292676427:", @"o7talkinggina:", @"simsimi:", @"fb162905073821628:", @"ar.apptrailers:", @"fb198642556841597:", @"o7tomsloveletters:", @"su:", @"fb246167610136:", @"milkthecow:", @"fb117993934900864fatbooth:", @"ragecomics:", @"fb111569915535689:", @"facegoolite:", @"tunein:", @"fb164296826950565:", @"mixcloud:", @"fb131549503542594:", @"spotify:", @"ohttp:", @"fb295275268198atomic:", @"dolphin:", @"pinger-db:", @"paypal:", @"fb151985508172001:", @"fb137249306334655:", @"angrybirds-space:", @"drawsomethingfree:", @"fb300673636660678:", @"RunKeeperPro:", @"loseit:", @"Naturespace:", @"pillboxie:", @"flixster:", @"crackle:", @"imovie:", @"motionxgpsdrive:", @"waze:", @"fb314671695276719:", @"scan:", @"x-appshopper:", @"ihandycarpenterlevel:", @"fb134278739973874:", @"hipstamatic:", @"fb192242309827ob:", @"photosynth:", @"photogram:", @"psx:", @"fb272128689676genius:", @"fb402500439785603:", @"fb246290217488:", @"fb184393654925775:", @"cameraawesome:", @"opencinemagram:", @"fb112953085413703:", @"wunderlist:", @"mozy:", @"mobilertm:", @"weave:", @"simplenote:", @"fb92207306468:", @"CamScanner Lite:", @"orchestra:", @"pulse:", @"x-callback-instapaper:", @"zinio:", @"itms-books:", @"stanza:", @"wikipanion:", @"fb252151941506000:", @"scorecenter:", @"fb129765800430121:", @"en-silviorizzi-7242:", @"bumpapp:", @"trillian:", @"tumblr:", @"flighttrack:", @"currency:", @"tripit:", @"uspn:", @"yelp:"]; 30 | 31 | NSLog(@"Total number of schemes: %d", [schemes count]); 32 | NSDate* start_time = [NSDate date]; 33 | NSArray* installed_schemes = [LLInstalledApps appsInstalledWithSchemes:schemes withProgressCallback:^(id count) { 34 | NSLog(@"Progress: %@", count); 35 | } maxSize:25]; 36 | NSDate* end_time = [NSDate date]; 37 | 38 | assert(installed_schemes); 39 | NSLog(@"Installed apps: %@", installed_schemes); 40 | NSLog(@"Completed in: %@s", [NSNumber numberWithDouble:[end_time timeIntervalSinceDate:start_time]]); 41 | 42 | return YES; 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /iOSInstalledApps/LLDetailViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // LLDetailViewController.h 3 | // iOSInstalledApps 4 | // 5 | // Created by Aravind Krishnaswamy on 02/09/12. 6 | // Copyright (c) 2012 Aravind Krishnaswamy. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface LLDetailViewController : UIViewController 12 | 13 | @property (strong, nonatomic) id detailItem; 14 | 15 | @property (weak, nonatomic) IBOutlet UILabel *detailDescriptionLabel; 16 | @end 17 | -------------------------------------------------------------------------------- /iOSInstalledApps/LLDetailViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // LLDetailViewController.m 3 | // iOSInstalledApps 4 | // 5 | // Created by Aravind Krishnaswamy on 02/09/12. 6 | // Copyright (c) 2012 Aravind Krishnaswamy. All rights reserved. 7 | // 8 | 9 | #import "LLDetailViewController.h" 10 | 11 | @interface LLDetailViewController () 12 | @property (strong, nonatomic) UIPopoverController *masterPopoverController; 13 | - (void)configureView; 14 | @end 15 | 16 | @implementation LLDetailViewController 17 | 18 | #pragma mark - Managing the detail item 19 | 20 | - (void)setDetailItem:(id)newDetailItem 21 | { 22 | if (_detailItem != newDetailItem) { 23 | _detailItem = newDetailItem; 24 | 25 | // Update the view. 26 | [self configureView]; 27 | } 28 | 29 | if (self.masterPopoverController != nil) { 30 | [self.masterPopoverController dismissPopoverAnimated:YES]; 31 | } 32 | } 33 | 34 | - (void)configureView 35 | { 36 | // Update the user interface for the detail item. 37 | 38 | if (self.detailItem) { 39 | self.detailDescriptionLabel.text = [self.detailItem description]; 40 | } 41 | } 42 | 43 | - (void)viewDidLoad 44 | { 45 | [super viewDidLoad]; 46 | // Do any additional setup after loading the view, typically from a nib. 47 | [self configureView]; 48 | } 49 | 50 | - (void)viewDidUnload 51 | { 52 | [super viewDidUnload]; 53 | // Release any retained subviews of the main view. 54 | } 55 | 56 | - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 57 | { 58 | if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 59 | return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 60 | } else { 61 | return YES; 62 | } 63 | } 64 | 65 | #pragma mark - Split view 66 | 67 | - (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController 68 | { 69 | barButtonItem.title = NSLocalizedString(@"Master", @"Master"); 70 | [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES]; 71 | self.masterPopoverController = popoverController; 72 | } 73 | 74 | - (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem 75 | { 76 | // Called when the view is shown again in the split view, invalidating the button and popover controller. 77 | [self.navigationItem setLeftBarButtonItem:nil animated:YES]; 78 | self.masterPopoverController = nil; 79 | } 80 | 81 | @end 82 | -------------------------------------------------------------------------------- /iOSInstalledApps/LLMasterViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // LLMasterViewController.h 3 | // iOSInstalledApps 4 | // 5 | // Created by Aravind Krishnaswamy on 02/09/12. 6 | // Copyright (c) 2012 Aravind Krishnaswamy. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class LLDetailViewController; 12 | 13 | @interface LLMasterViewController : UITableViewController 14 | 15 | @property (strong, nonatomic) LLDetailViewController *detailViewController; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /iOSInstalledApps/LLMasterViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // LLMasterViewController.m 3 | // iOSInstalledApps 4 | // 5 | // Created by Aravind Krishnaswamy on 02/09/12. 6 | // Copyright (c) 2012 Aravind Krishnaswamy. All rights reserved. 7 | // 8 | 9 | #import "LLMasterViewController.h" 10 | 11 | #import "LLDetailViewController.h" 12 | 13 | @interface LLMasterViewController () { 14 | NSMutableArray *_objects; 15 | } 16 | @end 17 | 18 | @implementation LLMasterViewController 19 | 20 | - (void)awakeFromNib 21 | { 22 | if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 23 | self.clearsSelectionOnViewWillAppear = NO; 24 | self.contentSizeForViewInPopover = CGSizeMake(320.0, 600.0); 25 | } 26 | [super awakeFromNib]; 27 | } 28 | 29 | - (void)viewDidLoad 30 | { 31 | [super viewDidLoad]; 32 | // Do any additional setup after loading the view, typically from a nib. 33 | self.navigationItem.leftBarButtonItem = self.editButtonItem; 34 | 35 | UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)]; 36 | self.navigationItem.rightBarButtonItem = addButton; 37 | self.detailViewController = (LLDetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController]; 38 | } 39 | 40 | - (void)viewDidUnload 41 | { 42 | [super viewDidUnload]; 43 | // Release any retained subviews of the main view. 44 | } 45 | 46 | - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 47 | { 48 | if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 49 | return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 50 | } else { 51 | return YES; 52 | } 53 | } 54 | 55 | - (void)insertNewObject:(id)sender 56 | { 57 | if (!_objects) { 58 | _objects = [[NSMutableArray alloc] init]; 59 | } 60 | [_objects insertObject:[NSDate date] atIndex:0]; 61 | NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 62 | [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 63 | } 64 | 65 | #pragma mark - Table View 66 | 67 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 68 | { 69 | return 1; 70 | } 71 | 72 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 73 | { 74 | return _objects.count; 75 | } 76 | 77 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 78 | { 79 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 80 | 81 | NSDate *object = [_objects objectAtIndex:indexPath.row]; 82 | cell.textLabel.text = [object description]; 83 | return cell; 84 | } 85 | 86 | - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 87 | { 88 | // Return NO if you do not want the specified item to be editable. 89 | return YES; 90 | } 91 | 92 | - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 93 | { 94 | if (editingStyle == UITableViewCellEditingStyleDelete) { 95 | [_objects removeObjectAtIndex:indexPath.row]; 96 | [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 97 | } else if (editingStyle == UITableViewCellEditingStyleInsert) { 98 | // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view. 99 | } 100 | } 101 | 102 | /* 103 | // Override to support rearranging the table view. 104 | - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath 105 | { 106 | } 107 | */ 108 | 109 | /* 110 | // Override to support conditional rearranging of the table view. 111 | - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath 112 | { 113 | // Return NO if you do not want the item to be re-orderable. 114 | return YES; 115 | } 116 | */ 117 | 118 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 119 | { 120 | if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 121 | NSDate *object = [_objects objectAtIndex:indexPath.row]; 122 | self.detailViewController.detailItem = object; 123 | } 124 | } 125 | 126 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 127 | { 128 | if ([[segue identifier] isEqualToString:@"showDetail"]) { 129 | NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 130 | NSDate *object = [_objects objectAtIndex:indexPath.row]; 131 | [[segue destinationViewController] setDetailItem:object]; 132 | } 133 | } 134 | 135 | @end 136 | -------------------------------------------------------------------------------- /iOSInstalledApps/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /iOSInstalledApps/en.lproj/MainStoryboard_iPad.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 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /iOSInstalledApps/en.lproj/MainStoryboard_iPhone.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 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /iOSInstalledApps/iOSInstalledApps-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | com.levitum.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | UIMainStoryboardFile 28 | MainStoryboard_iPhone 29 | UIMainStoryboardFile~ipad 30 | MainStoryboard_iPad 31 | UIRequiredDeviceCapabilities 32 | 33 | armv7 34 | 35 | UISupportedInterfaceOrientations 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationLandscapeLeft 39 | UIInterfaceOrientationLandscapeRight 40 | 41 | UISupportedInterfaceOrientations~ipad 42 | 43 | UIInterfaceOrientationPortrait 44 | UIInterfaceOrientationPortraitUpsideDown 45 | UIInterfaceOrientationLandscapeLeft 46 | UIInterfaceOrientationLandscapeRight 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /iOSInstalledApps/iOSInstalledApps-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'iOSInstalledApps' target in the 'iOSInstalledApps' project 3 | // 4 | 5 | #import 6 | 7 | #ifndef __IPHONE_5_0 8 | #warning "This project uses features only available in iOS SDK 5.0 and later." 9 | #endif 10 | 11 | #ifdef __OBJC__ 12 | #import 13 | #import 14 | #endif 15 | -------------------------------------------------------------------------------- /iOSInstalledApps/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // iOSInstalledApps 4 | // 5 | // Created by Aravind Krishnaswamy on 02/09/12. 6 | // Copyright (c) 2012 Aravind Krishnaswamy. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "LLAppDelegate.h" 12 | 13 | int main(int argc, char *argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([LLAppDelegate class])); 17 | } 18 | } 19 | --------------------------------------------------------------------------------