├── Classes ├── .gitignore ├── QsUrbanimageLibraryModuleAssets.h ├── QsUrbanimageLibraryModuleAssets.m ├── QsUrbanimageLibraryModule.h └── QsUrbanimageLibraryModule.m ├── hooks ├── README ├── uninstall.py ├── install.py ├── add.py └── remove.py ├── QsUrbanimageLibrary_Prefix.pch ├── .gitignore ├── urbanimagelibrary.xcodeproj ├── xcuserdata │ └── jeremy.xcuserdatad │ │ ├── xcdebugger │ │ └── Breakpoints.xcbkptlist │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ ├── Build & Test.xcscheme │ │ └── urbanimagelibrary.xcscheme └── project.pbxproj ├── assets └── README ├── timodule.xml ├── platform └── README ├── LICENSE ├── titanium.xcconfig ├── .project ├── module.xcconfig ├── manifest ├── README ├── example └── app.js └── documentation └── index.md /Classes/.gitignore: -------------------------------------------------------------------------------- 1 | QsUrbanimageLibrary.h 2 | QsUrbanimageLibrary.m 3 | -------------------------------------------------------------------------------- /hooks/README: -------------------------------------------------------------------------------- 1 | These files are not yet supported as of 1.4.0 but will be in a near future release. 2 | -------------------------------------------------------------------------------- /QsUrbanimageLibrary_Prefix.pch: -------------------------------------------------------------------------------- 1 | 2 | #ifdef __OBJC__ 3 | #import 4 | #endif 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | tmp 2 | bin 3 | build 4 | *.zip 5 | *.swp 6 | deploy.sh 7 | xcuserdata 8 | .DS_Store 9 | *~.nib 10 | project.xcworkspace/ 11 | 12 | -------------------------------------------------------------------------------- /urbanimagelibrary.xcodeproj/xcuserdata/jeremy.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /Classes/QsUrbanimageLibraryModuleAssets.h: -------------------------------------------------------------------------------- 1 | /** 2 | * This is a generated file. Do not edit or your changes will be lost 3 | */ 4 | 5 | @interface QsUrbanimageLibraryModuleAssets : NSObject 6 | { 7 | } 8 | - (NSData*) moduleAsset; 9 | @end 10 | -------------------------------------------------------------------------------- /assets/README: -------------------------------------------------------------------------------- 1 | Place your assets like PNG files in this directory and they will be packaged with your module. 2 | 3 | If you create a file named qs.urbanimage.library.js in this directory, it will be 4 | compiled and used as your module. This allows you to run pure Javascript 5 | modules that are pre-compiled. 6 | 7 | -------------------------------------------------------------------------------- /Classes/QsUrbanimageLibraryModuleAssets.m: -------------------------------------------------------------------------------- 1 | /** 2 | * This is a generated file. Do not edit or your changes will be lost 3 | */ 4 | #import "QsUrbanimageLibraryModuleAssets.h" 5 | 6 | extern NSData * dataWithHexString (NSString * hexString); 7 | 8 | @implementation QsUrbanimageLibraryModuleAssets 9 | 10 | - (NSData*) moduleAsset 11 | { 12 | return nil; 13 | } 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /hooks/uninstall.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # 3 | # This is the module uninstall hook that will be 4 | # called when your module is uninstalled 5 | # 6 | import os, sys 7 | 8 | def main(args,argc): 9 | 10 | # TODO: write your uninstall hook here (optional) 11 | 12 | # exit 13 | sys.exit(0) 14 | 15 | 16 | if __name__ == '__main__': 17 | main(sys.argv,len(sys.argv)) 18 | 19 | -------------------------------------------------------------------------------- /hooks/install.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # 3 | # This is the module install hook that will be 4 | # called when your module is first installed 5 | # 6 | import os, sys 7 | 8 | def main(args,argc): 9 | 10 | # TODO: write your install hook here (optional) 11 | 12 | # exit 13 | sys.exit(0) 14 | 15 | 16 | 17 | if __name__ == '__main__': 18 | main(sys.argv,len(sys.argv)) 19 | 20 | -------------------------------------------------------------------------------- /timodule.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /platform/README: -------------------------------------------------------------------------------- 1 | You can place platform-specific files here in sub-folders named "android" and/or "iphone", just as you can with normal Titanium Mobile SDK projects. Any folders and files you place here will be merged with the platform-specific files in a Titanium Mobile project that uses this module. 2 | 3 | When a Titanium Mobile project that uses this module is built, the files from this platform/ folder will be treated the same as files (if any) from the Titanium Mobile project's platform/ folder. 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Licensed under the Apache License, Version 2.0 (the "License"); 2 | you may not use this file except in compliance with the License. 3 | You may obtain a copy of the License at 4 | 5 | http://www.apache.org/licenses/LICENSE-2.0 6 | 7 | Unless required by applicable law or agreed to in writing, software 8 | distributed under the License is distributed on an "AS IS" BASIS, 9 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 | See the License for the specific language governing permissions and 11 | limitations under the License. -------------------------------------------------------------------------------- /titanium.xcconfig: -------------------------------------------------------------------------------- 1 | // 2 | // 3 | // CHANGE THESE VALUES TO REFLECT THE VERSION (AND LOCATION IF DIFFERENT) 4 | // OF YOUR TITANIUM SDK YOU'RE BUILDING FOR 5 | // 6 | // 7 | TITANIUM_SDK_VERSION = 2.0.1.GA2 8 | 9 | 10 | // 11 | // THESE SHOULD BE OK GENERALLY AS-IS 12 | // 13 | TITANIUM_SDK = /Library/Application Support/Titanium/mobilesdk/osx/$(TITANIUM_SDK_VERSION) 14 | TITANIUM_BASE_SDK = "$(TITANIUM_SDK)/iphone/include" 15 | TITANIUM_BASE_SDK2 = "$(TITANIUM_SDK)/iphone/include/TiCore" 16 | HEADER_SEARCH_PATHS= $(TITANIUM_BASE_SDK) $(TITANIUM_BASE_SDK2) 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | UrbanImageLibrary 4 | 5 | 6 | 7 | 8 | 9 | com.aptana.ide.core.unifiedBuilder 10 | 11 | 12 | 13 | 14 | com.appcelerator.titanium.core.builder 15 | 16 | 17 | 18 | 19 | 20 | com.appcelerator.titanium.mobile.module.nature 21 | com.aptana.projects.webnature 22 | 23 | 24 | -------------------------------------------------------------------------------- /urbanimagelibrary.xcodeproj/xcuserdata/jeremy.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Build & Test.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | urbanimagelibrary.xcscheme 13 | 14 | orderHint 15 | 1 16 | 17 | 18 | SuppressBuildableAutocreation 19 | 20 | 24416B8111C4CA220047AFDD 21 | 22 | primary 23 | 24 | 25 | D2AAC07D0554694100DB518D 26 | 27 | primary 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /hooks/add.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # 3 | # This is the module project add hook that will be 4 | # called when your module is added to a project 5 | # 6 | import os, sys 7 | 8 | def dequote(s): 9 | if s[0:1] == '"': 10 | return s[1:-1] 11 | return s 12 | 13 | def main(args,argc): 14 | # You will get the following command line arguments 15 | # in the following order: 16 | # 17 | # project_dir = the full path to the project root directory 18 | # project_type = the type of project (desktop, mobile, ipad) 19 | # project_name = the name of the project 20 | # 21 | project_dir = dequote(os.path.expanduser(args[1])) 22 | project_type = dequote(args[2]) 23 | project_name = dequote(args[3]) 24 | 25 | # TODO: write your add hook here (optional) 26 | 27 | 28 | # exit 29 | sys.exit(0) 30 | 31 | 32 | 33 | if __name__ == '__main__': 34 | main(sys.argv,len(sys.argv)) 35 | 36 | -------------------------------------------------------------------------------- /hooks/remove.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # 3 | # This is the module project remove hook that will be 4 | # called when your module is remove from a project 5 | # 6 | import os, sys 7 | 8 | def dequote(s): 9 | if s[0:1] == '"': 10 | return s[1:-1] 11 | return s 12 | 13 | def main(args,argc): 14 | # You will get the following command line arguments 15 | # in the following order: 16 | # 17 | # project_dir = the full path to the project root directory 18 | # project_type = the type of project (desktop, mobile, ipad) 19 | # project_name = the name of the project 20 | # 21 | project_dir = dequote(os.path.expanduser(args[1])) 22 | project_type = dequote(args[2]) 23 | project_name = dequote(args[3]) 24 | 25 | # TODO: write your remove hook here (optional) 26 | 27 | # exit 28 | sys.exit(0) 29 | 30 | 31 | 32 | if __name__ == '__main__': 33 | main(sys.argv,len(sys.argv)) 34 | 35 | -------------------------------------------------------------------------------- /module.xcconfig: -------------------------------------------------------------------------------- 1 | // 2 | // PLACE ANY BUILD DEFINITIONS IN THIS FILE AND THEY WILL BE 3 | // PICKED UP DURING THE APP BUILD FOR YOUR MODULE 4 | // 5 | // see the following webpage for instructions on the settings 6 | // for this file: 7 | // http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/XcodeBuildSystem/400-Build_Configurations/build_configs.html 8 | // 9 | 10 | // 11 | // How to add a Framework (example) 12 | // 13 | // OTHER_LDFLAGS=$(inherited) -framework Foo 14 | // 15 | // Adding a framework for a specific version(s) of iPhone: 16 | // 17 | // OTHER_LDFLAGS[sdk=iphoneos4*]=$(inherited) -framework Foo 18 | // OTHER_LDFLAGS[sdk=iphonesimulator4*]=$(inherited) -framework Foo 19 | // 20 | // 21 | // How to add a compiler define: 22 | // 23 | // OTHER_CFLAGS=$(inherited) -DFOO=1 24 | // 25 | // 26 | // IMPORTANT NOTE: always use $(inherited) in your overrides 27 | // 28 | 29 | OTHER_LDFLAGS=$(inherited) -framework AssetsLibrary 30 | -------------------------------------------------------------------------------- /manifest: -------------------------------------------------------------------------------- 1 | # 2 | # this is your module manifest and used by Titanium 3 | # during compilation, packaging, distribution, etc. 4 | # 5 | version: 1.0 6 | apiversion: 2 7 | description: A module that provides access to the user's photo library. 8 | author: Quickstone Software, LLC 9 | license: Licensed under the Apache License, Version 2.0 (the "License"); 10 | you may not use this file except in compliance with the License. 11 | You may obtain a copy of the License at 12 | 13 | http://www.apache.org/licenses/LICENSE-2.0 14 | 15 | Unless required by applicable law or agreed to in writing, software 16 | distributed under the License is distributed on an "AS IS" BASIS, 17 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 | See the License for the specific language governing permissions and 19 | limitations under the License. 20 | copyright: Copyright (c) 2012 21 | 22 | 23 | # these should not be edited 24 | name: urbanimagelibrary 25 | moduleid: qs.urbanimage.library 26 | guid: c6d0f327-80e0-400f-929c-012ece34ec98 27 | platform: iphone 28 | minsdk: 2.0.1.GA2 29 | -------------------------------------------------------------------------------- /Classes/QsUrbanimageLibraryModule.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2012 Quickstone Software, LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. */ 15 | 16 | #import "TiModule.h" 17 | #import 18 | #import 19 | 20 | @interface QsUrbanimageLibraryModule : TiModule 21 | { 22 | KrollCallback *successCallback; 23 | KrollCallback *errorCallback; 24 | } 25 | 26 | @property (nonatomic, retain) ALAssetsLibrary *assetLibrary; 27 | @property (nonatomic, retain) NSMutableArray *assetGroups; 28 | 29 | -(void)buildAssets:(NSUInteger)assetGroupType groupId:(NSInteger)groupId 30 | start:(NSUInteger)start end:(NSUInteger)end includeFullSizeImage:(Boolean)includeFullSizeImage; 31 | 32 | -(NSDictionary*)buildProperties:(ALAsset*)asset includeFullSizeImage:(Boolean)includeFullSizeImage; 33 | -(NSDictionary*)buildGroupProperties:(ALAssetsGroup*)asset index:(NSUInteger)index; 34 | @end 35 | -------------------------------------------------------------------------------- /urbanimagelibrary.xcodeproj/xcuserdata/jeremy.xcuserdatad/xcschemes/Build & Test.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 14 | 20 | 21 | 22 | 23 | 24 | 29 | 30 | 31 | 32 | 40 | 41 | 42 | 43 | 50 | 51 | 53 | 54 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /urbanimagelibrary.xcodeproj/xcuserdata/jeremy.xcuserdatad/xcschemes/urbanimagelibrary.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 14 | 20 | 21 | 22 | 23 | 24 | 29 | 30 | 31 | 32 | 40 | 41 | 42 | 43 | 50 | 51 | 53 | 54 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | The Urban Image Photo Library Module 2 | =========================================== 3 | 4 | The purpose of this library is to provide easy access to the user's photo library. 5 | Not only will it return the photos, but it will also return useful information about 6 | the photo. This library will return the following pieces of information about a photo: 7 | 8 | 1. The full resolution of the image 9 | 2. A thumbnail of the image 10 | 3. The type of file (image or video) 11 | 4. Location information including: 12 | a. latitude 13 | b. longitude 14 | c. altitude 15 | d. course 16 | e. horizontal accuracy 17 | f. vertical accuracy 18 | g. speed 19 | h. timestamp 20 | 5. If the file is a video it will return the duration 21 | 6. Orientation 22 | 7. Creation Date 23 | 8. Available file formats 24 | 9. Ways to access the file 25 | 26 | This library also provides a way to return certain groups of photos and to also return a 27 | section of photos based on start and end parameters. 28 | 29 | INSTALL THE URBAN IMAGE MODULE 30 | ------------------------------ 31 | 32 | 1. First of all, view the "titanium.xcconfig" file located in the root of the module and make sure the TITANIUM_SDK_VERSION 33 | refers to a version that you have installed. The Urban Image module was built using version 1.8.0.1. It should work on 34 | previous versions of the Titanium SDK, but the iOS version needs to be 4.0 or higher due to heavy use of the iOS 35 | AssetsLibrary which was made available in version 4.0. 36 | 37 | The second attribute to look at is the TITANIUM_SDK location. Per instructions in the "Module Development" 38 | (https://wiki.appcelerator.org/display/guides/iOS+Module+Development+Guide) guide in section 0 39 | "Setting Up your Module Environment" you'll need to determine where your Titanium SDK is installed. It may be 40 | installed in "/Library/Application\ Support/Titanium" or "~/Library/Application\ Support/Titanium". The default 41 | location is "/Library/Application\ Support/Titanium". 42 | 43 | Save any changes you've made to the "titanium.xcconfig" file. 44 | 45 | 2. Run 'build.py' this will create a zip file that can then be installed. 46 | 47 | 3. Copy the newly created zip file to the place where the Titanium SDK is installed. 48 | 49 | cp qs.urbanimage.library-iphone-1.0.zip /Library/Application\ Support/Titanium 50 | 51 | --- or if you Titanium SDK is installed in your home directory --- 52 | 53 | cp qs.urbanimage.library-iphone-1.0.zip ~/Library/Application\ Support/Titanium 54 | 55 | 4. The instructions in the "Testing your Module in a test application" section of the "Module Development" indicate 56 | that the Titanium compiler will unzip the newly copied module. That hasn't been my experience. I have found that 57 | it is necessary to manually unzip the module. 58 | 59 | cd /Library/Application\ Support/Titanium" or cd ~/Library/Application\ Support/Titanium depending up 60 | on where the SDK is located. 61 | 62 | unzip qs.urbanimage.library-iphone-1.0.zip 63 | 64 | This will install the module into the appropriate directories. 65 | 66 | REGISTER THE URBAN IMAGE MODULE 67 | ------------------------------- 68 | 69 | Register your module with your application by editing `tiapp.xml` and adding your module. 70 | Example: 71 | 72 | 73 | qs.urbanimage.library 74 | 75 | 76 | When you run your project, the compiler will know to automatically compile in your module 77 | dependencies and copy appropriate image assets into the application. 78 | 79 | DOCUMENTATION FOR THE URBAN IMAGE MODULE 80 | ---------------------------------------- 81 | 82 | Documentation for this module can be found in documentation/index.md 83 | 84 | EXAMPLE CODE 85 | -------------------------- 86 | An example application exists in example/app.js that demonstrates the use of the module. 87 | The example app displays all of the photos from the photo library along with the creation date. 88 | If the photo has location data stored with it then you can click on the photo and it will plot the 89 | photo's location on a map. 90 | 91 | -------------------------------------------------------------------------------- /example/app.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2012 Quickstone Software LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | 16 | */ 17 | 18 | var urbanimagelibrary = require('qs.urbanimage.library'); 19 | Ti.API.info("module is => " + urbanimagelibrary); 20 | 21 | var window = Ti.UI.createWindow({ 22 | backgroundColor:'white' 23 | }); 24 | 25 | var tableView = Ti.UI.createTableView({}); 26 | window.add(tableView); 27 | 28 | function clickGroup(row, group) { 29 | row.addEventListener("click", function(e) { 30 | Ti.API.debug("We got clicked."); 31 | var photos = urbanimagelibrary.photos({ 32 | success: function(e) { 33 | Ti.API.debug("Number of photos returned: " + e.photos.length); 34 | updateTableView(e.photos); 35 | }, 36 | error: function(e) { 37 | Ti.API.error("An error occured! " + e); 38 | }, 39 | includeFullSizeImage: true, 40 | groupId: group.id 41 | }); 42 | }); 43 | } 44 | 45 | function clickPhoto(photoView, photo) { 46 | photoView.addEventListener("click", function(e) { 47 | var w = Ti.UI.createWindow({navBarHidden:false}); 48 | var closeButton = Ti.UI.createButton({ 49 | title: "Close", 50 | style: Titanium.UI.iPhone.SystemButtonStyle.BORDERED 51 | }); 52 | closeButton.addEventListener("click", function(e){ 53 | w.close(); 54 | }); 55 | var toolbar = Ti.UI.iOS.createToolbar({ 56 | items:[closeButton], 57 | bottom:'base', 58 | translucent: true 59 | }); 60 | 61 | if (typeof photo.location !== 'undefined') { 62 | var photoAnnotation = Ti.Map.createAnnotation({ 63 | latitude: photo.location.latitude, 64 | longitude: photo.location.longitude, 65 | title: "Taken: " + photo.creationDate 66 | }); 67 | Ti.API.debug(photo.creationDate); 68 | Ti.API.debug(photo.location.latitude); 69 | Ti.API.debug(photo.location.longitude); 70 | var mapview = Titanium.Map.createView({ 71 | mapType: Titanium.Map.STANDARD_TYPE, 72 | region:{latitude:photo.location.latitude, longitude:photo.location.longitude, latitudeDelta:0.5, longitudeDelta:0.5}, 73 | animate:true, 74 | userLocation:true, 75 | annotations:[photoAnnotation] 76 | }); 77 | 78 | w.add(mapview); 79 | } else { 80 | var imagev = Ti.UI.createImageView({}); 81 | w.add(imagev); 82 | 83 | Ti.API.debug(photo.waysToAccess); 84 | Ti.API.debug(photo.waysToAccess["public.jpeg"]); 85 | 86 | urbanimagelibrary.photo({ 87 | success: function(e) { 88 | imagev.setImage(e.photo.image); 89 | }, 90 | error: function(e) { 91 | Ti.API.error("An error occured! " + e); 92 | }, 93 | url: photo.waysToAccess["public.jpeg"] 94 | }); 95 | 96 | } 97 | w.add(toolbar); 98 | w.open({ 99 | model:true, 100 | modalTransitionStyle:Ti.UI.iPhone.MODAL_TRANSITION_STYLE_COVER_VERTICAL, 101 | modalStyle:Ti.UI.iPhone.MODAL_PRESENTATION_FULLSCREEN, 102 | navBarHidden:false 103 | }); 104 | }); 105 | } 106 | 107 | function updateTableView(photos) { 108 | var data = []; 109 | var row; 110 | for (var counter=0; counter < photos.length; counter++) { 111 | var photo = photos[counter]; 112 | var image = Ti.UI.createImageView({ 113 | image: photo.thumbnail, 114 | height: photo.thumbnail.height, 115 | width: photo.thumbnail.width, 116 | top: 0, 117 | left: 4 + ((counter % 4) * (photo.thumbnail.width +4)) 118 | }); 119 | var date = photo.creationDate.split("T"); 120 | var dateLabel = Ti.UI.createLabel({ 121 | text:date[0], 122 | font: { fontSize: 10}, 123 | bottom: 10, 124 | height: 10, 125 | left: 4 + ((counter % 4) * (photo.thumbnail.width +4)) 126 | }); 127 | var time = date[1].split("."); 128 | var timeLabel = Ti.UI.createLabel({ 129 | text:time[0], 130 | font: { fontSize: 10}, 131 | bottom: 0, 132 | height: 10, 133 | left: 4 + ((counter % 4) * (photo.thumbnail.width +4)) 134 | }); 135 | if (counter % 4 === 0) { 136 | row = Ti.UI.createTableViewRow({ 137 | height: 100, 138 | selectionStyle: Titanium.UI.iPhone.TableViewCellSelectionStyle.NONE 139 | }); 140 | data.push(row); 141 | } 142 | row.add(image); 143 | row.add(dateLabel); 144 | row.add(timeLabel); 145 | clickPhoto(image, photo); 146 | } 147 | tableView.setData(data); 148 | } 149 | 150 | function updateTableViewGroups(groups) { 151 | var data = []; 152 | var row; 153 | for (var counter=0; counter < groups.length; counter++) { 154 | var group = groups[counter]; 155 | var proportional = group.image.width / group.image.height; 156 | var height = 60; 157 | var width = 60 * proportional; 158 | var image = Ti.UI.createImageView({ 159 | image: group.image, 160 | height: height, 161 | width: width, 162 | top: 0, 163 | left: 0 164 | }); 165 | var nameLabel = Ti.UI.createLabel({ 166 | text:group.name + " ("+group.numImages+")", 167 | font: { fontSize: 16, fontWeight: 'bold'}, 168 | height: 15, 169 | left:100 170 | }); 171 | row = Ti.UI.createTableViewRow({ 172 | height: 60, 173 | selectionStyle: Titanium.UI.iPhone.TableViewCellSelectionStyle.NONE, 174 | hasChild: true 175 | }); 176 | data.push(row); 177 | row.add(image); 178 | row.add(nameLabel); 179 | clickGroup(row, group); 180 | } 181 | tableView.setData(data); 182 | } 183 | var groups = urbanimagelibrary.groups({ 184 | success: function(e) { 185 | Ti.API.debug("Number of groups returned: " + e.groups.length); 186 | Ti.API.debug(e.groups); 187 | updateTableViewGroups(e.groups); 188 | }, 189 | error: function(e) { 190 | Ti.API.error("An error occured! " + e); 191 | } 192 | }); 193 | 194 | 195 | window.open(); 196 | 197 | -------------------------------------------------------------------------------- /documentation/index.md: -------------------------------------------------------------------------------- 1 | # Urban Image Library Module 2 | 3 | ## Description 4 | 5 | The purpose of this library is to provide easy access to the user's photo library. 6 | Not only will it return the photos, but it will also return useful information about 7 | the photo. This library will return the following pieces of information about a photo: 8 | 9 | 1. The full resolution of the image 10 | 2. A thumbnail of the image 11 | 3. The type of file (image or video) 12 | 4. Location information including: 13 | 14 | latitude 15 | longitude 16 | altitude 17 | course 18 | horizontal accuracy 19 | vertical accuracy 20 | speed 21 | timestamp 22 | 23 | 5. If the file is a video it will return the duration 24 | 6. Orientation 25 | 7. Creation Date 26 | 8. Available file formats 27 | 9. Ways to access the file 28 | 29 | This library also provides a way to return certain groups of photos and to also return a 30 | section of photos based on start and end parameters. 31 | 32 | 33 | ## Accessing the Urban Image Library Module 34 | 35 | To access this module from JavaScript, you would do the following: 36 | 37 | var urbanimagelibrary = require("qs.urbanimage.library"); 38 | 39 | The urbanimagelibrary variable is a reference to the Module object. 40 | 41 | ## Reference 42 | 43 | ### Input Parameters 44 | 45 | The photolibrary.photos module can be called using the following parameters: 46 | 47 | #### type 48 | > The type of group you would like photos and videos to be returned from. For further 49 | > information see [Apple's documentation](http://developer.apple.com/library/IOs/#documentation/AssetsLibrary/Reference/ALAssetsLibrary_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40009722) 50 | 51 | Possible values are: 52 | library - The library group that includes all assets 53 | albums - All albums synced from iTunes 54 | events - All events synced from iTunes 55 | faces - All faces synced from iTunes 56 | photos - All photos 57 | all - Everything 58 | 59 | > The default is "photos" 60 | 61 | #### success 62 | 63 | > This is a callback that will be called once the photos have been gathered 64 | 65 | #### error 66 | 67 | > This is a callback that will be called if an error occurred while gathering the photos 68 | 69 | #### start 70 | 71 | > This will include all photos whose index is greater than or equal to the value passed 72 | > in to start. 73 | 74 | > The default is 0. 75 | 76 | #### end 77 | 78 | > This will include all photos whos index is less than or equal to the value passed in to 79 | > end. If end is set to 0, then there is no upper limit imposed. All remaining photos 80 | > will be included. 81 | 82 | > The default is 0. 83 | 84 | ### Output Parameters 85 | 86 | The module will return an array of objects in the "photos" attribute. 87 | 88 | #### image 89 | 90 | > The full resolution of the image. The image has also been properly rotated so that it is "pointing up". 91 | 92 | #### thumbnail 93 | 94 | > A thumbnail of the image. 95 | 96 | #### type 97 | 98 | > The type of file. This attribute can take on either "image", "video", or "unknown" 99 | 100 | #### location 101 | 102 | > Location information - See [Apple's documentation for the CLLocation class](http://developer.apple.com/library/IOs/#documentation/CoreLocation/Reference/CLLocation_Class/CLLocation/CLLocation.html#//apple_ref/occ/cl/CLLocation) 103 | 104 | The location object consists of the following attributes: 105 | latitude - The latitude 106 | longitude - The longitude 107 | altitude - The altitude measured in meters. 108 | course - The direction in which the device is traveling. 109 | horizontalAccuracy - The radius of uncertainty for the location, measured in meters. 110 | vertical accuracy - The accuracy of the altitude value in meters. 111 | speed - The instantaneous speed of the device in meters per second. 112 | timestamp - The time at which this location was determined. 113 | 114 | #### playTime 115 | 116 | > If the file is a video, it will return the play time duration of the video. If the file is not a video, then the "playTime" attribute is not returned. 117 | 118 | #### orientation 119 | 120 | The corresponding value contains the photo's orientation as described by the TIFF format. 121 | The TIFF specification can be found at (http://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf) 122 | 123 | The orientation value can be any of the following values: 124 | 125 | 1 - The 0th row represents the visual top of the image, and the 0th column represents the visual left-hand side. 126 | 2 - The 0th row represents the visual top of the image, and the 0th column represents the visual right-hand side. 127 | 3 - The 0th row represents the visual bottom of the image, and the 0th column represents the visual right-hand side. 128 | 4 - The 0th row represents the visual bottom of the image, and the 0th column represents the visual left-hand side. 129 | 5 - The 0th row represents the visual left-hand side of the image, and the 0th column represents the visual top. 130 | 6 - The 0th row represents the visual right-hand side of the image, and the 0th column represents the visual top. 131 | 7 - The 0th row represents the visual right-hand side of the image, and the 0th column represents the visual bottom. 132 | 8 - The 0th row represents the visual left-hand side of the image, and the 0th column represents the visual bottom. 133 | 134 | #### creationDate 135 | 136 | > The date the photo was created. This is returned as a string in UTC format. 137 | 138 | #### availableFormats 139 | 140 | > This is a collection of different formats that are available, i.e. jpeg. 141 | 142 | #### waysToAccess 143 | 144 | > This is a collection of URLs that could be used to access the photo. 145 | 146 | 147 | ## Usage 148 | 149 | It is very simple to use the module. After registering the module with the application, add 150 | the following code to your project: 151 | 152 | var photolibrary = require('qs.photos.library'); 153 | var photos = photolibrary.photos({ 154 | success: function(e) { 155 | Ti.API.debug(e.photos); 156 | }, 157 | error: function(e) { 158 | Ti.API.error("An error occured! " + e); 159 | } 160 | }); 161 | 162 | This will load the Photo Library module and will return all saved photos on the device. 163 | 164 | ## Author 165 | 166 | Quickstone Software, LLC 167 | 168 | ## License 169 | 170 | Licensed under the Apache License, Version 2.0 (the "License"); 171 | you may not use this file except in compliance with the License. 172 | You may obtain a copy of the License at 173 | 174 | http://www.apache.org/licenses/LICENSE-2.0 175 | 176 | Unless required by applicable law or agreed to in writing, software 177 | distributed under the License is distributed on an "AS IS" BASIS, 178 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 179 | See the License for the specific language governing permissions and 180 | limitations under the License. 181 | -------------------------------------------------------------------------------- /Classes/QsUrbanimageLibraryModule.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2012 Quickstone Software, LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. */ 15 | 16 | #import "QsUrbanimageLibraryModule.h" 17 | #import "TiBase.h" 18 | #import "TiHost.h" 19 | #import "TiUtils.h" 20 | 21 | @implementation QsUrbanimageLibraryModule 22 | @synthesize assetLibrary, assetGroups; 23 | 24 | #pragma mark Internal 25 | 26 | // this is generated for your module, please do not change it 27 | -(id)moduleGUID 28 | { 29 | return @"c6d0f327-80e0-400f-929c-012ece34ec98"; 30 | } 31 | 32 | // this is generated for your module, please do not change it 33 | -(NSString*)moduleId 34 | { 35 | return @"qs.urbanimage.library"; 36 | } 37 | 38 | #pragma mark Lifecycle 39 | 40 | -(void)startup 41 | { 42 | // this method is called when the module is first loaded 43 | // you *must* call the superclass 44 | assetLibrary = [[ALAssetsLibrary alloc] init]; 45 | [super startup]; 46 | NSLog(@"[INFO] %@ loaded",self); 47 | } 48 | 49 | -(void)shutdown:(id)sender 50 | { 51 | // this method is called when the module is being unloaded 52 | // typically this is during shutdown. make sure you don't do too 53 | // much processing here or the app will be quit forceably 54 | 55 | // you *must* call the superclass 56 | [super shutdown:sender]; 57 | } 58 | 59 | #pragma mark Cleanup 60 | 61 | -(void)dealloc 62 | { 63 | // release any resources that have been retained by the module 64 | RELEASE_TO_NIL(assetLibrary); 65 | [super dealloc]; 66 | } 67 | 68 | #pragma mark Internal Memory Management 69 | 70 | -(void)didReceiveMemoryWarning:(NSNotification*)notification 71 | { 72 | // optionally release any resources that can be dynamically 73 | // reloaded once memory is available - such as caches 74 | [super didReceiveMemoryWarning:notification]; 75 | } 76 | 77 | #pragma mark Listener Notifications 78 | 79 | -(void)_listenerAdded:(NSString *)type count:(int)count 80 | { 81 | if (count == 1 && [type isEqualToString:@"my_event"]) 82 | { 83 | // the first (of potentially many) listener is being added 84 | // for event named 'my_event' 85 | } 86 | } 87 | 88 | -(void)_listenerRemoved:(NSString *)type count:(int)count 89 | { 90 | if (count == 0 && [type isEqualToString:@"my_event"]) 91 | { 92 | // the last listener called for event named 'my_event' has 93 | // been removed, we can optionally clean up any resources 94 | // since no body is listening at this point for that event 95 | } 96 | } 97 | 98 | #pragma Public APIs 99 | 100 | -(void)groups:(id)args 101 | { 102 | ENSURE_UI_THREAD_1_ARG(args); 103 | ENSURE_SINGLE_ARG(args, NSDictionary); 104 | 105 | id error = [args objectForKey:@"error"]; 106 | RELEASE_TO_NIL(errorCallback); 107 | 108 | id success = [args objectForKey:@"success"]; 109 | RELEASE_TO_NIL(successCallback); 110 | 111 | errorCallback = [error retain]; 112 | successCallback = [success retain]; 113 | 114 | assetLibrary = [[ALAssetsLibrary alloc] init]; 115 | 116 | 117 | NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 118 | NSMutableArray *tempArray = [[NSMutableArray alloc] init]; 119 | self.assetGroups = tempArray; 120 | [tempArray release]; 121 | 122 | NSMutableArray *tempGroupArray = [[[NSMutableArray alloc] init] autorelease]; 123 | 124 | void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) 125 | { 126 | if (group != nil) { 127 | [self.assetGroups addObject:group]; 128 | [tempGroupArray addObject:[self buildGroupProperties:group index:[self.assetGroups count]-1]]; 129 | if (successCallback) { 130 | NSDictionary *event = [NSDictionary dictionaryWithObjectsAndKeys: 131 | tempGroupArray, @"groups", nil]; 132 | [self _fireEventToListener:@"success" withObject:event listener:successCallback thisObject:nil]; 133 | } 134 | } 135 | 136 | }; 137 | 138 | [assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll 139 | usingBlock:assetGroupEnumerator 140 | failureBlock:^(NSError *error){ 141 | if (errorCallback) 142 | [self _fireEventToListener:@"error" withObject:error listener:errorCallback thisObject:nil]; 143 | }]; 144 | 145 | 146 | 147 | [pool release]; 148 | 149 | } 150 | 151 | 152 | -(void)photos:(id)args 153 | { 154 | ENSURE_UI_THREAD_1_ARG(args); 155 | ENSURE_SINGLE_ARG(args, NSDictionary); 156 | 157 | NSString *type = [args objectForKey:@"type"]; 158 | ENSURE_STRING_OR_NIL(type); 159 | 160 | id error = [args objectForKey:@"error"]; 161 | RELEASE_TO_NIL(errorCallback); 162 | 163 | id success = [args objectForKey:@"success"]; 164 | RELEASE_TO_NIL(successCallback); 165 | 166 | errorCallback = [error retain]; 167 | successCallback = [success retain]; 168 | 169 | NSUInteger start = [TiUtils intValue:[args objectForKey:@"start"]]; 170 | NSUInteger end = [TiUtils intValue:[args objectForKey:@"end"]]; 171 | Boolean includeFullSizeImage = [TiUtils boolValue:[args objectForKey:@"includeFullSizeImage"] def:true]; 172 | NSUInteger groupId = [TiUtils intValue:[args objectForKey:@"groupId"] def:-1]; 173 | 174 | // Determine if the groupId actually exists 175 | if (groupId > [self.assetGroups count] -1) { 176 | groupId = -1; 177 | } 178 | 179 | if (type == nil) 180 | type = @"photos"; 181 | 182 | NSUInteger assetGroupType = ALAssetsGroupSavedPhotos; 183 | 184 | if ([@"library" caseInsensitiveCompare:type] == NSOrderedSame) 185 | assetGroupType = ALAssetsGroupLibrary; 186 | else if ([@"albums" caseInsensitiveCompare:type] == NSOrderedSame) 187 | assetGroupType = ALAssetsGroupAlbum; 188 | else if ([@"events" caseInsensitiveCompare:type] == NSOrderedSame) 189 | assetGroupType = ALAssetsGroupEvent; 190 | else if ([@"faces" caseInsensitiveCompare:type] == NSOrderedSame) 191 | assetGroupType = ALAssetsGroupFaces; 192 | else if ([@"photos" caseInsensitiveCompare:type] == NSOrderedSame) 193 | assetGroupType = ALAssetsGroupSavedPhotos; 194 | else if ([@"all" caseInsensitiveCompare:type] == NSOrderedSame) 195 | assetGroupType = ALAssetsGroupAll; 196 | 197 | [self buildAssets:assetGroupType groupId:groupId start:start end:end includeFullSizeImage:includeFullSizeImage]; 198 | } 199 | 200 | -(void)photo:(id)args 201 | { 202 | ENSURE_UI_THREAD_1_ARG(args); 203 | ENSURE_SINGLE_ARG(args, NSDictionary); 204 | 205 | NSString *url = [args objectForKey:@"url"]; 206 | ENSURE_STRING_OR_NIL(url); 207 | 208 | id error = [args objectForKey:@"error"]; 209 | RELEASE_TO_NIL(errorCallback); 210 | 211 | id success = [args objectForKey:@"success"]; 212 | RELEASE_TO_NIL(successCallback); 213 | 214 | errorCallback = [error retain]; 215 | successCallback = [success retain]; 216 | 217 | if (url) 218 | { 219 | NSURL *imageRefURL = [NSURL URLWithString:url]; 220 | void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *) = ^(ALAsset *result) 221 | { 222 | NSDictionary *event = [NSDictionary dictionaryWithObjectsAndKeys: 223 | [self buildProperties:result includeFullSizeImage:true], @"photo", nil]; 224 | 225 | [self _fireEventToListener:@"success" withObject:event listener:successCallback thisObject:nil]; 226 | }; 227 | 228 | 229 | NSLog(@"%@",imageRefURL); 230 | [assetLibrary assetForURL:imageRefURL 231 | resultBlock:ALAssetsLibraryAssetForURLResultBlock 232 | failureBlock:^(NSError *error){ 233 | if (errorCallback) 234 | [self _fireEventToListener:@"error" withObject:error listener:errorCallback thisObject:nil]; 235 | }]; 236 | } 237 | 238 | } 239 | 240 | -(void)buildAssets:(NSUInteger) assetGroupType groupId:(NSInteger)groupId start:(NSUInteger)start end:(NSUInteger)end includeFullSizeImage:(Boolean)includeFullSizeImage 241 | { 242 | 243 | NSMutableArray *assets = [[[NSMutableArray alloc] init] autorelease]; 244 | 245 | NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 246 | void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = 247 | ^(ALAsset *result, NSUInteger index, BOOL *stop) 248 | { 249 | if(result != nil) { 250 | if (index >= start) 251 | { 252 | if (end > 0 && index > end) *stop = YES; 253 | 254 | [assets addObject:[self buildProperties:result includeFullSizeImage:includeFullSizeImage]]; 255 | } 256 | } 257 | }; 258 | [pool release]; 259 | 260 | void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = 261 | ^(ALAssetsGroup *group, BOOL *stop) 262 | { 263 | if(group != nil) { 264 | [group enumerateAssetsUsingBlock:assetEnumerator]; 265 | if (successCallback) { 266 | NSDictionary *event = [NSDictionary dictionaryWithObjectsAndKeys: 267 | assets, @"photos", nil]; 268 | [self _fireEventToListener:@"success" withObject:event listener:successCallback thisObject:nil]; 269 | } 270 | } 271 | }; 272 | 273 | if(groupId < 0) { 274 | [assetLibrary enumerateGroupsWithTypes:assetGroupType 275 | usingBlock:assetGroupEnumerator 276 | failureBlock: ^(NSError *error) { 277 | if (errorCallback) 278 | [self _fireEventToListener:@"error" withObject:error listener:errorCallback thisObject:nil]; 279 | }]; 280 | } else { 281 | ALAssetsGroup *assetGroup = [self.assetGroups objectAtIndex:groupId]; 282 | [assetGroup enumerateAssetsUsingBlock:assetEnumerator]; 283 | if (successCallback) { 284 | NSDictionary *event = [NSDictionary dictionaryWithObjectsAndKeys: 285 | assets, @"photos", nil]; 286 | [self _fireEventToListener:@"success" withObject:event listener:successCallback thisObject:nil]; 287 | } 288 | } 289 | 290 | 291 | } 292 | 293 | -(NSDictionary*)buildGroupProperties:(ALAssetsGroup*)groupAsset index:(NSUInteger)index 294 | { 295 | NSMutableDictionary *props = [NSMutableDictionary dictionary]; 296 | 297 | [groupAsset setAssetsFilter:[ALAssetsFilter allPhotos]]; 298 | 299 | NSInteger count = [groupAsset numberOfAssets]; 300 | NSString *name = [groupAsset valueForProperty:ALAssetsGroupPropertyName]; 301 | UIImage *posterImage = [UIImage imageWithCGImage:[groupAsset posterImage]]; 302 | 303 | 304 | [props setObject:[NSNumber numberWithInt:index] forKey:@"id"]; 305 | [props setObject:[NSNumber numberWithInt:count] forKey:@"numImages"]; 306 | [props setObject:name forKey:@"name"]; 307 | [props setObject:[[[TiBlob alloc] initWithImage:posterImage] autorelease] 308 | forKey:@"image"]; 309 | 310 | return props; 311 | } 312 | 313 | -(NSDictionary*)buildProperties:(ALAsset*)asset includeFullSizeImage:(Boolean)includeFullSizeImage 314 | { 315 | NSMutableDictionary *props = [NSMutableDictionary dictionary]; 316 | 317 | if (includeFullSizeImage) 318 | { 319 | ALAssetRepresentation *rep = [asset defaultRepresentation]; 320 | CGImageRef fullImageRef = [rep fullResolutionImage]; 321 | 322 | if (fullImageRef) { 323 | UIImageOrientation orientation = UIImageOrientationUp; 324 | 325 | 326 | int sourceOrientation = [[asset valueForProperty:ALAssetPropertyOrientation] intValue]; 327 | 328 | if (sourceOrientation == 0) // Up 329 | orientation = UIImageOrientationUp; 330 | if (sourceOrientation == 1) // Down 331 | orientation = UIImageOrientationDown; 332 | else if (sourceOrientation == 2) //Right 333 | orientation = UIImageOrientationLeft; 334 | if (sourceOrientation == 3) // Left 335 | orientation = UIImageOrientationRight; 336 | else if (sourceOrientation == 4) // Up Mirrored 337 | orientation = UIImageOrientationUpMirrored; 338 | else if (sourceOrientation == 5) // Down Mirrored 339 | orientation = UIImageOrientationDownMirrored; 340 | else if (sourceOrientation == 6) // Left Mirrored 341 | orientation = UIImageOrientationLeftMirrored; 342 | else if (sourceOrientation == 7) // Right Mirrored 343 | orientation = UIImageOrientationRightMirrored; 344 | 345 | UIImage *fullImage = [UIImage imageWithCGImage:fullImageRef scale:1.0 orientation:orientation]; 346 | [props setObject:[[[TiBlob alloc] initWithImage:fullImage] autorelease] 347 | forKey:@"image"]; 348 | } 349 | } 350 | 351 | CGImageRef thumbnailRef = [asset thumbnail]; 352 | if (thumbnailRef) 353 | { 354 | UIImage *thumbnail = [UIImage imageWithCGImage:thumbnailRef]; 355 | [props setObject:[[[TiBlob alloc] initWithImage:thumbnail] autorelease] 356 | forKey:@"thumbnail"]; 357 | } 358 | 359 | NSString *assetPropertyType = [asset valueForProperty:ALAssetPropertyType]; 360 | NSString *type = nil; 361 | 362 | if ([@"ALAssetTypePhoto" isEqualToString:assetPropertyType]) 363 | type = @"photo"; 364 | else if ([@"ALAssetTypeVideo" isEqualToString:assetPropertyType]) 365 | type = @"video"; 366 | else 367 | type = @"unknown"; 368 | 369 | [props setObject:type forKey:@"type"]; 370 | 371 | CLLocation *location = [asset valueForProperty:ALAssetPropertyLocation]; 372 | CLLocationCoordinate2D latlon = [location coordinate]; 373 | if (!isnan(latlon.latitude) && !(isnan(latlon.longitude))) 374 | { 375 | [props setObject: [NSDictionary dictionaryWithObjectsAndKeys: 376 | [NSNumber numberWithFloat:latlon.latitude], @"latitude", 377 | [NSNumber numberWithFloat:latlon.longitude], @"longitude", 378 | [location altitude], @"altitude", 379 | [location course], @"course", 380 | [location horizontalAccuracy], @"horizontalAccuracy", 381 | [location verticalAccuracy], @"verticalAccuracy", 382 | [location speed], @"speed", 383 | [location timestamp], @"timestamp", 384 | nil] 385 | forKey: @"location"]; 386 | } 387 | 388 | if ([[asset valueForProperty:ALAssetPropertyDuration] isKindOfClass:[NSNumber class]]) 389 | [props setObject:[asset valueForProperty:ALAssetPropertyDuration] forKey:@"playTime"]; 390 | 391 | [props setObject:[asset valueForProperty:ALAssetPropertyOrientation] forKey:@"orientation"]; 392 | [props setObject:[TiUtils UTCDateForDate:[asset valueForProperty:ALAssetPropertyDate]] forKey:@"creationDate"]; 393 | [props setObject:[asset valueForProperty:ALAssetPropertyRepresentations] forKey:@"availableFormats"]; 394 | [props setObject:[asset valueForProperty:ALAssetPropertyURLs] forKey:@"waysToAccess"]; 395 | 396 | 397 | return props; 398 | } 399 | 400 | @end 401 | -------------------------------------------------------------------------------- /urbanimagelibrary.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 45; 7 | objects = { 8 | 9 | /* Begin PBXAggregateTarget section */ 10 | 24416B8111C4CA220047AFDD /* Build & Test */ = { 11 | isa = PBXAggregateTarget; 12 | buildConfigurationList = 24416B8A11C4CA520047AFDD /* Build configuration list for PBXAggregateTarget "Build & Test" */; 13 | buildPhases = ( 14 | 24416B8011C4CA220047AFDD /* ShellScript */, 15 | ); 16 | dependencies = ( 17 | 24416B8511C4CA280047AFDD /* PBXTargetDependency */, 18 | ); 19 | name = "Build & Test"; 20 | productName = "Build & test"; 21 | }; 22 | /* End PBXAggregateTarget section */ 23 | 24 | /* Begin PBXBuildFile section */ 25 | 24DD6CF91134B3F500162E58 /* QsUrbanimageLibraryModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 24DD6CF71134B3F500162E58 /* QsUrbanimageLibraryModule.h */; }; 26 | 24DD6CFA1134B3F500162E58 /* QsUrbanimageLibraryModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 24DD6CF81134B3F500162E58 /* QsUrbanimageLibraryModule.m */; }; 27 | 24DE9E1111C5FE74003F90F6 /* QsUrbanimageLibraryModuleAssets.h in Headers */ = {isa = PBXBuildFile; fileRef = 24DE9E0F11C5FE74003F90F6 /* QsUrbanimageLibraryModuleAssets.h */; }; 28 | 24DE9E1211C5FE74003F90F6 /* QsUrbanimageLibraryModuleAssets.m in Sources */ = {isa = PBXBuildFile; fileRef = 24DE9E1011C5FE74003F90F6 /* QsUrbanimageLibraryModuleAssets.m */; }; 29 | 3F5D3C8914D36F4F0003A89B /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F5D3C8714D36F4F0003A89B /* AssetsLibrary.framework */; }; 30 | 3F5D3C8A14D36F4F0003A89B /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F5D3C8814D36F4F0003A89B /* CoreLocation.framework */; }; 31 | AA747D9F0F9514B9006C5449 /* QsUrbanimageLibrary_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = AA747D9E0F9514B9006C5449 /* QsUrbanimageLibrary_Prefix.pch */; }; 32 | AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; }; 33 | /* End PBXBuildFile section */ 34 | 35 | /* Begin PBXContainerItemProxy section */ 36 | 24416B8411C4CA280047AFDD /* PBXContainerItemProxy */ = { 37 | isa = PBXContainerItemProxy; 38 | containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; 39 | proxyType = 1; 40 | remoteGlobalIDString = D2AAC07D0554694100DB518D; 41 | remoteInfo = urbanimagelibrary; 42 | }; 43 | /* End PBXContainerItemProxy section */ 44 | 45 | /* Begin PBXFileReference section */ 46 | 24DD6CF71134B3F500162E58 /* QsUrbanimageLibraryModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = QsUrbanimageLibraryModule.h; path = Classes/QsUrbanimageLibraryModule.h; sourceTree = ""; }; 47 | 24DD6CF81134B3F500162E58 /* QsUrbanimageLibraryModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = QsUrbanimageLibraryModule.m; path = Classes/QsUrbanimageLibraryModule.m; sourceTree = ""; }; 48 | 24DD6D1B1134B66800162E58 /* titanium.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = titanium.xcconfig; sourceTree = ""; }; 49 | 24DE9E0F11C5FE74003F90F6 /* QsUrbanimageLibraryModuleAssets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = QsUrbanimageLibraryModuleAssets.h; path = Classes/QsUrbanimageLibraryModuleAssets.h; sourceTree = ""; }; 50 | 24DE9E1011C5FE74003F90F6 /* QsUrbanimageLibraryModuleAssets.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = QsUrbanimageLibraryModuleAssets.m; path = Classes/QsUrbanimageLibraryModuleAssets.m; sourceTree = ""; }; 51 | 3F5D3C8714D36F4F0003A89B /* AssetsLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AssetsLibrary.framework; path = System/Library/Frameworks/AssetsLibrary.framework; sourceTree = SDKROOT; }; 52 | 3F5D3C8814D36F4F0003A89B /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; 53 | AA747D9E0F9514B9006C5449 /* QsUrbanimageLibrary_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QsUrbanimageLibrary_Prefix.pch; sourceTree = SOURCE_ROOT; }; 54 | AACBBE490F95108600F1A2B1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 55 | D2AAC07E0554694100DB518D /* libQsUrbanimageLibrary.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libQsUrbanimageLibrary.a; sourceTree = BUILT_PRODUCTS_DIR; }; 56 | /* End PBXFileReference section */ 57 | 58 | /* Begin PBXFrameworksBuildPhase section */ 59 | D2AAC07C0554694100DB518D /* Frameworks */ = { 60 | isa = PBXFrameworksBuildPhase; 61 | buildActionMask = 2147483647; 62 | files = ( 63 | 3F5D3C8914D36F4F0003A89B /* AssetsLibrary.framework in Frameworks */, 64 | 3F5D3C8A14D36F4F0003A89B /* CoreLocation.framework in Frameworks */, 65 | AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */, 66 | ); 67 | runOnlyForDeploymentPostprocessing = 0; 68 | }; 69 | /* End PBXFrameworksBuildPhase section */ 70 | 71 | /* Begin PBXGroup section */ 72 | 034768DFFF38A50411DB9C8B /* Products */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | D2AAC07E0554694100DB518D /* libQsUrbanimageLibrary.a */, 76 | ); 77 | name = Products; 78 | sourceTree = ""; 79 | }; 80 | 0867D691FE84028FC02AAC07 /* urbanimagelibrary */ = { 81 | isa = PBXGroup; 82 | children = ( 83 | 08FB77AEFE84172EC02AAC07 /* Classes */, 84 | 32C88DFF0371C24200C91783 /* Other Sources */, 85 | 0867D69AFE84028FC02AAC07 /* Frameworks */, 86 | 034768DFFF38A50411DB9C8B /* Products */, 87 | ); 88 | name = urbanimagelibrary; 89 | sourceTree = ""; 90 | }; 91 | 0867D69AFE84028FC02AAC07 /* Frameworks */ = { 92 | isa = PBXGroup; 93 | children = ( 94 | 3F5D3C8714D36F4F0003A89B /* AssetsLibrary.framework */, 95 | 3F5D3C8814D36F4F0003A89B /* CoreLocation.framework */, 96 | AACBBE490F95108600F1A2B1 /* Foundation.framework */, 97 | ); 98 | name = Frameworks; 99 | sourceTree = ""; 100 | }; 101 | 08FB77AEFE84172EC02AAC07 /* Classes */ = { 102 | isa = PBXGroup; 103 | children = ( 104 | 24DE9E0F11C5FE74003F90F6 /* QsUrbanimageLibraryModuleAssets.h */, 105 | 24DE9E1011C5FE74003F90F6 /* QsUrbanimageLibraryModuleAssets.m */, 106 | 24DD6CF71134B3F500162E58 /* QsUrbanimageLibraryModule.h */, 107 | 24DD6CF81134B3F500162E58 /* QsUrbanimageLibraryModule.m */, 108 | ); 109 | name = Classes; 110 | sourceTree = ""; 111 | }; 112 | 32C88DFF0371C24200C91783 /* Other Sources */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | AA747D9E0F9514B9006C5449 /* QsUrbanimageLibrary_Prefix.pch */, 116 | 24DD6D1B1134B66800162E58 /* titanium.xcconfig */, 117 | ); 118 | name = "Other Sources"; 119 | sourceTree = ""; 120 | }; 121 | /* End PBXGroup section */ 122 | 123 | /* Begin PBXHeadersBuildPhase section */ 124 | D2AAC07A0554694100DB518D /* Headers */ = { 125 | isa = PBXHeadersBuildPhase; 126 | buildActionMask = 2147483647; 127 | files = ( 128 | AA747D9F0F9514B9006C5449 /* QsUrbanimageLibrary_Prefix.pch in Headers */, 129 | 24DD6CF91134B3F500162E58 /* QsUrbanimageLibraryModule.h in Headers */, 130 | 24DE9E1111C5FE74003F90F6 /* QsUrbanimageLibraryModuleAssets.h in Headers */, 131 | ); 132 | runOnlyForDeploymentPostprocessing = 0; 133 | }; 134 | /* End PBXHeadersBuildPhase section */ 135 | 136 | /* Begin PBXNativeTarget section */ 137 | D2AAC07D0554694100DB518D /* urbanimagelibrary */ = { 138 | isa = PBXNativeTarget; 139 | buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "urbanimagelibrary" */; 140 | buildPhases = ( 141 | D2AAC07A0554694100DB518D /* Headers */, 142 | D2AAC07B0554694100DB518D /* Sources */, 143 | D2AAC07C0554694100DB518D /* Frameworks */, 144 | ); 145 | buildRules = ( 146 | ); 147 | dependencies = ( 148 | ); 149 | name = urbanimagelibrary; 150 | productName = urbanimagelibrary; 151 | productReference = D2AAC07E0554694100DB518D /* libQsUrbanimageLibrary.a */; 152 | productType = "com.apple.product-type.library.static"; 153 | }; 154 | /* End PBXNativeTarget section */ 155 | 156 | /* Begin PBXProject section */ 157 | 0867D690FE84028FC02AAC07 /* Project object */ = { 158 | isa = PBXProject; 159 | buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "urbanimagelibrary" */; 160 | compatibilityVersion = "Xcode 3.1"; 161 | developmentRegion = English; 162 | hasScannedForEncodings = 1; 163 | knownRegions = ( 164 | English, 165 | Japanese, 166 | French, 167 | German, 168 | ); 169 | mainGroup = 0867D691FE84028FC02AAC07 /* urbanimagelibrary */; 170 | productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; 171 | projectDirPath = ""; 172 | projectRoot = ""; 173 | targets = ( 174 | D2AAC07D0554694100DB518D /* urbanimagelibrary */, 175 | 24416B8111C4CA220047AFDD /* Build & Test */, 176 | ); 177 | }; 178 | /* End PBXProject section */ 179 | 180 | /* Begin PBXShellScriptBuildPhase section */ 181 | 24416B8011C4CA220047AFDD /* ShellScript */ = { 182 | isa = PBXShellScriptBuildPhase; 183 | buildActionMask = 2147483647; 184 | files = ( 185 | ); 186 | inputPaths = ( 187 | ); 188 | outputPaths = ( 189 | ); 190 | runOnlyForDeploymentPostprocessing = 0; 191 | shellPath = /bin/sh; 192 | shellScript = "# shell script goes here\n\npython \"${TITANIUM_SDK}/titanium.py\" run --dir=\"${PROJECT_DIR}\"\nexit $?\n"; 193 | }; 194 | /* End PBXShellScriptBuildPhase section */ 195 | 196 | /* Begin PBXSourcesBuildPhase section */ 197 | D2AAC07B0554694100DB518D /* Sources */ = { 198 | isa = PBXSourcesBuildPhase; 199 | buildActionMask = 2147483647; 200 | files = ( 201 | 24DD6CFA1134B3F500162E58 /* QsUrbanimageLibraryModule.m in Sources */, 202 | 24DE9E1211C5FE74003F90F6 /* QsUrbanimageLibraryModuleAssets.m in Sources */, 203 | ); 204 | runOnlyForDeploymentPostprocessing = 0; 205 | }; 206 | /* End PBXSourcesBuildPhase section */ 207 | 208 | /* Begin PBXTargetDependency section */ 209 | 24416B8511C4CA280047AFDD /* PBXTargetDependency */ = { 210 | isa = PBXTargetDependency; 211 | target = D2AAC07D0554694100DB518D /* urbanimagelibrary */; 212 | targetProxy = 24416B8411C4CA280047AFDD /* PBXContainerItemProxy */; 213 | }; 214 | /* End PBXTargetDependency section */ 215 | 216 | /* Begin XCBuildConfiguration section */ 217 | 1DEB921F08733DC00010E9CD /* Debug */ = { 218 | isa = XCBuildConfiguration; 219 | baseConfigurationReference = 24DD6D1B1134B66800162E58 /* titanium.xcconfig */; 220 | buildSettings = { 221 | ARCHS = ( 222 | armv6, 223 | armv7, 224 | ); 225 | "ARCHS[sdk=iphoneos*]" = ( 226 | armv6, 227 | armv7, 228 | ); 229 | "ARCHS[sdk=iphonesimulator*]" = i386; 230 | CODE_SIGN_IDENTITY = "iPhone Developer"; 231 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 232 | DSTROOT = /tmp/QsUrbanimageLibrary.dst; 233 | GCC_C_LANGUAGE_STANDARD = c99; 234 | GCC_OPTIMIZATION_LEVEL = 0; 235 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 236 | GCC_PREFIX_HEADER = QsUrbanimageLibrary_Prefix.pch; 237 | GCC_PREPROCESSOR_DEFINITIONS = "TI_VERSION=$(TI_VERSION)"; 238 | GCC_TREAT_WARNINGS_AS_ERRORS = NO; 239 | GCC_VERSION = ""; 240 | GCC_WARN_ABOUT_RETURN_TYPE = NO; 241 | GCC_WARN_MISSING_PARENTHESES = NO; 242 | GCC_WARN_SHADOW = NO; 243 | GCC_WARN_STRICT_SELECTOR_MATCH = NO; 244 | GCC_WARN_UNUSED_FUNCTION = YES; 245 | GCC_WARN_UNUSED_PARAMETER = NO; 246 | GCC_WARN_UNUSED_VALUE = NO; 247 | GCC_WARN_UNUSED_VARIABLE = NO; 248 | INSTALL_PATH = /usr/local/lib; 249 | OTHER_CFLAGS = ( 250 | "-DDEBUG", 251 | "-DTI_POST_1_2", 252 | ); 253 | OTHER_LDFLAGS = "-ObjC"; 254 | PRODUCT_NAME = QsUrbanimageLibrary; 255 | PROVISIONING_PROFILE = ""; 256 | "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; 257 | RUN_CLANG_STATIC_ANALYZER = NO; 258 | SDKROOT = iphoneos; 259 | USER_HEADER_SEARCH_PATHS = ""; 260 | }; 261 | name = Debug; 262 | }; 263 | 1DEB922008733DC00010E9CD /* Release */ = { 264 | isa = XCBuildConfiguration; 265 | baseConfigurationReference = 24DD6D1B1134B66800162E58 /* titanium.xcconfig */; 266 | buildSettings = { 267 | ALWAYS_SEARCH_USER_PATHS = NO; 268 | ARCHS = ( 269 | armv6, 270 | armv7, 271 | ); 272 | "ARCHS[sdk=iphoneos*]" = ( 273 | armv6, 274 | armv7, 275 | ); 276 | "ARCHS[sdk=iphonesimulator*]" = i386; 277 | DSTROOT = /tmp/QsUrbanimageLibrary.dst; 278 | GCC_C_LANGUAGE_STANDARD = c99; 279 | GCC_MODEL_TUNING = G5; 280 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 281 | GCC_PREFIX_HEADER = QsUrbanimageLibrary_Prefix.pch; 282 | GCC_PREPROCESSOR_DEFINITIONS = "TI_VERSION=$(TI_VERSION)"; 283 | GCC_TREAT_WARNINGS_AS_ERRORS = NO; 284 | GCC_VERSION = ""; 285 | GCC_WARN_ABOUT_RETURN_TYPE = NO; 286 | GCC_WARN_MISSING_PARENTHESES = NO; 287 | GCC_WARN_SHADOW = NO; 288 | GCC_WARN_STRICT_SELECTOR_MATCH = NO; 289 | GCC_WARN_UNUSED_FUNCTION = YES; 290 | GCC_WARN_UNUSED_PARAMETER = NO; 291 | GCC_WARN_UNUSED_VALUE = NO; 292 | GCC_WARN_UNUSED_VARIABLE = NO; 293 | INSTALL_PATH = /usr/local/lib; 294 | IPHONEOS_DEPLOYMENT_TARGET = 4.0; 295 | OTHER_CFLAGS = "-DTI_POST_1_2"; 296 | OTHER_LDFLAGS = "-ObjC"; 297 | PRODUCT_NAME = QsUrbanimageLibrary; 298 | RUN_CLANG_STATIC_ANALYZER = NO; 299 | SDKROOT = iphoneos; 300 | USER_HEADER_SEARCH_PATHS = ""; 301 | }; 302 | name = Release; 303 | }; 304 | 1DEB922308733DC00010E9CD /* Debug */ = { 305 | isa = XCBuildConfiguration; 306 | baseConfigurationReference = 24DD6D1B1134B66800162E58 /* titanium.xcconfig */; 307 | buildSettings = { 308 | ARCHS = ( 309 | armv6, 310 | armv7, 311 | ); 312 | "ARCHS[sdk=iphoneos*]" = ( 313 | armv6, 314 | armv7, 315 | ); 316 | "ARCHS[sdk=iphonesimulator*]" = i386; 317 | CODE_SIGN_IDENTITY = "iPhone Developer"; 318 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 319 | DSTROOT = /tmp/QsUrbanimageLibrary.dst; 320 | GCC_C_LANGUAGE_STANDARD = c99; 321 | GCC_OPTIMIZATION_LEVEL = 0; 322 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 323 | GCC_PREFIX_HEADER = QsUrbanimageLibrary_Prefix.pch; 324 | GCC_PREPROCESSOR_DEFINITIONS = "TI_VERSION=$(TI_VERSION)"; 325 | GCC_TREAT_WARNINGS_AS_ERRORS = NO; 326 | GCC_VERSION = ""; 327 | GCC_WARN_ABOUT_RETURN_TYPE = NO; 328 | GCC_WARN_MISSING_PARENTHESES = NO; 329 | GCC_WARN_SHADOW = NO; 330 | GCC_WARN_STRICT_SELECTOR_MATCH = NO; 331 | GCC_WARN_UNUSED_FUNCTION = YES; 332 | GCC_WARN_UNUSED_PARAMETER = NO; 333 | GCC_WARN_UNUSED_VALUE = NO; 334 | GCC_WARN_UNUSED_VARIABLE = NO; 335 | INSTALL_PATH = /usr/local/lib; 336 | OTHER_CFLAGS = ( 337 | "-DDEBUG", 338 | "-DTI_POST_1_2", 339 | ); 340 | OTHER_LDFLAGS = "-ObjC"; 341 | PRODUCT_NAME = QsUrbanimageLibrary; 342 | PROVISIONING_PROFILE = ""; 343 | "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; 344 | RUN_CLANG_STATIC_ANALYZER = NO; 345 | SDKROOT = iphoneos; 346 | USER_HEADER_SEARCH_PATHS = ""; 347 | }; 348 | name = Debug; 349 | }; 350 | 1DEB922408733DC00010E9CD /* Release */ = { 351 | isa = XCBuildConfiguration; 352 | baseConfigurationReference = 24DD6D1B1134B66800162E58 /* titanium.xcconfig */; 353 | buildSettings = { 354 | ALWAYS_SEARCH_USER_PATHS = NO; 355 | ARCHS = ( 356 | armv6, 357 | armv7, 358 | ); 359 | "ARCHS[sdk=iphoneos*]" = ( 360 | armv6, 361 | armv7, 362 | ); 363 | "ARCHS[sdk=iphonesimulator*]" = i386; 364 | DSTROOT = /tmp/QsUrbanimageLibrary.dst; 365 | GCC_C_LANGUAGE_STANDARD = c99; 366 | GCC_MODEL_TUNING = G5; 367 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 368 | GCC_PREFIX_HEADER = QsUrbanimageLibrary_Prefix.pch; 369 | GCC_PREPROCESSOR_DEFINITIONS = "TI_VERSION=$(TI_VERSION)"; 370 | GCC_TREAT_WARNINGS_AS_ERRORS = NO; 371 | GCC_VERSION = ""; 372 | GCC_WARN_ABOUT_RETURN_TYPE = NO; 373 | GCC_WARN_MISSING_PARENTHESES = NO; 374 | GCC_WARN_SHADOW = NO; 375 | GCC_WARN_STRICT_SELECTOR_MATCH = NO; 376 | GCC_WARN_UNUSED_FUNCTION = YES; 377 | GCC_WARN_UNUSED_PARAMETER = NO; 378 | GCC_WARN_UNUSED_VALUE = NO; 379 | GCC_WARN_UNUSED_VARIABLE = NO; 380 | INSTALL_PATH = /usr/local/lib; 381 | IPHONEOS_DEPLOYMENT_TARGET = 4.0; 382 | OTHER_CFLAGS = "-DTI_POST_1_2"; 383 | OTHER_LDFLAGS = "-ObjC"; 384 | PRODUCT_NAME = QsUrbanimageLibrary; 385 | RUN_CLANG_STATIC_ANALYZER = NO; 386 | SDKROOT = iphoneos; 387 | USER_HEADER_SEARCH_PATHS = ""; 388 | }; 389 | name = Release; 390 | }; 391 | 24416B8211C4CA220047AFDD /* Debug */ = { 392 | isa = XCBuildConfiguration; 393 | baseConfigurationReference = 24DD6D1B1134B66800162E58 /* titanium.xcconfig */; 394 | buildSettings = { 395 | COPY_PHASE_STRIP = NO; 396 | GCC_DYNAMIC_NO_PIC = NO; 397 | GCC_OPTIMIZATION_LEVEL = 0; 398 | PRODUCT_NAME = "Build & test"; 399 | }; 400 | name = Debug; 401 | }; 402 | 24416B8311C4CA220047AFDD /* Release */ = { 403 | isa = XCBuildConfiguration; 404 | baseConfigurationReference = 24DD6D1B1134B66800162E58 /* titanium.xcconfig */; 405 | buildSettings = { 406 | COPY_PHASE_STRIP = YES; 407 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 408 | GCC_ENABLE_FIX_AND_CONTINUE = NO; 409 | PRODUCT_NAME = "Build & test"; 410 | ZERO_LINK = NO; 411 | }; 412 | name = Release; 413 | }; 414 | /* End XCBuildConfiguration section */ 415 | 416 | /* Begin XCConfigurationList section */ 417 | 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "urbanimagelibrary" */ = { 418 | isa = XCConfigurationList; 419 | buildConfigurations = ( 420 | 1DEB921F08733DC00010E9CD /* Debug */, 421 | 1DEB922008733DC00010E9CD /* Release */, 422 | ); 423 | defaultConfigurationIsVisible = 0; 424 | defaultConfigurationName = Release; 425 | }; 426 | 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "urbanimagelibrary" */ = { 427 | isa = XCConfigurationList; 428 | buildConfigurations = ( 429 | 1DEB922308733DC00010E9CD /* Debug */, 430 | 1DEB922408733DC00010E9CD /* Release */, 431 | ); 432 | defaultConfigurationIsVisible = 0; 433 | defaultConfigurationName = Release; 434 | }; 435 | 24416B8A11C4CA520047AFDD /* Build configuration list for PBXAggregateTarget "Build & Test" */ = { 436 | isa = XCConfigurationList; 437 | buildConfigurations = ( 438 | 24416B8211C4CA220047AFDD /* Debug */, 439 | 24416B8311C4CA220047AFDD /* Release */, 440 | ); 441 | defaultConfigurationIsVisible = 0; 442 | defaultConfigurationName = Release; 443 | }; 444 | /* End XCConfigurationList section */ 445 | }; 446 | rootObject = 0867D690FE84028FC02AAC07 /* Project object */; 447 | } 448 | --------------------------------------------------------------------------------