├── .gitignore ├── Classes ├── .gitignore ├── CoSaitenTiTestflightModule.h ├── CoSaitenTiTestflightModule.m ├── CoSaitenTiTestflightModuleAssets.h ├── CoSaitenTiTestflightModuleAssets.m ├── TestFlight.h └── libTestFlight.a ├── CoSaitenTiTestflight_Prefix.pch ├── LICENSE ├── README ├── assets └── README ├── build.py ├── documentation └── index.md ├── example └── app.js ├── hooks ├── README ├── add.py ├── install.py ├── remove.py └── uninstall.py ├── manifest ├── module.xcconfig ├── platform └── README ├── timodule.xml ├── titanium.xcconfig └── titestflight.xcodeproj └── project.pbxproj /.gitignore: -------------------------------------------------------------------------------- 1 | tmp 2 | bin 3 | build 4 | *.zip 5 | 6 | #xcode specific 7 | build/* 8 | *.pbxuser 9 | *.mode2v3 10 | *.mode1v3 11 | *.perspective 12 | *.perspectivev3 13 | *~.nib 14 | #ignore private workspace stuff added by Xcode4 15 | xcuserdata 16 | project.xcworkspace 17 | 18 | -------------------------------------------------------------------------------- /Classes/.gitignore: -------------------------------------------------------------------------------- 1 | CoSaitenTiTestflight.h 2 | CoSaitenTiTestflight.m 3 | -------------------------------------------------------------------------------- /Classes/CoSaitenTiTestflightModule.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Your Copyright Here 3 | * 4 | * Appcelerator Titanium is Copyright (c) 2009-2010 by Appcelerator, Inc. 5 | * and licensed under the Apache Public License (version 2) 6 | */ 7 | #import "TiModule.h" 8 | @interface CoSaitenTiTestflightModule : TiModule 9 | { 10 | } 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Classes/CoSaitenTiTestflightModule.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Your Copyright Here 3 | * 4 | * Appcelerator Titanium is Copyright (c) 2009-2010 by Appcelerator, Inc. 5 | * and licensed under the Apache Public License (version 2) 6 | */ 7 | #import "CoSaitenTiTestflightModule.h" 8 | #import "TiBase.h" 9 | #import "TiHost.h" 10 | #import "TiUtils.h" 11 | #import "TestFlight.h" 12 | 13 | @implementation CoSaitenTiTestflightModule 14 | 15 | #pragma mark Internal 16 | 17 | // this is generated for your module, please do not change it 18 | -(id)moduleGUID 19 | { 20 | return @"8beda686-5822-408e-873d-a111c6b94360"; 21 | } 22 | 23 | // this is generated for your module, please do not change it 24 | -(NSString*)moduleId 25 | { 26 | return @"co.saiten.ti.testflight"; 27 | } 28 | 29 | #pragma mark Lifecycle 30 | 31 | -(void)startup 32 | { 33 | // this method is called when the module is first loaded 34 | // you *must* call the superclass 35 | [super startup]; 36 | 37 | NSLog(@"[INFO] %@ loaded",self); 38 | } 39 | 40 | -(void)shutdown:(id)sender 41 | { 42 | // this method is called when the module is being unloaded 43 | // typically this is during shutdown. make sure you don't do too 44 | // much processing here or the app will be quit forceably 45 | 46 | // you *must* call the superclass 47 | [super shutdown:sender]; 48 | } 49 | 50 | #pragma mark Cleanup 51 | 52 | -(void)dealloc 53 | { 54 | // release any resources that have been retained by the module 55 | [super dealloc]; 56 | } 57 | 58 | #pragma mark Internal Memory Management 59 | 60 | -(void)didReceiveMemoryWarning:(NSNotification*)notification 61 | { 62 | // optionally release any resources that can be dynamically 63 | // reloaded once memory is available - such as caches 64 | [super didReceiveMemoryWarning:notification]; 65 | } 66 | 67 | #pragma mark Listener Notifications 68 | 69 | -(void)_listenerAdded:(NSString *)type count:(int)count 70 | { 71 | if (count == 1 && [type isEqualToString:@"my_event"]) 72 | { 73 | // the first (of potentially many) listener is being added 74 | // for event named 'my_event' 75 | } 76 | } 77 | 78 | -(void)_listenerRemoved:(NSString *)type count:(int)count 79 | { 80 | if (count == 0 && [type isEqualToString:@"my_event"]) 81 | { 82 | // the last listener called for event named 'my_event' has 83 | // been removed, we can optionally clean up any resources 84 | // since no body is listening at this point for that event 85 | } 86 | } 87 | 88 | #pragma Public APIs 89 | 90 | - (id)addCustomEnvironmentInformation:(id)args 91 | { 92 | ENSURE_UI_THREAD(addCustomEnvironmentInformation, args); 93 | 94 | ENSURE_ARG_COUNT(args, 2) 95 | id key = [args objectAtIndex:0]; 96 | id info = [args objectAtIndex:1]; 97 | ENSURE_STRING(key); 98 | ENSURE_STRING(info); 99 | [TestFlight addCustomEnvironmentInformation:info forKey:key]; 100 | return nil; 101 | } 102 | 103 | - (id)setOptions:(id)args 104 | { 105 | ENSURE_UI_THREAD(setOptions, args); 106 | 107 | ENSURE_ARG_COUNT(args, 1); 108 | id options = [args objectAtIndex:0]; 109 | ENSURE_DICT(options); 110 | [TestFlight setOptions:options]; 111 | return nil; 112 | } 113 | 114 | - (id)takeOff:(id)args 115 | { 116 | ENSURE_UI_THREAD(takeOff, args); 117 | 118 | ENSURE_ARG_COUNT(args, 1); 119 | id teamToken = [args objectAtIndex:0]; 120 | ENSURE_STRING(teamToken); 121 | [TestFlight takeOff:teamToken]; 122 | return nil; 123 | } 124 | 125 | - (id)openFeedbackView:(id)args 126 | { 127 | ENSURE_UI_THREAD(openFeedbackView, args); 128 | 129 | [TestFlight openFeedbackView]; 130 | return nil; 131 | } 132 | 133 | - (id)passCheckpoint:(id)args 134 | { 135 | ENSURE_UI_THREAD(passCheckpoint, args); 136 | 137 | ENSURE_ARG_COUNT(args, 1); 138 | id checkPoint = [args objectAtIndex:0]; 139 | ENSURE_STRING(checkPoint); 140 | [TestFlight passCheckpoint:checkPoint]; 141 | return nil; 142 | } 143 | 144 | @end 145 | -------------------------------------------------------------------------------- /Classes/CoSaitenTiTestflightModuleAssets.h: -------------------------------------------------------------------------------- 1 | /** 2 | * This is a generated file. Do not edit or your changes will be lost 3 | */ 4 | 5 | @interface CoSaitenTiTestflightModuleAssets : NSObject 6 | { 7 | } 8 | - (NSData*) moduleAsset; 9 | @end 10 | -------------------------------------------------------------------------------- /Classes/CoSaitenTiTestflightModuleAssets.m: -------------------------------------------------------------------------------- 1 | /** 2 | * This is a generated file. Do not edit or your changes will be lost 3 | */ 4 | #import "CoSaitenTiTestflightModuleAssets.h" 5 | 6 | extern NSData * dataWithHexString (NSString * hexString); 7 | 8 | @implementation CoSaitenTiTestflightModuleAssets 9 | 10 | - (NSData*) moduleAsset 11 | { 12 | return nil; 13 | } 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Classes/TestFlight.h: -------------------------------------------------------------------------------- 1 | // 2 | // TestFlight.h 3 | // libTestFlight 4 | // 5 | // Created by Colin Humber on 8/25/10. 6 | // Copyright 2010 23 Divide Apps. All rights reserved. 7 | 8 | #import 9 | 10 | @interface TestFlight : NSObject { 11 | 12 | } 13 | 14 | /** 15 | Add custom environment information 16 | If you want to track a user name from your application you can add it here 17 | */ 18 | + (void)addCustomEnvironmentInformation:(NSString *)information forKey:(NSString*)key; 19 | 20 | /** 21 | Starts a TestFlight session 22 | */ 23 | + (void)takeOff:(NSString *)teamToken; 24 | 25 | /** 26 | Sets custom options 27 | Option Accepted Values Description 28 | reinstallCrashHandlers [NSNumber numberWithBool:YES] Reinstalls crash handlers, to be used if a third party 29 | library installs crash handlers overtop of the TestFlight Crash Handlers 30 | */ 31 | + (void)setOptions:(NSDictionary*)options; 32 | 33 | /** 34 | Track when a user has passed a checkpoint after the flight has taken off. Eg. passed level 1, posted high score 35 | */ 36 | + (void)passCheckpoint:(NSString *)checkpointName; 37 | 38 | /** 39 | Opens a feeback window that is not attached to a checkpoint 40 | */ 41 | + (void)openFeedbackView; 42 | 43 | @end 44 | -------------------------------------------------------------------------------- /Classes/libTestFlight.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tryden/TiTestFlight/d86448745de0df031c70c6bc6deb151a1c30600a/Classes/libTestFlight.a -------------------------------------------------------------------------------- /CoSaitenTiTestflight_Prefix.pch: -------------------------------------------------------------------------------- 1 | 2 | #ifdef __OBJC__ 3 | #import 4 | #endif 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | TODO: place your license here and we'll include it in the module distribution 2 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | Appcelerator Titanium iPhone Module Project 2 | =========================================== 3 | 4 | This is a skeleton Titanium Mobile iPhone module project. Modules can be 5 | used to extend the functionality of Titanium by providing additional native 6 | code that is compiled into your application at build time and can expose certain 7 | APIs into JavaScript. 8 | 9 | MODULE NAMING 10 | -------------- 11 | 12 | Choose a unique module id for your module. This ID usually follows a namespace 13 | convention using DNS notation. For example, com.appcelerator.module.test. This 14 | ID can only be used once by all public modules in Titanium. 15 | 16 | 17 | COMPONENTS 18 | ----------- 19 | 20 | Components that are exposed by your module must follow a special naming convention. 21 | A component (widget, proxy, etc) must be named with the pattern: 22 | 23 | TiProxy 24 | 25 | For example, if you component was called Foo, your proxy would be named: 26 | 27 | TiMyfirstFooProxy 28 | 29 | For view proxies or widgets, you must create both a view proxy and a view implementation. 30 | If you widget was named proxy, you would create the following files: 31 | 32 | TiMyfirstFooProxy.h 33 | TiMyfirstFooProxy.m 34 | TiMyfirstFoo.h 35 | TiMyfirstFoo.m 36 | 37 | The view implementation is named the same except it does contain the suffix `Proxy`. 38 | 39 | View implementations extend the Titanium base class `TiUIView`. View Proxies extend the 40 | Titanium base class `TiUIViewProxy` or `TiUIWidgetProxy`. 41 | 42 | For proxies that are simply native objects that can be returned to JavaScript, you can 43 | simply extend `TiProxy` and no view implementation is required. 44 | 45 | 46 | GET STARTED 47 | ------------ 48 | 49 | 1. Edit manifest with the appropriate details about your module. 50 | 2. Edit LICENSE to add your license details. 51 | 3. Place any assets (such as PNG files) that are required in the assets folder. 52 | 4. Edit the titanium.xcconfig and make sure you're building for the right Titanium version. 53 | 5. Code and build. 54 | 55 | BUILD TIME COMPILER CONFIG 56 | -------------------------- 57 | 58 | You can edit the file `module.xcconfig` to include any build time settings that should be 59 | set during application compilation that your module requires. This file will automatically get `#include` in the main application project. 60 | 61 | For more information about this file, please see the Apple documentation at: 62 | 63 | 64 | 65 | 66 | DOCUMENTATION FOR YOUR MODULE 67 | ----------------------------- 68 | 69 | You should provide at least minimal documentation for your module in `documentation` folder using the Markdown syntax. 70 | 71 | For more information on the Markdown syntax, refer to this documentation at: 72 | 73 | 74 | 75 | 76 | TEST HARNESS EXAMPLE FOR YOUR MODULE 77 | ------------------------------------ 78 | 79 | The `example` directory contains a skeleton application test harness that can be 80 | used for testing and providing an example of usage to the users of your module. 81 | 82 | 83 | INSTALL YOUR MODULE 84 | -------------------- 85 | 86 | 1. Run `build.py` which creates your distribution 87 | 2. cd to `/Library/Application Support/Titanium` 88 | 3. copy this zip file into the folder of your Titanium SDK 89 | 90 | REGISTER YOUR MODULE 91 | --------------------- 92 | 93 | Register your module with your application by editing `tiapp.xml` and adding your module. 94 | Example: 95 | 96 | 97 | co.saiten.ti.testflight 98 | 99 | 100 | When you run your project, the compiler will know automatically compile in your module 101 | dependencies and copy appropriate image assets into the application. 102 | 103 | USING YOUR MODULE IN CODE 104 | ------------------------- 105 | 106 | To use your module in code, you will need to require it. 107 | 108 | For example, 109 | 110 | var my_module = require('co.saiten.ti.testflight'); 111 | my_module.foo(); 112 | 113 | WRITING PURE JS NATIVE MODULES 114 | ------------------------------ 115 | 116 | You can write a pure JavaScript "natively compiled" module. This is nice if you 117 | want to distribute a JS module pre-compiled. 118 | 119 | To create a module, create a file named co.saiten.ti.testflight.js under the assets folder. 120 | This file must be in the Common JS format. For example: 121 | 122 | exports.echo = function(s) 123 | { 124 | return s; 125 | }; 126 | 127 | Any functions and properties that are exported will be made available as part of your 128 | module. All other code inside your JS will be private to your module. 129 | 130 | For pure JS module, you don't need to modify any of the Objective-C module code. You 131 | can leave it as-is and build. 132 | 133 | TESTING YOUR MODULE 134 | ------------------- 135 | 136 | Run the `titanium.py` script to test your module or test from within XCode. 137 | To test with the script, execute: 138 | 139 | titanium run --dir=YOURMODULEDIR 140 | 141 | 142 | This will execute the app.js in the example folder as a Titanium application. 143 | 144 | 145 | DISTRIBUTING YOUR MODULE 146 | ------------------------- 147 | 148 | Currently, you will need to manually distribution your module distribution zip file directly. However, in the near future, we will make module distribution and sharing built-in to Titanium Developer and in the Titanium Marketplace! 149 | 150 | 151 | Cheers! 152 | -------------------------------------------------------------------------------- /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 co.saiten.ti.testflight.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 | -------------------------------------------------------------------------------- /build.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # 3 | # Appcelerator Titanium Module Packager 4 | # 5 | # 6 | import os, sys, glob, string 7 | import zipfile 8 | from datetime import date 9 | 10 | cwd = os.path.abspath(os.path.dirname(sys._getframe(0).f_code.co_filename)) 11 | os.chdir(cwd) 12 | required_module_keys = ['name','version','moduleid','description','copyright','license','copyright','platform','minsdk'] 13 | module_defaults = { 14 | 'description':'My module', 15 | 'author': 'Your Name', 16 | 'license' : 'Specify your license', 17 | 'copyright' : 'Copyright (c) %s by Your Company' % str(date.today().year), 18 | } 19 | module_license_default = "TODO: place your license here and we'll include it in the module distribution" 20 | 21 | def replace_vars(config,token): 22 | idx = token.find('$(') 23 | while idx != -1: 24 | idx2 = token.find(')',idx+2) 25 | if idx2 == -1: break 26 | key = token[idx+2:idx2] 27 | if not config.has_key(key): break 28 | token = token.replace('$(%s)' % key, config[key]) 29 | idx = token.find('$(') 30 | return token 31 | 32 | 33 | def read_ti_xcconfig(): 34 | contents = open(os.path.join(cwd,'titanium.xcconfig')).read() 35 | config = {} 36 | for line in contents.splitlines(False): 37 | line = line.strip() 38 | if line[0:2]=='//': continue 39 | idx = line.find('=') 40 | if idx > 0: 41 | key = line[0:idx].strip() 42 | value = line[idx+1:].strip() 43 | config[key] = replace_vars(config,value) 44 | return config 45 | 46 | def generate_doc(config): 47 | docdir = os.path.join(cwd,'documentation') 48 | if not os.path.exists(docdir): 49 | print "Couldn't find documentation file at: %s" % docdir 50 | return None 51 | sdk = config['TITANIUM_SDK'] 52 | support_dir = os.path.join(sdk,'module','support') 53 | sys.path.append(support_dir) 54 | import markdown 55 | documentation = [] 56 | for file in os.listdir(docdir): 57 | md = open(os.path.join(docdir,file)).read() 58 | html = markdown.markdown(md) 59 | documentation.append({file:html}); 60 | return documentation 61 | 62 | def compile_js(manifest,config): 63 | js_file = os.path.join(cwd,'assets','co.saiten.ti.testflight.js') 64 | if not os.path.exists(js_file): return 65 | 66 | sdk = config['TITANIUM_SDK'] 67 | iphone_dir = os.path.join(sdk,'iphone') 68 | sys.path.insert(0,iphone_dir) 69 | from compiler import Compiler 70 | 71 | path = os.path.basename(js_file) 72 | metadata = Compiler.make_function_from_file(path,js_file) 73 | method = metadata['method'] 74 | eq = path.replace('.','_') 75 | method = ' return %s;' % method 76 | 77 | f = os.path.join(cwd,'Classes','CoSaitenTiTestflightModuleAssets.m') 78 | c = open(f).read() 79 | idx = c.find('return ') 80 | before = c[0:idx] 81 | after = """ 82 | } 83 | 84 | @end 85 | """ 86 | newc = before + method + after 87 | 88 | if newc!=c: 89 | x = open(f,'w') 90 | x.write(newc) 91 | x.close() 92 | 93 | def die(msg): 94 | print msg 95 | sys.exit(1) 96 | 97 | def warn(msg): 98 | print "[WARN] %s" % msg 99 | 100 | def validate_license(): 101 | c = open(os.path.join(cwd,'LICENSE')).read() 102 | if c.find(module_license_default)!=1: 103 | warn('please update the LICENSE file with your license text before distributing') 104 | 105 | def validate_manifest(): 106 | path = os.path.join(cwd,'manifest') 107 | f = open(path) 108 | if not os.path.exists(path): die("missing %s" % path) 109 | manifest = {} 110 | for line in f.readlines(): 111 | line = line.strip() 112 | if line[0:1]=='#': continue 113 | if line.find(':') < 0: continue 114 | key,value = line.split(':') 115 | manifest[key.strip()]=value.strip() 116 | for key in required_module_keys: 117 | if not manifest.has_key(key): die("missing required manifest key '%s'" % key) 118 | if module_defaults.has_key(key): 119 | defvalue = module_defaults[key] 120 | curvalue = manifest[key] 121 | if curvalue==defvalue: warn("please update the manifest key: '%s' to a non-default value" % key) 122 | return manifest,path 123 | 124 | ignoreFiles = ['.DS_Store','.gitignore','libTitanium.a','titanium.jar','README','co.saiten.ti.testflight.js'] 125 | ignoreDirs = ['.DS_Store','.svn','.git','CVSROOT'] 126 | 127 | def zip_dir(zf,dir,basepath,ignore=[]): 128 | for root, dirs, files in os.walk(dir): 129 | for name in ignoreDirs: 130 | if name in dirs: 131 | dirs.remove(name) # don't visit ignored directories 132 | for file in files: 133 | if file in ignoreFiles: continue 134 | e = os.path.splitext(file) 135 | if len(e)==2 and e[1]=='.pyc':continue 136 | from_ = os.path.join(root, file) 137 | to_ = from_.replace(dir, basepath, 1) 138 | zf.write(from_, to_) 139 | 140 | def glob_libfiles(): 141 | files = [] 142 | for libfile in glob.glob('build/**/*.a'): 143 | if libfile.find('Release-')!=-1: 144 | files.append(libfile) 145 | return files 146 | 147 | def build_module(manifest,config): 148 | rc = os.system("xcodebuild -sdk iphoneos -configuration Release") 149 | if rc != 0: 150 | die("xcodebuild failed") 151 | rc = os.system("xcodebuild -sdk iphonesimulator -configuration Release") 152 | if rc != 0: 153 | die("xcodebuild failed") 154 | # build the merged library using lipo 155 | moduleid = manifest['moduleid'] 156 | libpaths = '' 157 | for libfile in glob_libfiles(): 158 | libpaths+='%s ' % libfile 159 | 160 | os.system("lipo %s -create -output build/lib%s.a" %(libpaths,moduleid)) 161 | 162 | def package_module(manifest,mf,config): 163 | name = manifest['name'].lower() 164 | moduleid = manifest['moduleid'].lower() 165 | version = manifest['version'] 166 | modulezip = '%s-iphone-%s.zip' % (moduleid,version) 167 | if os.path.exists(modulezip): os.remove(modulezip) 168 | zf = zipfile.ZipFile(modulezip, 'w', zipfile.ZIP_DEFLATED) 169 | modulepath = 'modules/iphone/%s/%s' % (moduleid,version) 170 | zf.write(mf,'%s/manifest' % modulepath) 171 | libname = 'lib%s.a' % moduleid 172 | zf.write('build/%s' % libname, '%s/%s' % (modulepath,libname)) 173 | docs = generate_doc(config) 174 | if docs!=None: 175 | for doc in docs: 176 | for file, html in doc.iteritems(): 177 | filename = string.replace(file,'.md','.html') 178 | zf.writestr('%s/documentation/%s'%(modulepath,filename),html) 179 | for dn in ('assets','example','platform'): 180 | if os.path.exists(dn): 181 | zip_dir(zf,dn,'%s/%s' % (modulepath,dn),['README']) 182 | zf.write('LICENSE','%s/LICENSE' % modulepath) 183 | zf.write('module.xcconfig','%s/module.xcconfig' % modulepath) 184 | zf.close() 185 | 186 | 187 | if __name__ == '__main__': 188 | manifest,mf = validate_manifest() 189 | validate_license() 190 | config = read_ti_xcconfig() 191 | compile_js(manifest,config) 192 | build_module(manifest,config) 193 | package_module(manifest,mf,config) 194 | sys.exit(0) 195 | 196 | -------------------------------------------------------------------------------- /documentation/index.md: -------------------------------------------------------------------------------- 1 | # titestflight Module 2 | 3 | ## Description 4 | 5 | TODO: Enter your module description here 6 | 7 | ## Accessing the titestflight Module 8 | 9 | To access this module from JavaScript, you would do the following: 10 | 11 | var titestflight = require("co.saiten.ti.testflight"); 12 | 13 | The titestflight variable is a reference to the Module object. 14 | 15 | ## Reference 16 | 17 | TODO: If your module has an API, you should document 18 | the reference here. 19 | 20 | ### ___PROJECTNAMEASIDENTIFIER__.function 21 | 22 | TODO: This is an example of a module function. 23 | 24 | ### ___PROJECTNAMEASIDENTIFIER__.property 25 | 26 | TODO: This is an example of a module property. 27 | 28 | ## Usage 29 | 30 | TODO: Enter your usage example here 31 | 32 | ## Author 33 | 34 | TODO: Enter your author name, email and other contact 35 | details you want to share here. 36 | 37 | ## License 38 | 39 | TODO: Enter your license/legal information here. 40 | -------------------------------------------------------------------------------- /example/app.js: -------------------------------------------------------------------------------- 1 | // This is a test harness for your module 2 | // You should do something interesting in this harness 3 | // to test out the module and to provide instructions 4 | // to users on how to use it by example. 5 | 6 | 7 | // open a single window 8 | var window = Ti.UI.createWindow({ 9 | backgroundColor:'white' 10 | }); 11 | var label = Ti.UI.createLabel(); 12 | window.add(label); 13 | window.open(); 14 | 15 | // TODO: write your module tests here 16 | var testflight = require('co.saiten.ti.testflight'); 17 | Ti.API.info("module is => " + testflight); 18 | 19 | testflight.takeOff("[TEAM TOKEN]"); 20 | 21 | Ti.API.debug("Start Logging"); 22 | 23 | Ti.API.info("passCheckPoint"); 24 | testflight.passCheckPoint("checkpoint1"); 25 | 26 | Ti.API.debug("addCustomEnvironmentInformation"); 27 | testflight.addCustomEnvironmentInformation("key", "value"); 28 | 29 | testflight.passCheckPoint("checkpoint2"); 30 | 31 | Ti.API.debug("OpenFeedbackView"); 32 | testflight.openFeedbackView(); 33 | 34 | Ti.API.debug("End"); 35 | -------------------------------------------------------------------------------- /hooks/README: -------------------------------------------------------------------------------- 1 | These files are not yet supported as of 1.4.0 but will be in a near future release. 2 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /manifest: -------------------------------------------------------------------------------- 1 | # 2 | # this is your module manifest and used by Titanium 3 | # during compilation, packaging, distribution, etc. 4 | # 5 | version: 0.1 6 | description: My module 7 | author: Your Name 8 | license: Specify your license 9 | copyright: Copyright (c) 2011 by Your Company 10 | 11 | 12 | # these should not be edited 13 | name: titestflight 14 | moduleid: co.saiten.ti.testflight 15 | guid: 8beda686-5822-408e-873d-a111c6b94360 16 | platform: iphone 17 | minsdk: 1.7.2 18 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /timodule.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /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 = 1.7.2 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 | -------------------------------------------------------------------------------- /titestflight.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 /* CoSaitenTiTestflightModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 24DD6CF71134B3F500162E58 /* CoSaitenTiTestflightModule.h */; }; 26 | 24DD6CFA1134B3F500162E58 /* CoSaitenTiTestflightModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 24DD6CF81134B3F500162E58 /* CoSaitenTiTestflightModule.m */; }; 27 | 24DE9E1111C5FE74003F90F6 /* CoSaitenTiTestflightModuleAssets.h in Headers */ = {isa = PBXBuildFile; fileRef = 24DE9E0F11C5FE74003F90F6 /* CoSaitenTiTestflightModuleAssets.h */; }; 28 | 24DE9E1211C5FE74003F90F6 /* CoSaitenTiTestflightModuleAssets.m in Sources */ = {isa = PBXBuildFile; fileRef = 24DE9E1011C5FE74003F90F6 /* CoSaitenTiTestflightModuleAssets.m */; }; 29 | AA747D9F0F9514B9006C5449 /* CoSaitenTiTestflight_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = AA747D9E0F9514B9006C5449 /* CoSaitenTiTestflight_Prefix.pch */; }; 30 | AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; }; 31 | E1557314141EF2390068D30D /* TestFlight.h in Headers */ = {isa = PBXBuildFile; fileRef = E1557313141EF2390068D30D /* TestFlight.h */; }; 32 | E1557317141EF2560068D30D /* libTestFlight.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E1557316141EF2560068D30D /* libTestFlight.a */; }; 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 = titestflight; 42 | }; 43 | /* End PBXContainerItemProxy section */ 44 | 45 | /* Begin PBXFileReference section */ 46 | 24DD6CF71134B3F500162E58 /* CoSaitenTiTestflightModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CoSaitenTiTestflightModule.h; path = Classes/CoSaitenTiTestflightModule.h; sourceTree = ""; }; 47 | 24DD6CF81134B3F500162E58 /* CoSaitenTiTestflightModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CoSaitenTiTestflightModule.m; path = Classes/CoSaitenTiTestflightModule.m; sourceTree = ""; }; 48 | 24DD6D1B1134B66800162E58 /* titanium.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = titanium.xcconfig; sourceTree = ""; }; 49 | 24DE9E0F11C5FE74003F90F6 /* CoSaitenTiTestflightModuleAssets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CoSaitenTiTestflightModuleAssets.h; path = Classes/CoSaitenTiTestflightModuleAssets.h; sourceTree = ""; }; 50 | 24DE9E1011C5FE74003F90F6 /* CoSaitenTiTestflightModuleAssets.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CoSaitenTiTestflightModuleAssets.m; path = Classes/CoSaitenTiTestflightModuleAssets.m; sourceTree = ""; }; 51 | AA747D9E0F9514B9006C5449 /* CoSaitenTiTestflight_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoSaitenTiTestflight_Prefix.pch; sourceTree = SOURCE_ROOT; }; 52 | AACBBE490F95108600F1A2B1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 53 | D2AAC07E0554694100DB518D /* libCoSaitenTiTestflight.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libCoSaitenTiTestflight.a; sourceTree = BUILT_PRODUCTS_DIR; }; 54 | E1557313141EF2390068D30D /* TestFlight.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestFlight.h; path = Classes/TestFlight.h; sourceTree = ""; }; 55 | E1557316141EF2560068D30D /* libTestFlight.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libTestFlight.a; path = Classes/libTestFlight.a; sourceTree = ""; }; 56 | /* End PBXFileReference section */ 57 | 58 | /* Begin PBXFrameworksBuildPhase section */ 59 | D2AAC07C0554694100DB518D /* Frameworks */ = { 60 | isa = PBXFrameworksBuildPhase; 61 | buildActionMask = 2147483647; 62 | files = ( 63 | E1557317141EF2560068D30D /* libTestFlight.a in Frameworks */, 64 | AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */, 65 | ); 66 | runOnlyForDeploymentPostprocessing = 0; 67 | }; 68 | /* End PBXFrameworksBuildPhase section */ 69 | 70 | /* Begin PBXGroup section */ 71 | 034768DFFF38A50411DB9C8B /* Products */ = { 72 | isa = PBXGroup; 73 | children = ( 74 | D2AAC07E0554694100DB518D /* libCoSaitenTiTestflight.a */, 75 | ); 76 | name = Products; 77 | sourceTree = ""; 78 | }; 79 | 0867D691FE84028FC02AAC07 /* titestflight */ = { 80 | isa = PBXGroup; 81 | children = ( 82 | 08FB77AEFE84172EC02AAC07 /* Classes */, 83 | 32C88DFF0371C24200C91783 /* Other Sources */, 84 | 0867D69AFE84028FC02AAC07 /* Frameworks */, 85 | 034768DFFF38A50411DB9C8B /* Products */, 86 | ); 87 | name = titestflight; 88 | sourceTree = ""; 89 | }; 90 | 0867D69AFE84028FC02AAC07 /* Frameworks */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | E1557316141EF2560068D30D /* libTestFlight.a */, 94 | AACBBE490F95108600F1A2B1 /* Foundation.framework */, 95 | ); 96 | name = Frameworks; 97 | sourceTree = ""; 98 | }; 99 | 08FB77AEFE84172EC02AAC07 /* Classes */ = { 100 | isa = PBXGroup; 101 | children = ( 102 | E1557313141EF2390068D30D /* TestFlight.h */, 103 | 24DE9E0F11C5FE74003F90F6 /* CoSaitenTiTestflightModuleAssets.h */, 104 | 24DE9E1011C5FE74003F90F6 /* CoSaitenTiTestflightModuleAssets.m */, 105 | 24DD6CF71134B3F500162E58 /* CoSaitenTiTestflightModule.h */, 106 | 24DD6CF81134B3F500162E58 /* CoSaitenTiTestflightModule.m */, 107 | ); 108 | name = Classes; 109 | sourceTree = ""; 110 | }; 111 | 32C88DFF0371C24200C91783 /* Other Sources */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | AA747D9E0F9514B9006C5449 /* CoSaitenTiTestflight_Prefix.pch */, 115 | 24DD6D1B1134B66800162E58 /* titanium.xcconfig */, 116 | ); 117 | name = "Other Sources"; 118 | sourceTree = ""; 119 | }; 120 | /* End PBXGroup section */ 121 | 122 | /* Begin PBXHeadersBuildPhase section */ 123 | D2AAC07A0554694100DB518D /* Headers */ = { 124 | isa = PBXHeadersBuildPhase; 125 | buildActionMask = 2147483647; 126 | files = ( 127 | AA747D9F0F9514B9006C5449 /* CoSaitenTiTestflight_Prefix.pch in Headers */, 128 | 24DD6CF91134B3F500162E58 /* CoSaitenTiTestflightModule.h in Headers */, 129 | 24DE9E1111C5FE74003F90F6 /* CoSaitenTiTestflightModuleAssets.h in Headers */, 130 | E1557314141EF2390068D30D /* TestFlight.h in Headers */, 131 | ); 132 | runOnlyForDeploymentPostprocessing = 0; 133 | }; 134 | /* End PBXHeadersBuildPhase section */ 135 | 136 | /* Begin PBXNativeTarget section */ 137 | D2AAC07D0554694100DB518D /* titestflight */ = { 138 | isa = PBXNativeTarget; 139 | buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "titestflight" */; 140 | buildPhases = ( 141 | D2AAC07A0554694100DB518D /* Headers */, 142 | D2AAC07B0554694100DB518D /* Sources */, 143 | D2AAC07C0554694100DB518D /* Frameworks */, 144 | ); 145 | buildRules = ( 146 | ); 147 | dependencies = ( 148 | ); 149 | name = titestflight; 150 | productName = titestflight; 151 | productReference = D2AAC07E0554694100DB518D /* libCoSaitenTiTestflight.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 "titestflight" */; 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 /* titestflight */; 170 | productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; 171 | projectDirPath = ""; 172 | projectRoot = ""; 173 | targets = ( 174 | D2AAC07D0554694100DB518D /* titestflight */, 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 /* CoSaitenTiTestflightModule.m in Sources */, 202 | 24DE9E1211C5FE74003F90F6 /* CoSaitenTiTestflightModuleAssets.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 /* titestflight */; 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 | ALWAYS_SEARCH_USER_PATHS = NO; 222 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 223 | COPY_PHASE_STRIP = NO; 224 | DSTROOT = /tmp/CoSaitenTiTestflight.dst; 225 | GCC_DYNAMIC_NO_PIC = NO; 226 | GCC_ENABLE_FIX_AND_CONTINUE = YES; 227 | GCC_MODEL_TUNING = G5; 228 | GCC_OPTIMIZATION_LEVEL = 0; 229 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 230 | GCC_PREFIX_HEADER = CoSaitenTiTestflight_Prefix.pch; 231 | INSTALL_PATH = /usr/local/lib; 232 | LIBRARY_SEARCH_PATHS = ( 233 | "$(inherited)", 234 | "\"$(SRCROOT)/Classes\"", 235 | ); 236 | PRODUCT_NAME = CoSaitenTiTestflight; 237 | }; 238 | name = Debug; 239 | }; 240 | 1DEB922008733DC00010E9CD /* Release */ = { 241 | isa = XCBuildConfiguration; 242 | baseConfigurationReference = 24DD6D1B1134B66800162E58 /* titanium.xcconfig */; 243 | buildSettings = { 244 | ALWAYS_SEARCH_USER_PATHS = NO; 245 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 246 | DSTROOT = /tmp/CoSaitenTiTestflight.dst; 247 | GCC_MODEL_TUNING = G5; 248 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 249 | GCC_PREFIX_HEADER = CoSaitenTiTestflight_Prefix.pch; 250 | INSTALL_PATH = /usr/local/lib; 251 | LIBRARY_SEARCH_PATHS = ( 252 | "$(inherited)", 253 | "\"$(SRCROOT)/Classes\"", 254 | ); 255 | PRODUCT_NAME = CoSaitenTiTestflight; 256 | }; 257 | name = Release; 258 | }; 259 | 1DEB922308733DC00010E9CD /* Debug */ = { 260 | isa = XCBuildConfiguration; 261 | baseConfigurationReference = 24DD6D1B1134B66800162E58 /* titanium.xcconfig */; 262 | buildSettings = { 263 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 264 | GCC_C_LANGUAGE_STANDARD = c99; 265 | GCC_OPTIMIZATION_LEVEL = 0; 266 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 267 | GCC_WARN_UNUSED_VARIABLE = YES; 268 | OTHER_LDFLAGS = ""; 269 | PREBINDING = NO; 270 | SDKROOT = iphoneos4.0; 271 | }; 272 | name = Debug; 273 | }; 274 | 1DEB922408733DC00010E9CD /* Release */ = { 275 | isa = XCBuildConfiguration; 276 | baseConfigurationReference = 24DD6D1B1134B66800162E58 /* titanium.xcconfig */; 277 | buildSettings = { 278 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 279 | GCC_C_LANGUAGE_STANDARD = c99; 280 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 281 | GCC_WARN_UNUSED_VARIABLE = YES; 282 | OTHER_LDFLAGS = ""; 283 | PREBINDING = NO; 284 | SDKROOT = iphoneos4.0; 285 | }; 286 | name = Release; 287 | }; 288 | 24416B8211C4CA220047AFDD /* Debug */ = { 289 | isa = XCBuildConfiguration; 290 | baseConfigurationReference = 24DD6D1B1134B66800162E58 /* titanium.xcconfig */; 291 | buildSettings = { 292 | COPY_PHASE_STRIP = NO; 293 | GCC_DYNAMIC_NO_PIC = NO; 294 | GCC_OPTIMIZATION_LEVEL = 0; 295 | PRODUCT_NAME = "Build & test"; 296 | }; 297 | name = Debug; 298 | }; 299 | 24416B8311C4CA220047AFDD /* Release */ = { 300 | isa = XCBuildConfiguration; 301 | baseConfigurationReference = 24DD6D1B1134B66800162E58 /* titanium.xcconfig */; 302 | buildSettings = { 303 | COPY_PHASE_STRIP = YES; 304 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 305 | GCC_ENABLE_FIX_AND_CONTINUE = NO; 306 | PRODUCT_NAME = "Build & test"; 307 | ZERO_LINK = NO; 308 | }; 309 | name = Release; 310 | }; 311 | /* End XCBuildConfiguration section */ 312 | 313 | /* Begin XCConfigurationList section */ 314 | 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "titestflight" */ = { 315 | isa = XCConfigurationList; 316 | buildConfigurations = ( 317 | 1DEB921F08733DC00010E9CD /* Debug */, 318 | 1DEB922008733DC00010E9CD /* Release */, 319 | ); 320 | defaultConfigurationIsVisible = 0; 321 | defaultConfigurationName = Release; 322 | }; 323 | 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "titestflight" */ = { 324 | isa = XCConfigurationList; 325 | buildConfigurations = ( 326 | 1DEB922308733DC00010E9CD /* Debug */, 327 | 1DEB922408733DC00010E9CD /* Release */, 328 | ); 329 | defaultConfigurationIsVisible = 0; 330 | defaultConfigurationName = Release; 331 | }; 332 | 24416B8A11C4CA520047AFDD /* Build configuration list for PBXAggregateTarget "Build & Test" */ = { 333 | isa = XCConfigurationList; 334 | buildConfigurations = ( 335 | 24416B8211C4CA220047AFDD /* Debug */, 336 | 24416B8311C4CA220047AFDD /* Release */, 337 | ); 338 | defaultConfigurationIsVisible = 0; 339 | defaultConfigurationName = Release; 340 | }; 341 | /* End XCConfigurationList section */ 342 | }; 343 | rootObject = 0867D690FE84028FC02AAC07 /* Project object */; 344 | } 345 | --------------------------------------------------------------------------------