tag:blogger.com,1999:blog-38601207735354422252024-03-13T10:32:11.189-07:00Lolay, Inc.lolay creates cutting-edge products and services that rethink the way people interactGary Rudolphhttp://www.blogger.com/profile/17461555373591223876noreply@blogger.comBlogger29125tag:blogger.com,1999:blog-3860120773535442225.post-90869232527914339072015-01-05T09:30:00.000-08:002015-01-05T09:30:33.503-08:00Simulating iOS Background Location Changes from the Comfort of Your Desk<div style="font-family: Helvetica; font-size: 12px;">
Xcode offers a handy feature for developers that are working with location services. <a href="https://developer.apple.com/library/ios/recipes/xcode_help-debugger/articles/simulating_locations.html">Simulating a Location at Runtime</a> allows the developer to specify a location that the device will report to apps as they run. You can even use <a href="http://www.gpsvisualizer.com/draw/">prerecorded GPX files</a> to simulate walking, running, biking or driving along a route to see how the location changes are handled by your app.</div>
<div style="font-family: Helvetica; font-size: 12px; min-height: 14px;">
<br /></div>
<div style="font-family: Helvetica; font-size: 12px;">
However, simulating location changes in apps that have been terminated is a bit trickier, as the debug area option to simulate location is only available when you're debugging a process. To work around this, you can follow these steps:</div>
<div style="font-family: Helvetica; font-size: 12px; min-height: 14px;">
<br /></div>
<div style="font-family: Helvetica; font-size: 12px;">
</div>
<ol>
<li>Run the app in which you want to simulate a background location change.</li>
<li>Stop the app.</li>
<li>Create a dummy project - I just use the single view application template.</li>
<li>Run the dummy project on the same device.</li>
<li>In the debug bar for the dummy project, choose a location, or add a GPX file containing the location changes you want to simulate to your project and choose it.</li>
</ol>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-MrX7iETRv-o/VKHkHWbTFZI/AAAAAAAAAyk/CTDIxrrfWK4/s1600/Screen%2BShot%2B2014-12-29%2Bat%2B10.55.52%2BAM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-MrX7iETRv-o/VKHkHWbTFZI/AAAAAAAAAyk/CTDIxrrfWK4/s1600/Screen%2BShot%2B2014-12-29%2Bat%2B10.55.52%2BAM.png" height="226" width="320" /></a></div>
<div>
<br /></div>
<br />
<div style="font-family: Helvetica; font-size: 12px; min-height: 14px;">
<br /></div>
<br />
<div style="font-family: Helvetica; font-size: 12px;">
Even though the app that you're wanting to simulate a background location change was stopped at step 2, you should see it get a location services update via application:didFinishLaunchingWithOptions:, with the UIApplicationLaunchOptionsLocationKey set in the options dictionary. And, you can do this from the comfort of your desk without needing to take your iPhone to the location you're wanting to test in.</div>
Anonymoushttp://www.blogger.com/profile/11652744502535301278noreply@blogger.com0tag:blogger.com,1999:blog-3860120773535442225.post-38577198068533604892014-02-04T23:04:00.000-08:002014-04-03T20:04:18.042-07:00Configuring OSX Mavericks and Jenkins to Support Interactive JobsWhile developing iOS applications we leverage Jenkins on OSX Mavericks for our Xcode / iOS and Android builds. We perform application level automated testing (i.e. in the Simulator or Emulator) and as such need a Windowed environment can't simply run in a Daemon mode. In addition, OSX Server on Mavericks integrates a "GUI" Apache Server that we want to integrate.<br />
<br />
An initial installation of Jenkins on a Mac using the Jenkins supplied installer is ok, but it only supports a headless execution. There are many times that our jobs need a head or window manager to execute (Xcode Automation Tests). To support this on Mac we need to reorganize this. Basically, we want to change the jenkins process from running as a LaunchDaemon and to run as LaunchAgent defined the jenkins user itself. Here is a cookbook for doing this with a fresh Mac install.<br />
<ol>
<li>If you don't have Java installed, install it by attempting to run the following and follow the instructions. java -version (I’d recommend to install the Java 7 version directly from <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html?ssSourceSiteId=ocomcn" rel="nofollow" target="_blank">Oracle</a>).</li>
<li><a href="http://mirrors.jenkins-ci.org/osx/latest" rel="nofollow" target="_blank">Download</a> & Install the Jenkins Mac Installer.</li>
<li>This will create a user named jenkins. In the user manager it will have an empty name, go ahead and name it Jenkins User in System Preferences -> User & Groups. You will also want to set a password at this time. It's not necessary, nor recommend to make this user an Administrator</li>
<li>Now, we need to disable the Jenkins LaunchDaemon. You can unload and force it not to load again by executing "<span style="font-family: Courier New, Courier, monospace;">sudo launchctl unload -w /Library/LaunchDaemons/org.jenkins-ci.plist</span>"</li>
<li>We now need to create a LaunchAgents script, and this can be done by copying "<span style="font-family: Courier New, Courier, monospace;">cp /Library/LaunchDaemons/org.jenkins-ci.plist to ~/Library/LaunchAgents/org.jenkins-ci.plist</span>"</li>
<li>For Jenkins to start on a fresh system boot, you would configure System Preferences -> User & Groups -> Login Options to automatically login to the Jenkins User account.</li>
<li>We should now be good to go and can start jenkins by logging in to the jenkins account (and out if already logged in).</li>
</ol>
One thing to keep in mind, is by default Jenkins can not update itself. To fix this you can do the following.<br />
<div>
<ol>
<li>Change the owner on the jenkins.war and directory. "<span style="font-family: Courier New, Courier, monospace;">sudo chown /Applications/Jenkins jenkins; sudo chown /Applications/Jenkins/jenkins.war jenkins</span>"</li>
</ol>
</div>
<div>
Next we would also like Jenkins to play nicely with OSX Server (You might need to install it if it's not already installed from the App Store). Ideally, we want http://{SERVER_NAME}/jenkins to forward proxy to http://localhost:8080/jenkins.</div>
<div>
<ol>
<li>If Websites aren’t enabled, go ahead and turn that on in OSX Server. Make sure to “Allow overrides using .htaccess files” is enabled in the Advanced settings of the "Server Website" and "Server Website (SSL)” sites</li>
<li>We need to configure Jenkins to respond to /jenkins as well, and this can be done by adding a prefix to the preferences. "<span style="font-family: Courier New, Courier, monospace;">sudo defaults write /Library/Preferences/org.jenkins-ci.plist prefix /jenkins</span>"</li>
<li>We need to configure OSX Server to redirect any non-SSL traffic to https for /jenkins. We did this in the OSX Server App by click on Websites -> Server Website -> Redirects -> Edit and adding a Permanent redirect for anything /jenkins to go to https://{SERVER_NAME}/jenkins.</li>
<li>We need to configure OSX Server to forward proxy any /jenkins requests to the local jenkins server. Do this by adding an .htaccess file to /Library/Server/Web/Data/Sites/Default/jenkins/.htaccess with the following content.</li>
</ol>
<div>
<span style="background-color: #eeeeee; font-family: Courier New, Courier, monospace;">RewriteEngine on</span></div>
<div>
<span style="background-color: #eeeeee; font-family: Courier New, Courier, monospace;">RewriteCond %{HTTPS} =on</span></div>
<div>
<span style="background-color: #eeeeee; font-family: 'Courier New', Courier, monospace;">RewriteRule ^(.*)$ http://localhost:8080%{REQUEST_URI} [P]</span></div>
</div>
<div>
<br /></div>
<div>
After that we should now be able to access jenkins from http://{SERVER_NAME}/jenkins and it should redirect the user to https://{SERVER_NAME}/jenkins and allow you to login and continue the Jenkins configuration and create jobs that start windows (i.e. iOS Simulator and the Android Emulator).</div>
Gary Rudolphhttp://www.blogger.com/profile/17461555373591223876noreply@blogger.com0tag:blogger.com,1999:blog-3860120773535442225.post-81237458766004529312013-09-13T00:49:00.002-07:002013-09-13T00:49:32.851-07:00Beamz by Flo RidaCheck out the new <a href="https://www.beamzbyflo.com/" rel="nofollow" target="_blank">Beamz by Flo Rida</a> that just launched on the <a href="https://itunes.apple.com/us/app/beamz/id695135292?mt=12" rel="nofollow" target="_blank">Mac App Store</a>. Just a great Mac app that integrates with the Beamz by Flo Rida instrument. It's our first Mac app that integrates with a USB device (as well as Bluetooth Low Energy forthcoming). Tremendous team effort to get it launched!<br />
<br />
It's a very addictive experience and is a lot of fun to use! It just sucked me in to keep playing and experimenting with it. I was using a prototype, but can't wait for the production versions! Awesome gift for the Holidays coming up!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-2aImXKH46qg/UjLDYEf-fzI/AAAAAAAAF2U/N0li73-iwqQ/s1600/beamz.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="http://2.bp.blogspot.com/-2aImXKH46qg/UjLDYEf-fzI/AAAAAAAAF2U/N0li73-iwqQ/s400/beamz.jpg" width="400" /></a></div>
<br />
<br />
The app can be used without the device to get a feel for what it would be like without the instrument, and there's also a version for iOS devices that uses Bluetooth Low Energy on the <a href="https://itunes.apple.com/us/app/beamz/id671194210?mt=8" rel="nofollow" target="_blank">iOS App Store</a> (launched in August).Gary Rudolphhttp://www.blogger.com/profile/17461555373591223876noreply@blogger.com1tag:blogger.com,1999:blog-3860120773535442225.post-20385638550324255002013-09-02T09:08:00.002-07:002013-09-02T09:08:36.949-07:00Slicy Photoshop Export Better Than CakeFor iOS and Android projects we're constantly having to export Photoshop designs to the individual assets. It gets very tedious to use the Slice Tool in Photoshop to manually draw boxes around all the assets you want exported and to hide/show groups to get the right transparency and backgrounds.<br />
Well, if you're still doing it this way I have a recommendation! <a href="http://macrabbit.com/slicy/" rel="nofollow" target="_blank">Slicy</a> which is just plain awesome. It's the best $29 I've ever spent.<br />
<br />
Take a look at the "How it works" video on that page, but in a nutshell you name your Groups or Assets in a Photoshop file as Foo@2x.png and Slicy will perfectly slice these from the layers and export both the 2x and 1x image sizes. You still have to make sure that the designs use even pixels, but otherwise it works great. That's it. Done. It can even export automatically every time a change is made to the Photoshop file.<br />
<br />
We even use it on Android even though it's originally built for iOS. We will use Foo.png instead of the iOS naming of @2x.png (with the designs made for xxhdpi with a resolution of 1080x1920). We then take the directory we had Slicy to export to and use a our android shell script (<a href="https://github.com/lolay/lbin/blob/master/droidsize.py" rel="nofollow" target="_blank">droidsize.py</a>) to export these to all the other dpi's.Gary Rudolphhttp://www.blogger.com/profile/17461555373591223876noreply@blogger.com12tag:blogger.com,1999:blog-3860120773535442225.post-29955770248419166292013-08-24T09:06:00.001-07:002013-08-24T09:06:18.127-07:00Android New Build System (Gradle)At Lolay we've now started and are using the Android <a href="http://tools.android.com/tech-docs/new-build-system" rel="nofollow" target="_blank">"New Build System"</a> on 3 projects with success. We are using a combination of using <a href="http://developer.android.com/sdk/installing/studio.html" rel="nofollow" target="_blank">Android Studio</a> and <a href="http://www.gradle.org/" rel="nofollow" target="_blank">Gradle</a> with the <a href="http://tools.android.com/tech-docs/new-build-system/user-guide" rel="nofollow" target="_blank">Android Gradle Plugin</a>. Overall, it was a good decision and it's been worth the time investment as well as minor bugs with Android Studio.<br />
<br />
For a background, prior to this for Android development we would use Eclipse, Maven, Maven Android Plugin and the Eclipse m2e Plugin (And we've also used IntelliJ). We're not huge fans of Eclipse, but it is the most popular IDE for Android development (probably not for long). Using Maven, Android and Eclipse together is not an easy experience, and typically had lots of issues. This would particularly be true where the IDE build worked, but the Maven build did not (or vice versa).<br />
<br />
One of the things we did like with the Maven builds was the ability to support building a Development, QA, Beta and Release version of an application all of which would use different server URL's, different Flurry codes, etc. This allowed a sophisticated setup. The only problem is this caused a lot of duplication and Android Manifests to obtain this result (we settled on using Maven profiles to point to alternate Android Manifests). This all worked, but was difficult to maintain.<br />
<br />
Enter the "New Build System" with Android Studio. First, Android Studio is an absolute pleasure to use. It's as good as the Google I/O talks present. It's also very stable for a Beta version of the product, although this is most likely a result it's really based on IntelliJ and IntelliJ's Android support under the scenes, which was already pretty robust. The Android Plugin for Gradle is also very stable, and this is most likely a result of being able to learn from the Android Plugin for Maven.<br />
<br />
One of the nice things about using Android Studio and Gradle with the Android Plugin is it has direct support for building multiple versions of an application. We are now building Debug, QA, Beta and Release version of the application and use different buildTypes to support each one. It's very natural, and it supports modifying your single Android Manifest so that we no longer need to have multiple manifests. In addition, it has a nice "overlay" feature where code and resources in src/main can be overlayed by content/settings in src/{buildType}. This allows us to have have a src/debug/res/values/strings.xml to add in environment specific URL's or Flurry codes. It also allows us to have an environment specific icon in src/debug/res/drawable/ic_launcher.png.<br />
<br />
We've also have the great benefit that both the IDE and command line both use Gradle for the build, so that we no longer get issues where an engineer says "works fine built from Eclipse".<br />
<br />
The only issue we've run into with the "New Build System" are that occasionally on an Android Studio upgrade it can break something in the project (I'm speaking to you 0.2.4). We've learned to make sure we have a time machine backup before applying any Android Studio upgrade). But, even when this does occur we could build the project command line and edit with a basic text editor like Text Mate to get the build out.<br />
<br />
Android Studio and the Android Plugin for Gradle are mainstream enough and stable enough that we recommend all projects switch over to it.Gary Rudolphhttp://www.blogger.com/profile/17461555373591223876noreply@blogger.com11tag:blogger.com,1999:blog-3860120773535442225.post-9996634078665156312013-02-21T15:08:00.003-08:002013-02-21T15:08:53.753-08:00Building iPhone and Android Apps at the Same TimeRecently we had the pleasure of working with <a href="http://oversee.net/" rel="nofollow" target="_blank">Oversee.net</a> on an app for both iPhone and Android for <a href="http://www.domainsponsor.com/" rel="nofollow" target="_blank">DomainSponsor</a> (and prior <a href="http://www.shopwiki.com/" rel="nofollow" target="_blank">ShopWiki</a>). It's quite common for us to launch an application on both platforms at the same time, and <a href="http://www.domainsponsor.com/" rel="nofollow" target="_blank">DomainSponsor</a> was no exception.<br />
<br />
There are a few things we take into consideration when launching an application on both platforms.<br />
<br />
<ol>
<li>Try to keep costs to a minimum by using the same design across iPhone and Android.</li>
<li>Build each platform using the best practices of each platform and adjust the design accordingly. Some examples are adjusting an app from iPhone to Android are</li>
<ol>
<li>Adding in Back and Up navigation</li>
<li>Location of UI elements like tab controllers</li>
<li>Adding Action Bar elements on the application bar</li>
<li>Using dialogues in the design</li>
<li>Using menus (although we still believe in those elements being available without using the menu as there are many users not aware it even exists).</li>
</ol>
<li>We build each platform natively</li>
<ol>
<li>The savings to building each platform natively is cost. But, there are tricks to keep this to a minimum like sharing the design elements/flow as well as using the same overall architecture, naming, etc. when building both apps (i.e. if it's called InboxViewController on iOS it's called InboxActivity on Android and the back end is called InboxManager on both platforms). If you really want to save costs and build once then go straight to mobile web.</li>
<li>Platforms like PhoneGap, Titanium, MonoTouch just do not have a responsiveness interface nor feel like a native experience. We've used them all on applications we've taken over and need to support. We're not the only one, companies like Facebook, HowAboutWe, etc. have all come to the same decision.</li>
<li>We can give a great experience that feels natural to users accustomed to native iPhone and Android applications.</li>
</ol>
<li>Start iPhone 2 weeks in advance of Android, but develop them in parallel to keep a fast development cycle.</li>
<ol>
<li>Expect a 7-9 day App Store review cycle for iPhone and anticipate the first review cycle might get rejected and need to be resubmitted.</li>
<li>iPhone leads and blazes the trail on API integration, architectural decisions and Android benefits from these learnings</li>
<li>Android can be launched in the Play Store once the approval for the iPhone occurs so that both can be launched concurrently on the same day.</li>
</ol>
</ol>
<div>
With these practices we've launched apps for multiple companies on both iPhone and Android at the same time and had a very high success rate of them being completed at the exact same time.</div>
Gary Rudolphhttp://www.blogger.com/profile/17461555373591223876noreply@blogger.com1tag:blogger.com,1999:blog-3860120773535442225.post-21626776311533303102012-11-27T11:54:00.002-08:002012-11-27T12:10:30.924-08:00Business Rockstars<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Lolay had the pleasure of joining Business Rockstars (KFWB - 980 AM) on the air last Wednesday, November 21st. The show was created by Ken Rutkowski and Steve Lehman as a platform for entrepreneurs to share their successes and adventures. </span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-xQiDW4MDJwQ/ULUd8Oi7coI/AAAAAAAABWQ/zKLzrvmLWx4/s1600/BR.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="182" src="http://2.bp.blogspot.com/-xQiDW4MDJwQ/ULUd8Oi7coI/AAAAAAAABWQ/zKLzrvmLWx4/s400/BR.jpg" width="400" /></a></div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Check out the details: <a href="http://businessrockstars.com/br/2012/11/business-rockstars-ep113-wed-1121">http://businessrockstars.com/br/2012/11/business-rockstars-ep113-wed-1121</a></span>Anonymousnoreply@blogger.com0tag:blogger.com,1999:blog-3860120773535442225.post-60033303009954759802012-10-04T17:49:00.007-07:002012-10-04T17:53:35.628-07:00App Store (iTunesConnect) Categories<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">For some reason, I always find myself looking around for the iTunesConnect Primary and Secondary Category names when submitting a new iOS app. Here they are:</span><br />
<br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><b>Book <br />Business <br />Catalogs <br />Education <br />Entertainment <br />Finance <br />Food & Drink <br />Games <br />Health & Fitness <br />Lifestyle <br />Medical <br />Music <br />Navigation <br />News <br />Photo & Video <br />Productivity <br />Reference <br />Social Networking <br />Sports <br />Travel <br />Utilities <br />Weather</b></span>Anonymousnoreply@blogger.com0tag:blogger.com,1999:blog-3860120773535442225.post-76225003441142862632012-09-29T13:28:00.001-07:002012-09-29T13:31:18.707-07:00Xcode Presentation Mode<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">So you're hosting a code review and Xcode is up on the projector (or screen-share via Skype). You look around and notice folks are squinting their eyes (most engineers won't admit their vision is getting worse from coding all those years). </span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">There are a few options to get that font larger and sharper so that even the folks in the back of the room can see what you're talking about when you say "I created a pointer to a pointer of NSError so I can return it from my function as an additional parameter." My favorite option so far: The Xcode Presentation Theme.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">To set Presentation Theme, open Xcode Preferences, go to Fonts & Colors, then select Presentation from the Theme list on the left. All appropriate fonts get larger, and the Xcode interface itself stays untouched. Here's a screenshot of the Preference setup:</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-ygk7zARxRnw/UGdZSuqdxiI/AAAAAAAAAbQ/CzXxgifOKyw/s1600/xcodepresentation.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="295" src="http://2.bp.blogspot.com/-ygk7zARxRnw/UGdZSuqdxiI/AAAAAAAAAbQ/CzXxgifOKyw/s400/xcodepresentation.png" width="400" /></a></div>
<br />
<span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">It's really easy to revert this back to your previous Theme and not mess up your monitor settings, projector settings, or have to use screen zoom that can create blurry text. Now that's Gangnam style.</span><br />
<br />
<br />Anonymousnoreply@blogger.com0tag:blogger.com,1999:blog-3860120773535442225.post-48894715952608714182012-06-27T14:15:00.000-07:002012-06-27T14:15:04.744-07:00iOS From HTML5 Back to NativeIt's interesting to see the trend of iOS apps that moved from a pure native experience to an HTML5 hybrid experience and are now moving back to a pure native experience. Or in a few cases started out as an HTML5 hybrid experience first. Case in point is that Facebook has finally <a href="http://www.macrumors.com/2012/06/27/facebook-abandoning-html5-to-speed-up-ios-app/" rel="nofollow" target="_blank">admitted</a> how buggy and poor performing this exercise has been.<br />
<br />
At Lolay we often get a first hand look at such bugs and performance issues with a hybrid experience. We often get asked to rewrite an HTML5 experience back to a native experience as the products just are not snappy enough of an experience for end users. Facebook is no exception, and we've often used the Facebook app as an example of what performance you can expect with a hybrid experience.<br />
<br />
There are a number of issues we run into with hybrid experiences.<br />
<br />
<ol>
<li>Too many applications try to replace the entire app logic with HTML5. They use the app as a shell rather than in key, strategic, critical places.</li>
<li>HTML5 Javascript and CSS downloads are way to heavy and large to download over mobile.</li>
<li>iOS WebView's have notoriously poor performance, and Android is not significantly better on a year old device.</li>
<li>Caching to prevent excessive downloads of CSS and Javascript can cause a large amount of bugs as Javascript and server side are not necessarily updated at the same time. This takes a strong asset versioning approach to get around these issues.</li>
</ol>
<br />
In all honesty, it's not that a hybrid application is bad. It's just that the HTML for a hybrid experience needs to be used strategically and as light as possible. Here are some our best guidelines for such an experience.<br />
<br />
<ol>
<li>Abandon Javascript and a Web 2.0 interface in your apps. You're better off utilizing a very lightweight XHTML request/response interaction with minimal CSS and very minimal javascript (i.e. if it can't be inlined, then consider not using it).</li>
<li>Perform all navigation natively. Keep the HTML for content only that needs to be updated easily without an app update. A great example of this is <a href="http://itunes.apple.com/us/app/urbanspoon/id284708449?mt=8" rel="nofollow" target="_blank">Urbanspoon</a> or <a href="http://itunes.apple.com/us/app/zite-personalized-magazine/id419752338?mt=8" rel="nofollow" target="_blank">Zite</a>.</li>
<li>Perform no animations, scrolling, moving in the HTML itself. Keep that all native.</li>
<li>For any button actions or similar perform this as an in-app scheme (i.e. your-app://) that is handled natively.</li>
</ol>
<br />
Following these guidelines can lead to a successful hybrid application, although it can be challenging for an organization to think in a lightweight manner.Gary Rudolphhttp://www.blogger.com/profile/17461555373591223876noreply@blogger.com1tag:blogger.com,1999:blog-3860120773535442225.post-62262767083708123062012-02-21T12:51:00.000-08:002012-02-21T12:51:32.665-08:00iOS Custom UISwitchOn an iOS project we had the need to provide a custom UISwitch similar to the following.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-F5_rk3Pg2Zk/T0QBlkImFSI/AAAAAAAAAAo/HKXM4Tf1AxU/s1600/Switch.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-F5_rk3Pg2Zk/T0QBlkImFSI/AAAAAAAAAAo/HKXM4Tf1AxU/s1600/Switch.png" /></a></div>
<br />
<br />
With iOSS 5 there is quite a bit of support for interface customization. It's great for customizing almost every control in iOS, except... UISwitch. The only thing customizable with UISwitch is the tint color, which is pretty limited. So, iOS 5 is out for supporting this customization.<br />
<br />
Next, we looked at several existing open source projects. There are several out there that support a customized look and feel, but none of these had the "feel" of the built in UISwitch control from Apple. Some would allow dragging, and some just clicking, but none allowed both a click and drag interaction.<br />
<br />
There was a strong desire for the switch to behave just like the standard UISwitch that supports both a click and drag interaction. That led us to create our own. We were able to support the look and feel and mimic the behavior of UISwitch by implementing a custom drawRect as well as a custom touch handling. Check the Open Source implementation.<br />
<br />
<a href="https://github.com/lolay/kat/blob/master/LolayUISwitch.h">LolayUISwitch.h</a><br />
<a href="https://github.com/lolay/kat/blob/master/LolayUISwitch.m">LolayUISwitch.m</a><br />
<br />
Next, we hope to extend this to support setting the "on" value with animation, and additionally adding in support for all the autoscale settings of iOS on a UIControl. Also, thoughts of supporting a UIView rather than just a UIImage.Gary Rudolphhttp://www.blogger.com/profile/17461555373591223876noreply@blogger.com1tag:blogger.com,1999:blog-3860120773535442225.post-8544900520102465552011-12-20T14:02:00.000-08:002011-12-20T14:03:41.659-08:00MyLife Android<p>It was great partnering with MyLife to launch their <a href="https://market.android.com/details?id=com.mylife.android.MyLifeRelease&hl=en">Android application</a>. Beyond the longstanding People Search of MyLife this contains a great way to see and post to all your social networks in one place. It makes "crossposting" and replying a breeze.</p>
<div class="separator" style="clear: both; text-align: center;">
<img border="0" height="230" width="138" src="https://lh4.ggpht.com/99AhkbZHxzuBPJ1RVum_NwHg1Bvl4NAVgEAx6qq9rryiQaDZeEYR6i0k4Csx_JbEwg=h230" />
<img border="0" height="230" width="138" src="https://lh3.ggpht.com/kZJ2t4gfbTOjq29pjfcVxSRo-th3Vvq70Ka962-E4ACtCNtP6n9JxZK1qxLRcSngOZo=h230" />
<img border="0" height="230" width="138" src="https://lh3.ggpht.com/BNisA-JWw8kTs_gkSfRwpj40QpIDaQOAHPyrIieDXNUU9rM0JpHwGNnd_KrMgD5hWgY=h230" />
</div>
<div class="separator" style="clear: both; text-align: center;">
<img border="0" height="230" width="138" src="https://lh4.ggpht.com/epZirOE2xYX2M2hU4b5-oLumjJBhHyPo6n_LjX-AehqIk2UBFbiDuiWm152dXtZVzT0=h230" />
<img border="0" height="230" width="138" src="https://lh5.ggpht.com/4LQaDLIw6pDuxLmvP_VtTwLWw8kIeIQvQSKMA6AwXqr3NR-bOFJa5aEiRJg8a46lzq0=h230" />
</div>
<p>Or, if you like to see a tour, check out the <a href="http://www.youtube.com/watch?v=P0KCrAnvMNg">YouTube video</a>.</p>
<iframe width="560" height="315" src="http://www.youtube.com/embed/P0KCrAnvMNg" frameborder="0" allowfullscreen></iframe>Gary Rudolphhttp://www.blogger.com/profile/17461555373591223876noreply@blogger.com1tag:blogger.com,1999:blog-3860120773535442225.post-47774099255484895172011-10-05T23:25:00.001-07:002011-10-05T23:32:41.615-07:00Dear Steve, we wouldn't have...<span class="Apple-style-span" style=" ;font-family:Helvetica;font-size:medium;">Dear Steve Jobs:</span><div style="font-family: Helvetica; font-size: medium; "><br /></div><div style="font-family: Helvetica; font-size: medium; ">Thank you for being inspiring, innovative, and just an incredible person. Reading the blogs, news articles, and other press, we have to agree with all the positive statements about your life and contributions. Without those contributions, us and our family/friends:</div><div style="font-family: Helvetica; font-size: medium; "><br /></div><div style="font-family: Helvetica; font-size: medium; "><ul class="MailOutline"><li>Wouldn't have had this revived industry to create our startup mobile software company</li><li>Wouldn't have the ability to see to see loved ones realtime on business trips without a PC or Mac</li><li>Wouldn't have had that amazing feeling when the brand new box from Cupertino showed up at our doors (too often sometimes)</li><li>Wouldn't have realized that American ingenuity and passion can still mean something in the 21st century</li><li>Wouldn't have missed you as much as we do</li></ul><div><br /></div></div><div style="font-family: Helvetica; font-size: medium; ">Sincerely,</div><div style="font-family: Helvetica; font-size: medium; "><br /></div><div style="font-family: Helvetica; font-size: medium; ">Lolay, Inc.</div>Anonymousnoreply@blogger.com0tag:blogger.com,1999:blog-3860120773535442225.post-58127643225283566042011-09-15T16:04:00.000-07:002011-09-15T16:11:50.277-07:00App Upgrade AdoptionHere's an interesting adoption plot of active users on a particular version of a major social networking app on the iOS App Store (In this case it was a Universal App). What it's interesting to point out is two different upgrade scenarios.<br />
<br/>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-p-Xuucu8MSg/TnKDahISSgI/AAAAAAAAAAk/gpaV1QsrJ7w/s1600/screen-capture.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="114" width="320" src="http://1.bp.blogspot.com/-p-Xuucu8MSg/TnKDahISSgI/AAAAAAAAAAk/gpaV1QsrJ7w/s320/screen-capture.png" /></a></div>
<br />
One scenario (Dark Green to Mustard) is where adoption is organic through the App Store and relying on the app store itself to notify the user. The second scenario (Mustard to Blue) utilizes an alert dialogue to let the user know a newer version is available with a direct link to the download in the app store. Here's the comparison.<br />
<table border="1" align="center">
<tr><th> </th><th align="center">iOS Organic Adoption</th><th align="center">iOS Alert Adoption</th></tr>
<tr><td align="center">25%</td><td align="center">2 Days</td><td align="center">2 Days</td></tr>
<tr><td align="center">50%</td><td align="center">5 Days</td><td align="center">3 Days</td></tr>
<tr><td align="center">80%</td><td align="center">12 Days</td><td align="center">6 Days</td></tr>
<tr><td align="center">90%</td><td align="center">21Days </td><td align="center">14 Days</td></tr>
<tr><td align="center">95%</td><td align="center">23 Days</td><td align="center">15 Days</td></tr>
</table>
<br />
In a nutshell App Upgrade Adoption is slow, but you can certainly speed it up with an Alert when the user launches the app to let them know to upgrade to a new version.Gary Rudolphhttp://www.blogger.com/profile/17461555373591223876noreply@blogger.com0tag:blogger.com,1999:blog-3860120773535442225.post-24850048934541563192011-09-05T22:27:00.000-07:002011-09-05T22:36:30.196-07:00Cowardly LionOk, so I upgraded to Lion. Faster, better, smarter, right? Wrong. Trying to run a mobile development efforts for our organization has been a bit of an effort. As a background, I have a MB Pro i7 with 8GB of memory.<div><br /></div><div>Here are the trouble pinpoints:<div><ul><li>Crashes (Safari, Xcode, iCal, Mail and even the Preview app!)</li><li>Slow and laggy (Safari and Xcode)</li><li>CPU out of control. I've come back to my machine after 30 minutes to find 400% CPU utilization.</li><li>Finder/Icons gone. Sometimes during Xcode development, my icons disappear from the dock and I have no feedback as to which apps are running.</li></ul><div><br /></div></div></div><div>Here is what I've tried:</div><div><ul><li>Clear Safari cache/history</li><li>Reset PRAM (http://support.apple.com/kb/ht1379)</li><li>Delete Library/Caches and ~/Library/Caches</li></ul><div><br /></div><div>So what worked?</div></div><div><ul><li>Clearing Safari and my cache definitely improved internet performance.</li><li>Resetting the PRAM stopped my out of control processes (high CPU)</li><li>Deleting my caches seems to have stabilized the icons disappearing and some of the caches.</li></ul><div><br /></div><div>Will update this blog as I continue to be the Lion Guinea pig!</div></div><div><br /></div><div><br /></div><div><br /></div>Anonymousnoreply@blogger.com1tag:blogger.com,1999:blog-3860120773535442225.post-31362472284379850342011-08-18T22:32:00.000-07:002011-08-19T10:28:47.669-07:00What It Takes to Start Up...This article is long overdue, but that in and of itself, should be an indication of what it takes to start something. My partner Gary Rudolph and I set out to change how/what our friends and family think about mobile about almost one year ago, and I really wanted to capture some of the thought process from beginning to end. <div>
<br /></div><div><b>Intro:</b> </div><div>
<br /></div><div>There are plenty of articles out there that will try to <i>teach</i> you what it takes to start up a company. Please excuse any lack of instructions here as it's all from the heart. If you learn at least one thing new, or even question the current way you're running a startup, I consider this article a success. <div>
<br /></div><div><b>The Phases: </b></div><div>
<br /></div><div>There are many phases, as I would like to call them, that you need to go through for a startup. The number of phases is entirely dependent on starting capital and ability to execute. Each phase might be slightly different depending on the industry, experience, starting capital, etc. Our experience was fairly straightforward:</div></div><div>
<br /></div><div><b>Phase 1: Be scared.</b></div><div>
<br /></div><div>If I had to name the singlemost important skill, something that keeps everyone else from doing this crazy thing, it has to be <b>courage</b>. Or, the contra to that, would obviously be fear. Fear of no paycheck, fear of rock bottom, fear of the poor house, fear that my kids will starve. All of those need to go through your mind before you can move onto phase 2. If those ideas never popped into your mind, you aren't ready. Or worse... you're a VC. In either case, please stop reading. If you are a VC, jokes on us, please direct emails to love_funding (at) lolay (dot) com.</div><div>
<br /></div><div>You need to have the courage to get past whatever it is that's stopping you, and jump off that proverbial entrepreneurial cliff so you can learn about yourself as a person. This phase is a lot easier when you have an awesome partner to go through it with you. By awesome I mean: Someone at your skill level or better, someone who is willing to put the same amount of time or more, and someone who can deal with your crap. That last part's critical, because it's very similar to a marriage; you get to keep half, and the kids [the idea] ultimately stay with one of you when you separate.</div><div>
<br /></div><div><b>Phase 2: The idea.</b></div><div>
<br /></div><div>Ok, so the idea was really there before Phase 1. I'm proud that you're catching on, but of course, there was some big idea that filled your empty time, that's what has gotten you through some tough days at work. However, prior to this moment, the idea was merely as a stretch goal. Something you could see yourself doing. It was never tempting enough to quit a job, or even take that less demanding job so you can really focus on the idea. This is the part where your addiction takes on a new shape.</div><div>
<br /></div><div>The idea isn't the hero, you are. What do I mean by that? If you're stubborn and unwilling to see the idea morph and change based on needs, capital and demand, you're wasting your time. You sort of feel your idea taking over your every day thought process. When you speak with friends, you are only trying to learn more about how you can refine your idea so it has less holes. When you talk with family, all you can do is tell them about your idea...again. </div><div>
<br /></div><div><i>Case and point:</i> We started off with the idea of creating a social monetization platform that learns how consumers behave and helps them make the best choices depending on the time of day, previous tastes and ads they have really enjoyed (clicked on). Been there, done that (call us for more info). We soon realized it was the amount of time, energy and convincing (ourselves) we had put into this platform that made it important intellectual property.</div><div>
<br /></div><div>It was incredible learning from it, but what we are doing now is 180 degrees different. Let's just say we are building the coolest mobile experiences for the greatest companies in Los Angeles. Being dynamic is critical to your livelihood and your sanity. If you are stubborn, you will fail. If you embrace change, it might make you a better person (as Gary puts it).</div><div>
<br /></div><div><b>Phase 3: No sleep.</b></div><div>
<br /></div><div>This is your time to shine. Can you look your wife in the eyes if you didn't give today 100%? In startup mode, you can't even look yourself in the mirror without giving 120%. We were working 100+ hours a week on slow weeks. My longest day ever was probably 24 hours straight of no sleep. I tried to sleep, but kept thinking of the big idea. </div><div>
<br /></div><div><i>One major lesson learned:</i> If the idea doesn't keep you awake at night, you either don't have a good idea or you don't believe in the idea. You better question your decision-making skills on Phase 1! Yah yah, you might have had a pushy partner that shoved you through phase 1, but why did you listen?</div><div>
<br /></div><div>I remember having a meeting one morning at 9:30 AM in Malibu. We were typically working until 3 AM most days. Gary and I looked at eachother with our week-old beards and said: "Coffee?" </div><div>
<br /></div><div><i>Mental note:</i> Those are the fun days. After years of employment, management, analysis, and top-down pressure, we realized that <b>creating</b> is still the most attractive piece of this entire puzzle.</div><div>
<br /></div><div><div><b>Phase 4: Go to market</b></div></div><div><b>
<br /></b></div><div>Your baby is launched. It's live! You've made it, right? Think again. You need to acquire users, credibility, exposure and set your brand apart so journalists don't ask: "Oh, it's like that other app that does X, Y, Z?"</div><div>
<br /></div><div>You will spend a lot of time following tweets, analyzing metrics and taking customer feedback. You will tweak your idea, refine, redeploy and have meetings to discuss the next iterations. You may even get lucky like we did and have some dough to spend on advertising. Great idea, let's blow thousands of dollars on banner ads each day... definitely lack of sleep. </div><div>
<br /></div><div>Your family will likely stop answering your questions, and your wife will still completely support your intentions (oddly). All the meanwhile, the clock is ticking and you need to get past Beta so everyone in the world can enjoy your big idea.</div><div><b>
<br /></b></div><div><b>Phase 5: Wait, we ran out of money? s*#@!</b></div><div>
<br /></div><div>Oh no, the big idea took too much time to build. This happens, ALL THE TIME. The greatest ideas take time to execute correctly. It's all about your reaction and ultimate decision that will make or break you as an entrepreneur. In our case, we decided to bootstrap. We really believed, and still do, that we can run on lean cash flow and make something without the extra investment that would dilute our ownership. Every story is different, and I'm sure I can write an entire article on that decision alone. </div><div>
<br /></div><div>Getting back to the topic at hand, what do bootstrappers do when they run low on capital investment (from their own checkbooks)? They help friends and colleagues achieve their goals for a little extra cash. We decided to commit some time to consulting so we could generate revenues that could be piped to our internal projects. </div><div>
<br /></div><div><i>The decision was very simple:</i> Take funding or consult and still retain 100% ownership. We decided we were very passionate about helping our colleagues in the same space, while also building our own confidence, and show that we can really kick ass when we aren't figuring out how to feed our families (Maslow's hierarchy of needs).</div><div>
<br /></div><div><b>Phase 4.5: Getting back on track. Yes, this is phase 4.5, especially</b><b> since phase 5 wasn't supposed to happen.</b></div><div>
<br /></div><div>If you took investment money, you may pass go. Please don't read this next section as this phase is for the boostrapper-minded. </div><div>
<br /></div><div>We got a little off track helping others succeed in the mobile game. I think the best way to illustrate this point would be through some Q&A:</div><div><ul><li>Do we regret anything? No, we learned more than we expected. </li><li>Are we excited still? Yes, the market is still hot and ready for disruption. </li><li>What are we waiting for? Downtime, mostly. We spend 95% of our time on customer service and delivery. </li></ul><div>Gary and I are entrepreneurs, no doubt about it. Since day one, we have sacrificed family, our significant others, kids, dogs, career path, finishing grad school, and many opportunities that would have been great learning experiences. We have battled house floods, Grave's disease, Gout, and created poor credit scores. I wouldn't change any of it for the world.</div></div><div>
<br /></div><div><b>Addenda:</b></div><div>
<br /></div><div>Someone asked me the other day: How do you know you've made it as an entrepreneur? Quite simply, the day you believe you've made it is when you stop being an entrepreneur. Keep running, improving, changing and creating...</div>Anonymousnoreply@blogger.com0tag:blogger.com,1999:blog-3860120773535442225.post-35828292830740956302011-07-25T20:08:00.000-07:002011-07-25T21:55:12.409-07:002011 11" MacBook Air vs. 2011 15" MacBook Pro Xcode PerformanceI just picked up the just released 2011 11" MacBook Air in the hopes of using that to replace my 2011 15" MacBook Pro. In the event it didn't perform well enough it would be given to the wife (actually, this was the original plan anyways, so if it can be a decent development machine, all the better)...<br />
<br />
Here are the specs (Both with Lion and Xcode 4.2 and iOS 5 Beta 4).<br />
<br />
<ol><li>Decked out 2011 11" MacBook Air</li>
<ol><li>1.8Ghz Core i7</li>
<li>256GB SSD (The faster Samsung one)</li>
<li>4GB Memory</li>
</ol><li>Decked out 2011 15" MacBook Pro</li>
<ol><li>2.3GHz Core i7</li>
<li>400GB SSD (OWC w/SandForce, not OEM)</li>
<li>8GB Memory</li>
</ol></ol><br />
For me the only thing that matters is Xcode performance. I just a project with the following characteristics, and measured a build from the time of pushing play to the time of the simulator launching with the login on the build displayed.<br />
<br />
<ol><li>224 Source Files</li>
<li>63 XIB's</li>
<li>419 Resources</li>
</ol><div>Here are the results:</div><div><ol><li>Clean Build</li>
<ol><li>MacBook Air: 38 seconds</li>
<li>MacBook Pro: 16 seconds</li>
</ol><li>Repeat Build (No Clean, Simulator Left Running)</li>
<ol><li>MacBook Air: 8 seconds</li>
<li>MacBook Pro: 8 seconds</li>
</ol></ol><div>It was expected the MacBook Pro would be faster. From a clean build it's significantly faster. From an existing build where you're touching a few files Xcode indexing to know what's changed or not makes it a wash. As most of the time we're just changing a couple files at a time the MacBook Air seems fast enough for development, just knowing that the clean build will take almost twice as long.</div></div><div><br />
</div><div>Also, to explain the difference, the actual copying of resources, launching the simulator, etc. took about the same time. There was a moderate difference in the compilation time, but the static analysis is where the MacBook Air lost out. The MacBook Pro killed it with the extra two cores and processor speed.</div><div><br />
</div><div>Now, the debate... I think I'm going to try out the MacBook Air and see how it goes...<br />
<br />
UPDATE: After using the MacBook Air I decided to stick with the MacBook Pro. That extra speed really matters when someone is looking over your shoulder. Particularly, at a client. Although, if you are used to a non-SSD MacBook Pro (particularly, the 2010 variety) you'll be happy with the performance of the Air.</div>Gary Rudolphhttp://www.blogger.com/profile/17461555373591223876noreply@blogger.com2tag:blogger.com,1999:blog-3860120773535442225.post-73203411605749934612011-07-21T08:45:00.000-07:002011-07-21T21:08:21.616-07:00OSX Lion and Xcode 4.1We've upgraded to OSX Lion and Xcode 4.1 and it has been an interesting process. Here's the steps we took.<br />
<ol><li>The first was to make sure we were upgraded to 10.6.8 before we started anything.</li>
<li>Purchase and download OSX Lion from the App Store (Note, you before starting the installation you may want to <a href="http://osxdaily.com/2011/07/08/make-a-bootable-mac-os-x-10-7-lion-installer-from-a-usb-flash-drive/">create a bootable drive</a>)</li>
<li>Install OSX Lion</li>
<li>Java is not installed by default, so after Lion is installed you can install Java by going to a Terminal and typing "java -version" and it'll start a download to install Java.</li>
<li>Before installing Xcode 4.1 it's good to remove any previous versions of Xcode</li>
<ol><li>Uninstall any previous Xcode by issuing a "sudo /Developer/Library/uninstall-devtools"</li>
<li>In ~/Library issue a "find . -name *Xcode*" and remove each file/directory</li>
<li>In ~/Library issue a "find . -name *Simulator*" and remove each file/directory</li>
<li>Reboot</li>
</ol><li>Next find Xcode 4.1 on the App Store and download and install it. This just installs the installer. You then have to install it. The installer can be removed when you're finished.</li>
<li>If Xcode launches with errors or has no menu times you'll need to reinstall iTunes. The <a href="http://www.apple.com/itunes/download/">download</a> has the 64-bit universal builds now.</li>
</ol><div>The only issue we've seen is that Core Location isn't working in the simulator and generates an error. See our <a href="https://devforums.apple.com/message/491859">post</a> on the developer forums.</div>Gary Rudolphhttp://www.blogger.com/profile/17461555373591223876noreply@blogger.com2tag:blogger.com,1999:blog-3860120773535442225.post-76323989976426206522011-06-13T22:13:00.001-07:002011-06-13T22:31:47.469-07:00Reading and Translating a DWARF'd iOS Crash DumpSo what the heck does it mean when a crash log has the following lines?<br /><pre><span style="font-family:courier new;">Thread 0 name: Dispatch queue: com.apple.main-thread</span><br /><span style="font-family:courier new;">Thread 0 Crashed:</span><br /><span style="font-family:courier new;">0 libobjc.A.dylib 0x35167c98 0x35165000 + 11416</span><br /><span style="font-family:courier new;">1 CoreFoundation 0x315b1cd6 0x315b0000 + 7382</span><br /><span style="font-family:courier new;">2 CoreFoundation 0x316620b8 0x315b0000 + 729272</span><br /><span style="font-family:courier new;">3 CoreFoundation 0x31663438 0x315b0000 + 734264</span><br /><span style="font-family:courier new;">4 CoreFoundation 0x315b9f98 0x315b0000 + 40856</span><br /><span style="font-family:courier new;">5 CoreFoundation 0x315c094e 0x315b0000 + 67918</span><br /><span style="font-family:courier new;">6 Foundation 0x34e9831a 0x34e81000 + 95002</span><br /></pre>Chances are, your Released application has Debug symbols stripped (DWARF), but have no fear, the Developer tools come with the right script to help with this. It's called symbolicatecrash, and with Xcode 4+ it gets installed to:<br /><br /><span style="font-family:courier new;"><span style="font-size:100%;">/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash</span><br /><br /></span>I've simply create an alias in my bash resource on login, but you may prefer a symbolic link. Hopefully you've kept a copy of the build when it was released, because the dYSM file contains the right mojo to add the symbols back. The following sample translates the often cryptic lines of a .crash file into something more understandable:<br /><pre><span style="font-family:courier new;">symbolicatecrash MyOopsAppWithABadBug.crash MyOopsAppWithABadBug.app.dSYM</span><br /></pre>The options are more clearly defined by adding the -h switch:<br /><pre><span style="font-family:courier new;">symbolicatecrash -h</span><br /><span style="font-family:courier new;">usage:</span><br /><span style="font-family:courier new;"> /Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/<br />Versions/A/Resources/symbolicatecrash [-Ah] [-o </span><output_file><span style="font-family:courier new;">] LOGFILE [SYMBOL_PATH ...]</span><br /><span style="font-family:courier new;"> </span><br /><span style="font-family:courier new;"> Symbolicates a crashdump LOGFILE which may be "-" to refer to stdin. By default,</span><br /><span style="font-family:courier new;"> all heuristics will be employed in an attempt to symbolicate all addresses.</span><br /><span style="font-family:courier new;"> Additional symbol files can be found under specified directories.</span><br /><span style="font-family:courier new;"> </span><br /><span style="font-family:courier new;">Options:</span><br /><span style="font-family:courier new;"> </span><br /><span style="font-family:courier new;"> -A Only symbolicate the application, not libraries</span><br /><span style="font-family:courier new;"> -o If specified, the symbolicated log will be written to OUTPUT_FILE (defaults to stdout)</span><br /><span style="font-family:courier new;"> -h Display this message</span><br /><span style="font-family:courier new;"> -v Verbose</span><br /></output_file></pre>Abracadabra! Those lines are easier to read now, but we have some work left to find the double-release or message sent to an object that is already evicted:<br /><pre><span style="font-family:courier new;">Thread 0 name: Dispatch queue: com.apple.main-thread</span><br /><span style="font-family:courier new;">Thread 0 Crashed:</span><br /><span style="font-family:courier new;">0 libobjc.A.dylib 0x34499c98 objc_msgSend + 16</span><br /><span style="font-family:courier new;">1 CoreFoundation 0x308e3cd6 CFRetain + 62</span><br /><span style="font-family:courier new;">2 CoreFoundation 0x309940b8 __CFBasicHashStandardRetainValue + 8</span><br /><span style="font-family:courier new;">3 CoreFoundation 0x30995438 __CFBasicHashAddValue + 100</span><br /><span style="font-family:courier new;">4 CoreFoundation 0x308ebf98 CFDictionarySetValue + 68</span><br /><span style="font-family:courier new;">5 CoreFoundation 0x308f294e -[__NSCFDictionary setObject:forKey:] + 54</span><br /><span style="font-family:courier new;">6 Foundation 0x341ca31a -[NSMutableDictionary(NSKeyValueCoding)setValue:forKey:] + 10</span><br /></pre>You can read more about the Debug and Symbolification process here: <a href="http://developer.apple.com/tools/xcode/symbolizingcrashdumps.html">http://developer.apple.com/tools/xcode/symbolizingcrashdumps.html</a>Anonymousnoreply@blogger.com3tag:blogger.com,1999:blog-3860120773535442225.post-81921196457081972022011-04-29T15:23:00.000-07:002011-04-29T15:23:06.838-07:00Zbar on Android with the NDKWe've had experience writing an automobile VIN (Code 39) scanner on both iPhone and Android. In the case of the iPhone we leverage the <a href="http://zbar.sourceforge.net/">ZBar</a> library and the Android the <a href="http://code.google.com/p/zxing/">ZXing</a> library. Unfortunately, Android has been a tremendous amount of work. There was a tremendous amount of fracturing with the camera drivers to code around to tune the image capture. But that's another story...<br />
<br />
For the image processing the ZXing library on Android with was simply not as fast or accurate as capturing Code 39 barcodes (no opinion on QR, etc.) as ZBar on the iPhone. This left an interesting customer service dilemma as Android would be subpar. We looked at a few options and settled on an interesting proposition.<br />
<br />
Android recently introduced the <a href="http://developer.android.com/sdk/ndk/">NDK</a> (Native Development Kit) that allows you to build native code from C/C++. Interesting... We realized that there was a good chance that we could get the ZBar library running on Android with the NDK (at least for the image processing). We did have to rewrite the build/make system as the NDK does not have full make/configure support. But, after investing time in this we were able to build the ZBar library on the NDK and leverage their JNI wrapper to invoke this code on Android.<br />
<br />
So far the results have been excellent. The ZBar library on Android is 50% faster in recognition for Code 39 and a lot more accurate.<br />
<br />
We'll be donating an example project to the ZBar project once we can remove the client specific portions.<br />
<br />
Also, just be aware this only applies for Code 39. We have no idea how the image processing quality compares for the other formats.Gary Rudolphhttp://www.blogger.com/profile/17461555373591223876noreply@blogger.com5tag:blogger.com,1999:blog-3860120773535442225.post-86580193719404239892011-04-09T23:41:00.000-07:002011-04-09T23:54:52.187-07:00How to Upgrade Test in the iOS SimulatorFor the purpose of upgrade testing in automation it's useful to have a build of the previous version of the application. Of course, for actual device installs this is easy with the use of adhoc builds and .ipa files, but for the Simulator this is a little more involved. It is feasible if you follow the following steps.<br />
<ol><li>Launch the Simulator (/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone Simulator.app) and set the hardware and version to the appropriate settings.</li>
<li>Delete any existing apps in the simulator.</li>
<li>Put a breakpoint in the main function (i.e. first line of the main function main.m). This is to ensure that no code writes any files to the build directory (i.e. CoreData, Analytics, Preloading URL's, etc.).</li>
<li>Run the project in debug and stop the program once it reaches the breakpoint in the main function.</li>
<li>At this point if you followed step (2) and only have one application it should be easy to locate in ~/Library/Application Support/iPhone Simulator/[version]/Applications and can easily be tar'ed up and archived and moved around.</li>
</ol>Now in an automated testing script you can remove any applications from the simulator, untar the appropriate archive, exercise preloading (i.e. logging in) to get the simulator in a state to test an upgrade. Now, simply build the project and have it install over this version and test any upgrade scenarios.<br />
<br />
This has even worked from Xcode 3.2.6 builds being applied to Xcode 4.0.1.Gary Rudolphhttp://www.blogger.com/profile/17461555373591223876noreply@blogger.com0tag:blogger.com,1999:blog-3860120773535442225.post-41254066376552817032011-04-05T21:20:00.000-07:002011-04-05T21:20:14.309-07:00iPhone Open Source AutomationTesting iPhone apps is always thought of last and is typically performed manually. At Lolay we believe in a strong automation investment to allow testing as we develop so that we can have confidence in the stability of our builds as we develop.<br />
<br />
Checkout a demonstration of how to automate the iOS platform / iPhone using all open source. This is all compatible with ANT and Maven in any continuous environment. In this demo you will be shown on open source can perform a basic test in Where U At? and run through both positive and negative testing. At the end you can see the JUnit results including screen shots of the failure.<br />
<br />
<a href="http://www.vimeo.com/21999946">Vimeo: How to automate the iPhone using open source</a>Gary Rudolphhttp://www.blogger.com/profile/17461555373591223876noreply@blogger.com1tag:blogger.com,1999:blog-3860120773535442225.post-13884761115278615422011-03-09T09:52:00.001-08:002011-03-09T12:27:14.453-08:00BIA/Kelsey Reviews Lolay, Future of Things to Come<a href="http://www.lolay.com/who.html">Gary</a> recently spoke with <a href="http://blog.kelseygroup.com/index.php/author/mike-boland/">Mike Boland</a> from <a href="http://www.biakelsey.com/">BIA/Kelsey</a> about Lolay's social and location-based efforts. You can read the details <a href="http://blog.kelseygroup.com/index.php/2011/03/09/fusing-mobile-social-and-monetization-a-conversation-with-lolay/trackback/">here</a>.<br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://blog.kelseygroup.com/index.php/2011/03/09/fusing-mobile-social-and-monetization-a-conversation-with-lolay/trackback/"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 246px;" src="http://4.bp.blogspot.com/-hiyNcHpA1_4/TXfiZ_3v0XI/AAAAAAAAABo/pZV3NyxauQw/s320/Kelsey.png" alt="" id="BLOGGER_PHOTO_ID_5582179199418880370" border="0" /></a><br />We are excited to note several key areas where Lolay will be focusing its efforts:<br /><ul><li>Where U At? iOS: <a href="http://itunes.apple.com/us/app/where-u-at/id406309516?mt=8">Where U At?</a> for iOS will have some major updates within the next two weeks. Look out for the details!<br /></li><li>Where U At? Android: We have been working diligently to release <a href="http://www.lolay.com/products.html">Where U At?</a> for Android and are pleased to announce it will be in the Marketplace very soon!<br /></li><li>Lolay's Incubator: Helping other developers (novice to experienced) create apps that make money and solve a problem out of the starting gate. Our <a href="http://www.lolay.com/platform.html">Lab Werx</a> platform will serve as the foundation for quick success.<br /></li><li>Partnerships: We are looking for like-minded people, companies and mobile efforts that are complimentary to Lolay's mission to change the way people interact. Feel free to <a href="http://www.lolay.com/connect.html">Connect with Us</a>.</li></ul>Looking forward to a great 2011!Anonymousnoreply@blogger.com1tag:blogger.com,1999:blog-3860120773535442225.post-52403420579910322012011-01-29T21:54:00.000-08:002011-01-29T21:54:11.909-08:00Mobile, Token Based AuthenticationWe've had some recent discussion on mobile authentication and thought it might be a good time to discuss how this works in the Where U At? application where we had white space to start fresh. For the most part we took a lot of insight from Twitter to use a token based authentication method, but not use OAuth. It's more of a service based OAuth that fits better in a paradigm where applications will interact as a service and want to tightly control the authentication service.<br />
<br />
As everything in Where U At? it's a REST implementation that looks like the following (a few details are omitted):<br />
<br />
<ol><li>POST: /tokens</li>
<ol><li>Request Data</li>
<ol><li>email</li>
<li>password</li>
<li>manufacturerId</li>
</ol><li>Returns: Token</li>
</ol><li>GET: /tokens/{UUID}</li>
<ol><li>Returns: Token</li>
</ol><li>DELETE: /tokens/{UUID}</li>
</ol>Behind the scenes we have a few objects that make this all work on the server.<div><ol><li>Token</li>
<ol><li>token_id</li>
<li>expiration</li>
<li>user_id</li>
<li>device_id</li>
</ol><li>User</li>
<ol><li>user_id</li>
<li>email</li>
<li>name</li>
<li>password (one way encrypted)</li>
</ol><li>Device</li>
<ol><li>device_id</li>
<li>type</li>
<li>manufacturer_id</li>
<li>security_id</li>
</ol></ol><div>Any application can create a token (i.e. login) and store the token or token_id locally and reuse that. For any requests to our other services you simply pass an X-Token header with the token_id as the value. The other resources will validate the token is valid (i.e. that it exists and is not expired).</div><div><br />
</div><div>Any application can verify the token using a GET request if they so desire. Additionally, they can delete a token to perform a logout.</div><div><br />
</div>We follow a practice that only one user and one device can have a token active at any time. This means that if I login into my iPhone and then my iPad the token for the iPhone is deleted on the server. This works for us in a Location Based Application with push notifications to ensure only one device for a user is updating location at a time. It also ensures push notifications go to the right device.</div><div><br />
</div><div>A token_id has the same security behavior as a cookie based session id like every web app in existance these days and can be "stolen". To prevent this all requests are encrypted using standard SSL (not just login) so that only the server and device ever can see the token.</div>Gary Rudolphhttp://www.blogger.com/profile/17461555373591223876noreply@blogger.com0tag:blogger.com,1999:blog-3860120773535442225.post-69767228341738220352011-01-29T21:18:00.000-08:002011-01-29T21:19:33.759-08:00Where U At? Server Release 8 (1/29/2011)Another month in the new year almost over and another release from team Where U At?! Another quick server release to upgrade to the new CityGrid v2 API's. With the new CityGrid v2 Offers API we are considering another upcoming release to make our deals/offers better!<br />
<br />
Where U At? Server Release 8 (1/29/2011)<br />
<ol><li>CityGrid v2 API's which has made our app faster for finding places and locations!</li>
</ol>What are you waiting for? Download the FREE app from <a href="http://bit.ly/whereuat">http://bit.ly/whereuat</a>Gary Rudolphhttp://www.blogger.com/profile/17461555373591223876noreply@blogger.com0