Error Previewing a Child Theme

This one took me a minute to figure out. I had worked on a child theme in WordPress, but ran into the following error when I tried to use Live Preview:

Twenty Seventeen requires at least WordPress version 4.7. You are running version 4.5.20. Please upgrade and try again.

The strange thing is the version of WordPress version 5.x not 4.5.20. Obviously there was a version conflict somewhere. Googling around produced no hits, that made sense.

The cause was that the version of WordPress on the production site was behind the version on the development site. Who knew? So, I updated the production site to the latest version and the problem went away.

I’m posting this so that it can help others.

Face ID/Touch ID for iOS 13 Update

Back in February 2015, my article on Touch ID was published on raywenderlich.com. I was written in Swift for Xcode 8. Every year or so i would update the article as an author on the iOS Team. Here’s a link to the latest — How To Secure iOS User Data: The Keychain and Biometrics – Face ID or Touch ID. A few months ago, I had to update one of my own apps for iOS 13 with Apple’s biometric identification framework, Local Authentication. My app was also still supporting Objective-C so here’s follow up on what I had to change. As a bonus you can also take your user to Settings in case they have disabled

First thing is to add Local Authentication at the top of the Login view controller.


#import <LocalAuthentication/LocalAuthentication.h>

Next create an action for the Touch ID method:

- (IBAction)touchIDAction:(id)sender {
LAContext *myContext = [[LAContext alloc] init];
NSError *authError = nil;

NSString *myLocalizedReasonString = @"Used for quick and secure access to the test app";
//...
}

After that we need to check if the device can support biometrics with canEvaluatePolicy and have an error ready.

Inside the touchIDAction add:

if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
error:&authError]) {
// 1. successful steps
} else {
// 2. Oops. There's a error!
}

Inside the canEvaluatePolicy, we’ll use evaluatePolicy:localizedReason:reply. The reply will have a block that either succeeds or fails with our error.

// 1. successful steps.
[myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:myLocalizedReasonString
reply:^(BOOL success, NSError *error) {
if (success) {
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
//Background Thread
dispatch_async(dispatch_get_main_queue(), ^(void){
//Run UI Updates

// using a Keychain utility method to get the email and password
NSString *passwordFound = [KeychainUtils getPasswordForUsername:self->emailTextField.text andServiceName:@"My_app" error:nil];
self->passwordTextField.text = passwordFound;
self->usingSecureID = true; // a Bool I added to keep track
[self loginAction:nil];
[NSLog showWithStatus:@"Logging_In"];
});
});
} else {
// User did not authenticate successfully, look at error and take appropriate action

//I'm using a showAlert method to bring up a UIAlertViewController
[self showAlert: @"There was a problem verifying your identity." withTitle:@"Error!"];
return;
}
}];

What do we do if there is an error enabling Face ID/Touch ID? It could be because the user has disabled the feature. What’s new is that we can now take the user to your application settings — without a hack.

Initially you can pop up an alert to inform the user. Added to UIKit in iOS 8, UIApplicationOpenSettingsURLString lets you add a button to the alert that will take the user to your app in Settings, where they can enable Face ID/Touch ID.

// Could not evaluate policy; look at authError and present an appropriate message to user
NSString *title = @"Error!";
  NSString *message = @"Your device cannot authenticate using TouchID.";
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault
                                                          handler:^(UIAlertAction * action) {
// do we need to return animation?
                                                          }];
    // open your app in Settings
    NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
    UIApplication *application = [UIApplication sharedApplication];
    NSString *settingTitle = @"Settings";
    UIAlertAction* settingsAction = [UIAlertAction actionWithTitle:settingTitle style:UIAlertActionStyleDefault
                                                           handler:^(UIAlertAction * action) {
                                                             [application openURL:url  options:@{}
completionHandler:nil];
                                                           }];
    [alert addAction:settingsAction];
    [alert addAction:defaultAction];
    [self presentViewController:alert animated:YES completion:nil];
    return;
}

The whole method would look like this:

- (IBAction)touchIDAction:(id)sender {
LAContext *myContext = [[LAContext alloc] init];
NSError *authError = nil;

NSString *myLocalizedReasonString = @"Used for quick and secure access to the test app";
if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) {
// 1. successful steps

[myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:myLocalizedReasonString
reply:^(BOOL success, NSError *error) {
if (success) {
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
//Background Thread
dispatch_async(dispatch_get_main_queue(), ^(void){
//Run UI Updates

// using a Keychain utility method to get the email and password
NSString *passwordFound = [KeychainUtils getPasswordForUsername:self->emailTextField.text andServiceName:@"My_app" error:nil];
self->passwordTextField.text = passwordFound;
self->usingSecureID = true; // a Bool I added to keep track
[self loginAction:nil];
[NSLog showWithStatus:@"Logging_In"];
});
});
} else {
// User did not authenticate successfully, look at error and take appropriate action

//I'm using a showAlert method to bring up a UIAlertViewController
[self showAlert: @"There was a problem verifying your identity." withTitle:@"Error!"];
return;
}
}];
} else {
// 2. Oops. There's a error!

// Could not evaluate policy; look at authError and present an appropriate message to user
NSString *title = @"Error!";
  NSString *message = @"Your device cannot authenticate using TouchID.";
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault
                                                          handler:^(UIAlertAction * action) {
// do we need to return animation?
                                                          }];
    // open your app in Settings
    NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
    UIApplication *application = [UIApplication sharedApplication];
    NSString *settingTitle = @"Settings";
    UIAlertAction* settingsAction = [UIAlertAction actionWithTitle:settingTitle style:UIAlertActionStyleDefault
                                                           handler:^(UIAlertAction * action) {
                                                             [application openURL:url  options:@{}
completionHandler:nil];
                                                           }];
    [alert addAction:settingsAction];
    [alert addAction:defaultAction];
    [self presentViewController:alert animated:YES completion:nil];
    return;
}
}
}

