Episode 13 The Apple Pay Menace

This week we discuss major retailers blocking the use of Apple Pay in favor of MCX’s CurrentC solution. We also delve into CurrentC’s challenges in light of recent hacks and it’s unease of use. We revel in and are shocked by the success and defeat of James Thompson’s PCalc as it is both featured and threaten with removal on the Apple Store. Jaimie retells the story of Gilt’s login bug on iOS. Picks: Auxy, Google Inbox, RWDevcon and iOS Leads

Episode 13 Show Notes:

DairingFireball: Retailers blocking Apple Pay (and Google Wallet)
TechCrunch: CurrentC Is The Big Retailers’ Clunky Attempt To Kill Apple Pay And Credit Card Fees
iMore: In-depth look at CurrentC and the personal data they want to collect
David Barnard App Review Psychology
Gilt Tech: Sleuthing—and Solving—the User Logout Bug on iOS 7

Episode 13 Weekly Picks:
Auxy
Google Inbox
RWDevcon 2014 – February 6 & 7 in Washington DC
iOS Leads – Use the code MTJC to save 20% off your first month.
Android Leads – Use the code MTJC to save 20% off your first month.

Episode 11 – Apple tries to rise while we race to the bottom – Oct 16, 2014

This week we discuss the Apple’s Oct 16, 2014 press conference, “It’s Been Way Too Long”. We discuss Apple Pay, WatchKit, iOS 8.1, Yosemite, the new iPad Air 2, the iPad lineup and the new iMac 27 with Retina Display. We also discuss BBEdit’s decision to leave the app store, apps Clips and iDraw.

Listen or Subscribe on iTunes

Listen or Subscribe on FeedBurner

Detect iOS 8 with Xcode 5.1.1

While prepping an app for submission that still supports iOS 6 & 7, we discovered a bug when the app in run under iOS 8. There was a change to EKEventViewController that leaves behind some UI when the view is dismissed. So we had to use the default method for presenting the view.

The way we tested for iOS 6 and 7 last year was to check the version with:

floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1)

However Xcode 5.1.1 doesn’t have an enum higher than NSFoundationVersionNumber_iOS_6_1, so it won’t detect an OS version higher than 6.1.

NB the recommended solution is to build your app with Xcode 6, which does recognize NSFoundationVersionNumber_iOS_7_1.

To detect the system version you can use “systemVersion” from “UIDevice”. It’s not decremented yet, so you can do something like:

NSLog(@”system %i”, [UIDevice currentDevice].systemVersion.intValue);

        NSString *version = [UIDevice currentDevice].systemVersion;

        if (version.intValue <= 7.1) {

            // Do something for iOS 7.1 or earlier

        } else {

            // Do something for iOS 8.0 or later

        }

This hasn’t been tested much, but give it a try.

The next release will be on Xcode 6 (I promise!)

MTJC Podcast – Ep 8, Psychic iPhone 6 Plus Bending

Episode #8 – Psychic iPhone 6 Plus Bending – Sept 24, 2014 

In the September 24th show, we discuss our hands on experiences with handling the iPhone 6 and iPhone 6 Plus, the odd placement of the iPhone 6 power button. Apple’s quality control, bend-gate and bend-gazi, the iOS 8.0.1 snafu and iOS 8 adoption rates one week in.

 

Episode 8 Show Notes:
Star Trek Next Generation Wallpapers
Awesome ScreenShot
iOS 8 update trend via Mixpanel
Apple iOS 8 numbers
RunSwiftlang.com
Register Your iPhone at My Support Profile
X-Mirage

My MacBook Air 13 display rotated in the System Preferences, displaying the iPhone 6 Plus simulator full screen.
My MacBook Air 13 display rotated in the System Preferences, displaying the iPhone 6 Plus simulator full screen.

 

 

Apple leather case on an iPhone 6 Plus. Showing how close to the glass the case sits.
Apple leather case on an iPhone 6 Plus. Showing how close to the glass the case sits.



Listen to Episode 8

 

[twitter url=”https://itunes.apple.com/ca/podcast/mtjc-podcast-podcast-about/id906987516?mt=2″ hashtag=”#MTJC” text=”Spookiness in MTJC Episode #8 – Psychic iPhone 6 Plus Bending? Listen to the Podcast on iTunes or FeedBurner” float=”left”]

[button link=”https://itunes.apple.com/ca/podcast/mtjc-podcast-podcast-about/id906987516?mt=2″ bg_color=”#cf93cf”]Listen on iTunes[/button]

[button link=”http://feeds.feedburner.com/MtjcPodcast-APodcastAboutIosMacDevelopment” bg_color=”#cf93cf”]Listen on FeedBurner[/button]

BTW If you like this podcast, please write a positive review on iTunes. It really helps. Thanks.

Xcode Process launch failed: Security

launch failed security

The latest annoyance in Xcode had me stumped for a bit but @smappsoft set me straight. When trying to build and app under iOS 8, the build succeeds but the app doesn’t launch. Saying “process launch failed: Security” and not much else.

Turns out that the build was successful but your shiny new iOS 8 device doesn’t “trust” your profile.

Security: 1, Developer: 0

IMG_5124-cropped

So to solve this new cryptic behavior, launch the app on your device (which you just installed) and you will get a trust prompt asking you to approve an “Untrusted App Developer”. This is Gatekeeper asking you to confirm your trust of the developer (yourself).

Once you’ve completed this trust you can happily install apps from Xcode.

Supporting StoreKit Affiliate ID in iOS 8 w/o breaking iOS 7

As you may already know, iOS 8 finally supports loading a StoreSheet complete with your Affiliate ID. This way you can keep users in your app without sending them over to iTunes or App Store apps and still get commissions from Apple. However if you want to support iOS 7 users (for the time being) you will need to load the Store Kit Product Parameters with the playlist only – or your app will crash. So naturally check for NSFoundationVersionNumber to test for version iOS 7.1 or 8.0 and load the correct parameters.

You can watch the WWDC 2014 Video about this new feature.

Here’s the code using contstants to hold IDs for your playlist, affiliate and campaign IDs.

– (void)openAppStore:(id)sender {

    // Initialize Product View Controller

    SKStoreProductViewController *storeProductViewController = [[SKStoreProductViewControlleralloc] init];

    // Configure View Controller

    [storeProductViewController setDelegate:self];

NSDictionary *parameters;

    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1) {

        // Load resources for iOS 7.1 or earlier

        parameters = @{SKStoreProductParameterITunesItemIdentifier:kPlaylistID};

    } else {

        // Load resources for iOS 8 or later

        parameters = @{SKStoreProductParameterITunesItemIdentifier:kPlaylistID, SKStoreProductParameterAffiliateToken:kAffiliateID, SKStoreProductParameterCampaignToken:kCampaignID};

    }

[storeProductViewController loadProductWithParameters:parameters completionBlock:^(BOOL result, NSError *error) {

if (error) {

NSLog(@”Error %@ with User Info %@.”, error, [error userInfo]);

} else {

            // Present Store Product View Controller

            [self presentViewController:storeProductViewController animated:YES completion:nil];

}

}];

}