iTunes Search Broken: Three of our apps are not properly indexed; Updated
If you search iTunes for ‘Aerochive’, our desktop application that does backup for the three mentioned apps, iTunes finds no hits. None. This is very odd. Why, because if you search for ‘cc11’ in iTunes you will find the two apps iTM Pad and iTM Tilt that have that string in their description. ‘cc11’ is not a word it’s just a very unique string. iTunes finds their app like magic. There are other specific keywords that should fix all three app. ‘CentreLink’ and Australian identification card for example is unique to our three apps. So what happens if you search for important keywords that customers would use to find my apps? Well it finds competitor apps just fine, but not any of our apps.
I have written iTunes Connect 4 time regarding this issue and will continue to keep them informed of their problems. I’ve written a bug report against iTunes in the developer bug reporting system. I have called a contact in Apple Developer Support and reported issue. I have written an old fashioned letter to Eddy Cue the SVP of iTunes regarding this issue.
I believe this problem has been affecting my sales for 3 - 4 weeks and has cost Software Ops many thousands of dollars thus far. This is unacceptable considering that our products has made Apple many 10’s of thousands of dollars. Software Ops is not getting the service we deserve.
Search does work on the application name or any text that is in the application name. So what we had done is the following; we’ve added a series of keywords to our application name. Here is an example:
My Eyes Only™ -Secure, Secret, Keeper,Password,Manager,Encryption,Credit Card,Electronic,Wallet,Notes,ID,Identity,Bank, Financial,Account,Management
If this seems like a crazy thing to do to get your application found, well it is crazy! But I believe that I’m working within the boundaries that iTunes has give me. I’m going my best to generate sales.
Update
Apple has responded and this is what they say was the problem:
Hi Joe,After further investigation of this issue, it was found that your application description contains names of multiple applications that are not your application. These names do not belong in your application description as keywords. Please remove these application names and your application will start showing in search results within 48 hours.If you do remove these names and do not see your application in proper search results within 48 hours, please let us know. Best Regards,iTunes Connect Support
Here was my response:
Hi,I understand what you are saying, and I have made the change. Thank you for identifying the problem.But there is a problem. I expect the same treatment as all other vendors in iTunes. I can prove to you in 5 seconds that iTunes is not applying this "policy" fairly across the iTunes store.Search for eWallet, a competitor. You will find the following hits: mSecure, Wallet Pro and Spd WalletThey ALL list eWallet in their descriptions. Why is it the case that their application descriptions are still indexed? Why is my application deprived of proper indexing just because I mention other applications?In addition, where does it say that I can't mention other Apps in my description? I did a quick search in the iTunes Connect Developer Guide and I saw no mention of mentioning other apps in the description as a cause to be not indexed. I also looked in the iTunes Connect FAQs.
Road Map Update: Updated
Passports
Rewards Cards (Airline and Hotel) (In current versions of MEO and ID Lock)
Data Backup -Aerochive for Mac is shipping. PC version under development.
A way to backup data to a desktop computer with the full expectation of protection through passwords and encryption. It will also need a way to display the information. It also needs a way to move data from one device to another.
Data Entry and Sync
People also want to enter data user their Mac or PC and they sync with the device. This includes importing data from a spreadsheet.
Car Insurance Cards
I wonder if a cop would take an iPhone representation of an insurance card as proof of insurance? In time that will be the case.
Generic Identity Card (In current versions of MEO and ID Lock)
We will have to explore this idea.
All of these are on this list and will all eventually become a functionality in My Eyes Only. You might imagine that creating desktop apps to support backing up and syncing is a significant amount of work. It takes time to do a significant amount of work. It is like creating 3 applications at once. The iPhone portion, the Mac portion and the PC portion. That’s a large project done three times over.
Progress on the iPhone and Mac efforts are making significant headway. The PC effort will have to wait till the first two are complete. In the mean time, expect a few other features to show up. Passports, better UI elements and better usability. Expect all of this to be in the near term.
Please keep sending ideas. If you want to help, send me scans of cards you would like us to implement. (Remove all the personal information in image editing software.)
My Eyes Only breaks the top twenty in Business
We understand that there is much more to do. The list is long an extensive. Many are direct customer requests and others are fantastic ideas that someday will make MEO useful beyond our customer’s current thinking.
New images for our Login category
Notes: Take notes and keep them private
Version 1.4.1
We’ve also made some cometic changes to our Logins screen and our Other screen. We will be doing more to bring more functionality and better looking graphics.
This is another example of our commitment to MEO and the iPhone/iPod Touch platform. We continue to constantly improve MEO and will maintain it long after others have given up on the iPhone platform.
MEO Roadmap
You will be happy that you’ve select MEO to protect your important personal information.
iPhone Key Chain and Distribution Profiles
I decided to “clean up” my distribution process and use one distribution profile for my two existing apps instead of using the original distribution profile that I had used for the initial release and 4 updates. I didn’t know that this would have a negative affect on the ability of MEO to access Key Chain items that had been placed into the Key Chain by previous versions of MEO.
An application that has placed items into the Key Chain can’t retrieve those items if a follow-on version is signed with a different distribution profile.
This behavior isn’t documented anywhere that I can find at the time of this post. I like this feature and shows that Apple is building strong security into the iPhone’s Key Chain, but please document it so we all understand the behavior.
I did find this instruction on the Distribution tab of the iPhone Program Portal, but I had not known this information was documented, because I had released many updates of MEO before this information was posted. I do believe item 1 below is key and should be made more visible to all iPhone developers.
Updating your ApplicationThe App Store uses three pieces of information in your application to identify a submission as an update to an existing application. When you are submitting an update of your application to iTunes Connect for App Store distribution, make sure to:
Use the same Distribution Provisioning Profile to build each new version of your application
Increment the CFBundleVersion and CFBundleShortVersionString values in your project Info.plist file. Note: Version numbers must be period-delimited sequences of positive integers (1.0 to 1.1, or 2.2.1 to 2.2.2).
Some may ask, “did you test your software before you shipped?”. The answer is yes. But you must understand, that I tested with a development profile that I hadn’t changed. The binary that I signed with the new distribution profile is correctly accessing the Key Chain, but the iPhone OS is denying access to the items because of the different distribution profile. The code is correct; my build process was incorrect.
There was, and still is, no way for me to find this “bug” prior to MEO being released to the entire world. iPhone developers can’t test the final released build before it is released to the public. This is a BAD process and that I suspect has hurt other developers.
I suggest the following.
1) Developers submit to iTunes.
2) iTunes approves for release, but doesn’t actually release it.
3) Developers can download and test what iTunes has approved.
4) Developers then OK, the release, and it hits the iTunes store.
If the developer finds a problem with the binary, the make the fix and start over at #1. All the while, the existing version of the app is selling in the App Store.
No Free Apps!
He says this about the premiere side of the store:
"Part two is like a traditional storefront, with limited real estate, so only the best or coolest applications are highlighted. It's a recommendation engine, that highlights popular, highly-rated, or innovative applications."
Will, who gets to pick what goes in the store front? Especially when he has this to say about Apple,
"It's a huge mistake for Apple to appoint themselves arbitrator of what's cool, or to even appear to do so. It's an equally huge mistake for Apple to decide that all innovation must come from Apple."
Will, who gets to pick? Don't tell me it will be the corrupt customer reviews? Yes I say corrupt. The reviews smell of corrupt manipulation. How about payola? Yes, I'll bet this is already in play in the App Store. This is an incredibly bad way to eliminate the "crap apps". Really quite dumb.
One fast way to get rid of the crap apps is to make the companies with free apps PAY for each download. That's right, you heard me. Make them pay Apple the same amount the .99 cent apps pay. A mere 30 cents. The free crap will disappear over night. The companies who's business model requires free software on the iPhone can cut into their back end profit and help support the App Store like the rest of us do! This should not be a problem for the venture capital supported social networking or advertising play back-end business models that will make 10's of millions off the iPhone. Right?
Understand, that I'm not against free apps. I'm again freeloaders! I'm against crap apps!
Oh by-the-way, how do you define a "crap app" exactly? I will agree with Will, let the market decide.
Advanced Password Management
We have added the most complete password management for a mobile personal information keeper.
Here are the new capabilities:
- Password Reset - Reset your password and feel confident that your secret data will not be compromised.
- Password Recovery - Add a password recovery question and an answer that only you can answer. Answer correctly, and you will be allowed to reset your password.
To add a password recovery question and answer, you will need to go through the process of resetting your password, in the Settings -> Pasword Settings -> Change Password and Hit button.
Backup your iTunes App Backups
How to Restore from iTunes Backup
When your device is attached, right click on the device and you will see the following options. Select “Restore from Backup...” and all the data backed up onto your iPhone will be restored from the last time it was synced/backed-up.
See our support page “How do backups work?” section for more details.
App Store Reviews: Contined
I appreciate the enthusiastic reviews, they keep us going late into the night. Thanks all!
There are few reviews, usually 1 star reviews that are just odd and out of place. They don’t provide any value to us at Software Ops and they don’t provide any value to potential customers. They are, I suspect, opposition marketing at work. Let me be clear, not all the 1 start reviews fit this category. The 1.0 version did suffer some problems, but we responded and all known problems are fixed.
The last couple of 1 and 2 star reviews are just plain stupid. Read More...
Version 1.1.1 Released
Number 1 Customer Request - An option to request password at startup. If you want to keep all your information private, go to Setting -> Password Setting and Request Password At Start -> change it to Request Password At Start
Added an “Other Card” in the credit card category for cards not already in the list
Added the icons for the cards in the credit card category list
What’s Fixed
-In the Logins, if you have a URL that starts with “https” it now will link to that URL if it is valid.
Fixed credit card customer server phone number entry issue with the form of xxx-xxxx.
The new Settings screen includes Password Settings
The new Password Settings screen allows you to select when you want to have MEO ask for your password. Read More...
Version 1.1 Submitted: Update
I’m a bit behind on the blog, but version 1.1 has been out for over a week and I believe that the majority of my customers have upgraded.
My Eyes Only™ Hits the App Store
Avicom to the rescue!
If you find that softwareops.com is a great looking site and that My Eyes Only™ has a very iPhoneish icon then I will give credit to Avicom for their creative design. Also, the backgrounds for the information screens for MEO were also created by the talented staff at Avicom. So, if you’re looking for creative support for your application or web site, click on the icon above and find out more about Avicom.
App Store Reviews
First I want point out that I want constructive criticism from users who have actually purchased My Eyes Only™.
The Freetards
Where to start with this. The freetards have polluted the App Store. This is a disgrace to the wonderful App Store. Using the word disgrace is an emotional response and I said I would use logic. Well, there is just no logic to the freetards. It is a religion filled with emotion.
Report Your Problems to the Company
It theory, this should not be needed but if you run across repetitive problems that you did have in the first place, then reboot. Here is one comment that was fair but, put the blame in the wrong place. This was for an application that I’m interested in purchasing.
I was just about to post this great review about how the application is easy to use and turns you free time in great fun, when I started to have stability issues with it. At the moment the program does not run at all, clicking ok the icon does nothing but shows the splash screen (which it already annoyed me because it takes time from starting the application) the quits.
Well I had the same problem with my iPhone and I was stumped. But, by happen stance I decided to re-download my apps from the store. Did you know you could do that? Well that cleared up my problem.
Reboot Your iPhone
I was testing MEO and I found a bug that I could reproduce. Those are the best! I did it 5 times while having lunch so I had it nailed. Well, I decided to reboot the iPhone, just to see what would happen. Well... I could not reproduce the problem. In fact, I spent an hour and a half trying to reproduce the issue and finally gave up. It most likely wasn’t my problem.
Don't Make Me Enter My Password...
You see, one thing I learned early on is that you may not actually have all the information stored in MEO that you though you did. So, allow me browse a bit to see if that infomation I need is in MEO ..... then just as I have zeroed in on the info you’re looking for..... and I’m just one simple touch away from what I’m looking for.... the darn MEO application makes me enter your stupid password!
PERFECT!!
Last Minute Eye Candy Change
So when you select the edit mode you would expect the text to remain white, but in stead you get shade of gray. Why would I mess with such a wonderful scheme?
The reason is because of the magnifying tool.
Well, where’s the big problem here it looks just fine, right? Well, the magnifying tool is “smart” enough to respect the color of the text. Thus, the beautiful white text was invisible on the white background. Not such a good thing. I had to scramble in the last day before shipping and select fonts colors for my various fields so they would show up both in the field and in the magnifying glass. What I have is a compromise but what I have now works.
Oh, BTW, I figured that if the magnifying glass respected the font color, it probably respected the background color. Well, no.
Entering information into My Eyes Only™
What I did for MEO is to design appealing visual layouts with elegant graphics as a back drops for simple edit fields. Then I used the power of the iPhone keyboard to move from field to field. In addition, if some fields had fixed lengths, as in a credit card number or social security number, it just moved to the next field automagically. I also highlighted the current edit field to help the user see what was being edited. (I credit Dan M. for the tip.)
In addition, when you are done entering the last field that is visible, when you go to the next field that is out of view, it scroll into view. Very cool! And useful I might add.
Submitted to the App Store
In reality it will be the beginning of the beginning. Everything I’ve done so far, was just the prelude to the beginning.
Help from DTS
To break me out of the bind I was in, I decided to use one of my DTS tickets and asked for support. Now in the fairness of full disclosure, I asked for support regarding the KeyChain APIs about 6 weeks before I received the help. But, help was quickly sent my way once I was accepted into the iPhone program. It was like the damn broke. I got accepted into the program and then the DTS support showed up and it was exactly what I needed to keep me moving.
With the help from DTS, my biggest technical concern is now being worked on with success. It will soon be behind me.
Interesting iPhone Apps, I've Seen: The creativity level is high
These are all real concerns, but what I've seen, is that I bet I won't have too much to worry about. Why, because the apps that I've seen, are nothing that I would have thought of, nor what I would write. And that is because the ones I've seen are so creative that I just couldn't have created them. I will be sending out some links when I can, to show you the creativity.
Sure, there will be duplicate apps on the iPhone and perhaps even duplicates of what I'm building. But, I believe I will be OK. More importantly, the iPhone users will be blown away with what they are going to have in their hands, literality, in the near future.
iPhone Program Hell
Given the number of folks out there without early access, I feel that I have to step up to the plate and deliver a high quality, application that meets the high stands of an iPhone application.
Snow Leapord: Performance is a Feature
While I agree that stability should be free guess what? It is free. That is what all the third digit updates are about. And in some cases new features are added and performance is improved for free. I think Apple is holding up its end of the deal. But what about pure performance improvements?
Performance is a feature of a working system. It takes a great deal of effort to identify, assess, engineer and test performance improvements. In fact, a proper product organization considers performance a feature. It needs to identify where performance is key to a product, plan for time to investigate performance improvements, implement the performance enhancements and then test. Then, when performance has been achieve, it needs to be marketed just like any other feature.
I give Apple product managers and sr. management credit for standing up and saying that performance is a feature, and treat it like any other feature. It’s a Think Different kind of move.
Now That Was Easy!
I first build the xCode project for My Eyes Only with Beta 1. I used that project through all the beta releases including beta 6. When I got device access and provisioned and iPod Touch, by following the multi-step instructions, I was ready to compile and run on the iPod. When I compiled with to the iPod target it didn’t compile. Sad Face. But if I build a new Cocoa Touch project in xCode, compile and run, well like magic it ran on the device. That was just so cool! But I still have a problem, my project didn’t compile.
I’m the kind of person that looks for the easy way out, especially when time to market is key. As a wannabe Indie, I need to get product into the market. So I thought to myself, I can struggle through the compiler errors or perhaps try make a new project from scratch and add all my file and compile and run and see what happens. So I did. And it worked!
WOW! Was I jazzed. I mean, it just worked like magic. My application that had been running on the simulator ran on the Touch without a single line of code changed. Did it work because I was some kind of genius engineer? No. It just worked because Apple has some genius engineers, and development manager and project managers and product managers.
The bar is high.
Getting with the Program
I owe thanks for another Indy developer for pulling some string for me and getting help from Apple evangelism. I’m not going to name-names at this time, but those who have helped know who they are. I will give credit after July 11th.
I’m grateful for you help.
Deselecting a UITableViewCell within a SelectRowAtIndexPath
- A user shows a UITableView and selects a row.
- The Row highlights to indicate the user made the selection.
- The UITableView scrolls away.
- The user shows the same UITableView again, this time the same row is selected.
- Sad Face for me the programmer
Note: I believe this is only happening with UITableView that is created from a nib file.
So what is the big deal, just use deselectRowAtIndexPath: and it is deselect the row. Well there is a catch, or not if you are smarter than me. The catch is you need out use deselectRowAtIndexPath:indexPath animated:YES and heres why; If you set animated:NO then the row never get highlighted and the user may not really know which cell was selected. But if you use animated:YES then it deselects during the animation, right after it does the selection during the animation. Makes sense? Well not really, but the good part is that the next time the table view is shown the selection is gone, as I wanted.
Sad face gone.
Here is some code to ponder. This is a TableViewDelegate and I'm using the tableview as a modal view.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// do some stuff
[self.navigationController dismissModalViewControllerAnimated:YES];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
Apple Has Set The Standard
This is a challenge for any application developer because we are all new to the platform. If you are a seasoned Cocoa developer you have a leg up on the mechanics of iPhone development, but what do you really know about hand held devices? What about other mobile software developers? Sure they understand the concepts of mobile computing, but the development environments are totally new. Then there's that WOW factor thing. Windows mobile applications just don't have that, so those developers will need to get into the groove of iPhone development. If you are starting from the ground floor, you have to learn how develop for mobile devices and learn the Apple way of software development. What could be more exciting!
With this said, I believe that the initial round of iPhone and iPod Touch applications that will be available at the "grand opening" will be nothing short of stellar. By bringing on third party application developers, Apple has stacked the deck in goal to dominate the mobile device market.
iPhone Development: Beta 4
Many of the API changes are of the properties type. That look like this:
Modified CLLocation.altitude
|
|
Declaration
|
|
Old
|
@property(readonly)
CLLocationDistance altitude
|
|
New
|
@property(readonly,
nonatomic) CLLocationDistance altitude
|
While there were a large number of these changes, I suspect they are starting to lock down their APIs in much of the SDK.
Without digging too much into this method, I think I'm going to like it: -[UIViewController initWithNibName:bundle:]
I also want an example of how to use the Proxy Object in IB.
My application didn't compile because they removed UIModalView. But added UIActionSheet and they updated their sample code so it will only take me a few minutes to get back online.
iPhone Development: Beta 3 and Interface Builder
But then, while looking at the updated examples, what did I find? But the use of xib files and IB. I was very excited because one example was exactly how I needed to use IB for my IPhone application.
The moral of the story? Don't get ahead of Apple's SDK engineers or you will endure much pain.
iPhone Development: UITableView nib Hell
The gist of the problem is, once the UITableView has been displayed with some cells, when I try to change the state of the cell by using UITableViewDelegate protocols, implemented in my UIViewController for the table view, noting happens. If I try to deselect, reload the data in the view with new data, it just doesn't show up.
For example, making this call doesn't actually visually deselect, but does actually deselect internally, meaning there is not selection in the UITableView.
[(UITableView*)self.view deselectRowAtIndexPath:selectedRowPath animated:animated];
If I want to reload the view with a different set of cell data and I do the following.
- (void)viewWillAppear:(BOOL)animated
{
self.title = [self categoryToShowInTable];
[(UITableView*)self.view reloadData];
}
All the table vie delegates get called such as cellForRowAtIndexPath, but the view as displayed doesn't show the new items.
It almost seems to me that I have something very wrong, and it is causing me this behavior. If that is the case I'll update this entry with the solution.
iPhone Development: The Whole Delegate Trickery
@interface CategoriesViewController : UIViewController
So, I declare my view controller and add in a few protocols and I'm in business. Well, have access to the "business" anyway. I don't know how this is done in the OO runtime world, where it came from, (Smalltalk?) but I sure do like it.
NSTreeController Development: Walking the Tree
The method arrangedObjects is very useful, see here: – arrangedObjects Notice that it returns a proxy root tree node containing the receiver's sorted content object. Those are some very important words and hard to explain, so instead of trying to explain, I''ll show.
NSArray *treeNodes = [[self arrangedObjects] childNodes];
So, arrangedObjects returns a proxy root tree node, so just pass that into the childNodes of NSTreeController, another useful 10.5 method, and you get all the children of the treeNode. Since I used arrangedObject, I get the top of the tree so that I can with it as I please, mostly.
Anyway here are some category classes that allow you to walk the tree using any controller selector as a callback. This example is not perfect, it is a work in progress, but useful none the less.
The code below is defined as a catagory of NSTreeController, in a garbage collected environment, so there is no memory management.
//
// NSTreeController-Extensions.h
//
// Created by Joe Michels on 3/8/08.
// Copyright 2008 Software Ops LLC. All rights reserved.
//
#import Cocoa/Cocoa.h
@interface NSTreeController (NSTreeController_Extensions)
- (void)visitAllNodesStartingWithNode: (NSArray* )treeNodes useSelector: (SEL)inSelector
withObject: (id)inObject;
@end
//
// NSTreeController-Extensions.m
// TeamPlayer
//
// Created by Joe Michels on 3/8/08.
// Copyright 2008 Software Ops LLC. All rights reserved.
//
#import "NSTreeController-Extensions.h"
#import "ProjectsController.h"
@implementation NSTreeController (NSTreeController_Extensions)
- (void)visitAllNodesStartingWithNode: (NSArray* )treeNodes
useSelector: (SEL)inSelector
withObject: (id)inObject
{
// This is a recursive decent routine. It will walk the tree visiting each node
for (id item in treeNodes)
{
NSLog( @"Visiting tree node: %@", [[item representedObject] valueForKeyPath:@"name"] );
[self performSelector:inSelector withObject:item withObject:inObject];
//check for a decendent
NSArray *childNodes = [item childNodes];
if ([childNodes count] > 0)
// we are recursing
[self visitAllNodesStartingWithNode:childNodes useSelector:inSelector withObject:inObject];
}
}
@end
Let's make a call using the above code.
- (NSArray* )itemsForScripting
{
NSLog(@"Getting projects for scripting, returned in array.");
NSArray *treeNodes = [[self arrangedObjects] childNodes];
NSMutableArray *itemsArray = [[NSMutableArray alloc] initWithCapacity: 2]; << 2??, whatever!
[self visitAllNodesStartingWithNode:treeNodes
useSelector:@selector(getOrderedListOfProjects:withArray: )
withObject:itemsArray];
return itemsArray;
}
You can pass nil for the object as in this code snipet:
NSArray *treeNodes = [[self arrangedObjects] childNodes];
[self visitAllNodesStartingWithNode:treeNodes
useSelector:@selector(findAllMatchesInNodes:withObject: )
withObject:nil];
NSTreeController Development: Inserting Objects for Scripting
First I want point out that I want constructive criticism from users who have actually purchased My Eyes Only™.
The Freetards
Where to start with this. The freetards have polluted the App Store. This is a disgrace to the wonderful App Store. Using the word disgrace is an emotional response and I said I would use logic. Well, there is just no logic to the freetards. It is a religion filled with emotion.
Report Your Problems to the Company
It theory, this should not be needed but if you run across repetitive problems that you did have in the first place, then reboot. Here is one comment that was fair but, put the blame in the wrong place. This was for an application that I’m interested in purchasing.
I was just about to post this great review about how the application is easy to use and turns you free time in great fun, when I started to have stability issues with it. At the moment the program does not run at all, clicking ok the icon does nothing but shows the splash screen (which it already annoyed me because it takes time from starting the application) the quits.
Well I had the same problem with my iPhone I was stumped. But, by happen stance I decided to re-download my apps from the store. Did you know you could do that? Well that cleared up my problem.
Reboot Your iPhone
I was testing MEO and I found a bug that I could reproduce. Those are the best! I did it 5 times while having lunch so I had it nailed. Well, I decided to reboot the iPhone, just to see what would happen. Well... I could not reproduce the problem. In fact, I spent an hour and a half trying to reproduce the issue and finally gave up. It most likely wasn’t my problem.
iPhone Development: Interface Builder -Read the Damn Release Notes!
What to do?
Since there was no iPhone example application using IB, I was on my own and started digging around. I first realized that the UINavigationController as setup by the nib loading process was missing a few initialized objects as compared to one initialized with initWithRootViewController. Hmm... OK, so I ditched the nib based UINavigationController with one I created and initWithRootViewController. "That should help", I thought. Ah... no. I better try to find more about IB and iPhone. So I reread the release notes and sure enough, right there in front of my face was the answer:
FAQ: How do I edit a Cocoa Touch view controller? ▪ Drag a view controller object from the library into the document window. ▪ In the document window, double-click the icon for the view controller object to open its editor. ▪ Drag and drop views, navigation items, and tab bar items from the Library onto the editor.
Well, OK. To be fair to me, when I first read this I was not thinking that I defined the UI by dragging and dropping views onto a view controller UI thingy. When I did, cha-ching! it worked.