Command CompileAssetCatalog failed with a nonzero exit code

pulling out hair

Oh my good gravy!

I was working on a cleanly installed Mac after migrating user accounts onto it. My account is not the primary admin account (eg. UID 501). For some reason Xcode was installed with all the permissions set to that primary user, who has yet to log onto this Mac!

I have been having multiple issues trying to get Xcode to build on this Mac — my traveling Mac. I like to leave my bread and butter Mac at home and travel with an 11 inch MacBook Air. Primarily because any other Mac cannot be opened on an airplane, in Economy. I cannot afford to fly business class since the Indie-Apocalypse hit in 2014.

So the owner permissions were all f’ed up, where Xcode does it’s build business. The last straw was the “Command CompileAssetCatalog” failure.

The fix is to change the permissions on the Xcode folder in my own home Library (which all files should be all owed my username.) Pro Tip: replace your username where you see mine — tmitra

cd /Users/tmitra/Library/Developer/Xcode/UserData
ls -la

Checking the ownership of this folder showed I was not the owner. So I stepped back and fixed the permissions on the Xcode directory here:

sudo chown -R tmitra ~/Library/Developer/Xcode

Build and Run.

FWIW I also had to fix permissions elsewhere:

Error: Failed to create temporary directory: /Library/Developer/Xcode/UserData/IB Support/Simulator Devices/

sudo chown -R tmitra ~/Library/Developer/CoreSimulator/Devices

“tmp” couldn’t be removed because you don’t have permission to access it

sudo chown tmitra /Users/tmitra/Library/Developer/Xcode/DerivedData

Your mileage may vary.

Beavers & Bellwethers

This week we follow up on the case of an Oregon man who uses the title “engineer”. Apple lowered its Q1 guidance based on lower expectations. Apple also starts assembling premium iPhones in India. Apple’s new plans may reveal what projects will be worked on around the United States. Netflix has pulled iTunes billing for users. Picks: Gesture based app selection and organization, Learn Talks. 

EPISODE LINKS

Episode 227 – They’re Everywhere! They’re Everywhere!

We fact check on CSIS, overtime hockey, defeating Face ID, and git commit –amend. #askMTJC brings up promo codes for IAP and the bands on the Stanley Cup. Apple stock sees its best performance in five years. The main topic is top paying tech companies in 2018 and comparative compensation vs cost of living. We review the highlights of the More Than Just Code podcast in 2018. We also choose our top picks for 2018. Picks: Google Home Alone. After Show: The physics MP3 compression and Boxing Day.

Episode 227 Show Links:

Episode 227 Picks:

Keep in touch

Episode 226 – Bendgate Pro

This week Greg Heo leads the crew as they discuss the Windows 95 ugly holiday sweater, NHL hockey overtime 3 on 3, and protocol conformance. We follow up on Apple shutting down Music’s Connect feature, Sega Genesis Classics are playable on Amazon Fire, the C64 Mini, Windows Sandbox, Apple is producing new Peanuts content, breaking into Amazon face recognition with 3D printed heads, T-Mobile eSIM support, Apple will allow IAP gifted to Friends & Family. Apple will build new campus in Austin and add jobs across the US. Cydia Store shuts down. Apple confirms some iPad Pros ship slightly bent, but says it’s normal. Picks: Xcode Comment-Spell-Checker, 6 Audio books on Apple Books, The 8-Bit Guy, Functional Swift 2018 videos, MagazineLayout

Episode 226 Show Links:

Episode 226 Picks:

Episode 225 – A BIt Of A Fumble

We get an iOS shortcut for bypassing paywalls in #askMTJC. We follow up with a deep dive into poor iPhone XR adoption figures, Google+ has potentially exposed data from 52M users, Infinity Blade games removed from the App Store, Apple appeals to China’s iPhone ban, and Samsung removes the headphone jack. We take a look at some Swift tricks that you may not know about. Swift 5.0 wants us to try some nice breaking changes. You can record ARKit sessions in order to debug. It’s apparently really easy to add a second display to an iOS app. Picks: A look at the Original 1984 Macintosh User Manual, Swift Docker image hosted by Apple.

Episode 225 Show Links:

Episode 225 Picks:

Episode 224 – Siri, Open The Pod Bay Doors

We discuss using Siri to access application settings in our #askMTJC. We fact check on Indian Partitioning dates. We follow up on Apple Music arriving on Amazon’s Echo, Apple vs Qualcomm trial date set, 5G iPhone maybe as late as 2020, wireless charging for AirPods and AT&T first to support eSim. We discuss changing laws with GitHub pull requests. Apple’s program for women entrepreneur developers. Siri Shortcuts Not Working for many people. Real-time text support for Wi-Fi calling. Touch ID used in app scams to bilk users. Picks: Xcode Short Cuts, Run macOS on iPad, Play Retro Dark Castle on iPad with System 6.0.8, Optimizing Siri on HomePod in Far‑Field Settings

Episode 224 – Show Links:

Episode 224 Picks