Archive for December 6, 2014

Saturday, December 6, 2014

PDFpen 2 and Paid Upgrades via App Store Bundles

Michael E. Cohen:

To make upgrade prices possible, Smile has taken advantage of a new App Store feature for developers, the ability to sell software bundles (collections of multiple apps), along with another new App Store feature, the ability to offer older versions of their apps to purchasers who cannot run the latest versions of those apps on their devices.

Here’s how it works: By making PDFpen 2 require iOS 8, Smile can continue to sell the older versions of PDFpen for iOS (there is one such app for iPhone and another for iPad). And because developers can now offer software bundles, Smile has created two bundles for owners of previous versions of PDFpen. The first is a $19.99 bundle that contains both the old PDFpen for iPhone along with the new PDFpen 2 (a universal app that runs on both iPhone and iPad). The second bundle, for owners of the old PDFpen for iPad, includes both the old iPad app and the new universal app: this bundle costs $21.99.


Because the new PDFpen, from the point of view of iOS, is a new app and not an upgrade to an older app, you can install it on your iOS device without deleting the older version first. And, in fact, you want to do that because when you launch the new app it migrates whatever files the old app kept in its private document storage to the new app. Once that one-time migration takes place, you can delete the older app if you like.

This is a clever hack, but Apple should provide a real solution for upgrade pricing that’s friendlier for both users and developers.

Apple’s First Employee: Bill Fernandez

Jason Hiner:

Daniel Kottke, one of Apple’s first dozen employees, said, “[In 1976] the Apple II did not even work. Woz’s prototype worked. But when they laid it out as a circuit board, it did not work reliably… It was unacceptable. And Woz did not have the skills to fix that… But, it was even worse than that. They did not even have a schematic.”

Newly funded by investors, Apple had just hired Rod Holt as the company’s first engineering chief, and this was one of the big problems that Holt walked into when he took the job. At the time Woz’s Apple II prototype was a bunch of wires and chips in a cardboard shoebox. The tiny Apple team had to take this amazing concept machine and turn it into a product that could be manufactured and sold in stores.

So Holt handed the first task to Apple technician Bill Fernandez.

When it came to computers and electronics, few people knew the workings of Wozniak’s mind better than Fernandez. The two had grown up as neighbors and had known each other since the fourth grade. In high school, Fernandez told Wozniak that there was a kid he needed to meet because he was into electronics and practical jokes just like Woz. It was a kid named Steve Jobs. Later, Wozniak acquired a bunch of different electronics parts and took them to Fernandez’s garage, where the pair worked on assembling the stuff into their own working computer that was years ahead of its time.

Apple Makes Panic Remove Transmit’s Export Feature

Panic, introducing Transmit for iOS in September:

Then came the introduction of iOS 8. It’s an exciting update for users, and a really exciting release for developers, not least because of a little something called App Extensions. By utilizing App Extensions, Transmit could effectively provide standard file transfer protocols for any iOS 8 app. Overnight, this idea that made very little sense suddenly made all the sense in the world.


You’re probably already familiar with the Share button in iOS. If you’re, say, looking at a photo, you can tap the Share button and send the photo by email, iMessage, AirDrop, and so on. With Transmit iOS installed, you can also now send that photo (or other document) to any FTP, SFTP, WebDAV or Amazon S3 server, right from Photos.

In other words, any iOS app that supports the Share sheet magically gains support for these protocols when you install Transmit iOS.

This sounded like a great feature, finally a way to easily share files between iOS apps and other devices, using any of a number of protocols.

Nate Boateng, yesterday:

Ugh, Apple is messing with Transmit too.

Federico Viticci:

Apple now forcing @panic to remove iCloud Drive functionality. Why? Dozens of apps can “send” to iCloud Drive.

Federico Viticci:

Specifically, export feature removed. No more export to iCloud Drive, Dropbox, etc. Before and after.

Nick Heer:

The thing that PCalc, Drafts, and Transmit all have in common is that they’re power user tools. I’d wager heavily that their users are more likely to be longtime Apple supporters and very tech savvy. Never mind the silliness of going after developers who actually use the new APIs; the stupidity of taking on software used by Apple’s most ardent supporters is baffling to me.

Update (2014-12-08): Cabel Sasser:

Also, at Apple’s request, we had to remove the ability to “Send” files to other services, including iCloud Drive.

In short, we’re told that while Transmit iOS can download content from iCloud Drive, we cannot upload content to iCloud Drive unless the content was created in the app itself. Apple says this use would violate 2.23 — “Apps must follow the iOS Data Storage Guidelines or they will be rejected” — but oddly that page says nothing about iCloud Drive or appropriate uses for iCloud Drive.

If the issue is just iCloud Drive, why did we remove the other destinations? We had no choice.


We haven’t shared, and likely never will share, most of those stories. To be clear, we always work all of the angles available to us to keep our software great, and there’s no doubt there are countless great people at Apple who are doing wonderful work and want the best for all developers. But we have to remember Apple is now a massive organization with countless divisions — the App Review team isn’t even in Cupertino, for example — and sometimes that means the wheels turn slowly, or the car, well, drives backwards. It’s hard to describe the legitimate emotional toll we feel when we’re angry or frustrated with a company we love so deeply. But then we realize it’s never Apple we’re frustrated with. It’s always the App Store.

Marco Arment:

Another great iOS 8 feature crippled by capricious, unwritten, after-the-fact policies.


This sure feels like the ramifications of an internal turf war.

Federico Viticci:

The “Export to iCloud Drive” feature has become popular among apps that deal with files and user documents: it can be found in hundreds of apps updated for iOS 8 such as Pixelmator for iPad and Apple’s own GarageBand. Restricting the pool of similar apps to apps that can download files, the same feature can be found in popular file managers such as Documents 5, GoodReader, and FileApp – all of them updated for iOS 8 and available on the App Store.

John Gruber:

I thought the whole point of iCloud Drive, and iOS 8’s new sharing sheet for storage services like Box and Dropbox, was to allow users to do exactly what Transmit enabled.

Nick Heer:

There doesn’t appear to be a common understanding of what rules the app reviewers should be focusing on, or even what rules exist — as far as I can tell, there’s no written rule that prohibits what Transmit was doing here. The lack of consistency is especially frustrating for developers. They become increasingly unsure of how much effort they should invest in features that shouldn’t be controversial. They don’t know if they’re the next ones to be rejected for some feature while dozens of other apps remain on sale with a similar feature.

In this particular case, I don’t understand what Apple gains by having Panic remove their export to iCloud Drive feature. I don’t understand what Apple or their users would lose — financially, morally, ethically, or in any other way — by allowing Transmit to retain this feature. If anything, this entices people to use iCloud Drive.

Update (2014-12-11): Charles Arthur (via James Thomson):

The Guardian understands that Panic will be allowed to reinstate sharing - but that only raises the question of why it was stopped in the first place. Apple declined to comment to the Guardian on the banning or reinstatement of the functionality.


The Guardian understands that the reversal over PCalc was the result of internal discussions at Apple where the initial rejection by the App Store team was overruled by executives.

Cabel Sasser:

After a considerate conversation with Apple, Transmit iOS 1.1.2 has been released with restored “Send To” functionality.

Developing Keyboards for iOS

Norbert Lindenberg on what he learned developing his English IPA Keyboard (App Store):

Yes, some of these suggestions sound a little desperate, and for many keyboards you will at some point have to request full access. Things would be a lot easier if Apple allowed containing apps to write into their keyboards’s containers, similar to how the Mail app delivers attachments into an app’s Inbox directory, without the need for full access. This would let containing apps send dictionaries and configuration settings to the keyboard while protecting user input from being leaked out of the keyboard.


A number of keyboards have been rejected based on section 25.6, so it seems something is required. For the first version of the English IPA keyboard, I argued that the keyboard was designed as a supplementary keyboard, not as a user’s primary keyboard, and therefore shouldn’t have to support all the keyboard types, similar to Apple’s emoji keyboard. My keyboard was approved, but at least one other developer using similar arguments saw his app rejected.


It’s much better to design custom images for the function keys that your keyboard needs. There doesn’t seem to be any way for third-party keyboards to access the images that Apple’s built-in keyboards use.


Reading the documentation might lead you to expect that your input view controller’s textDidChange method will be called when “text has changed in the document”, or selectionDidChange when “the selection has changed in the document”. Reality as of iOS 8.1 is that textDidChange and its buddy textWillChange are called when the keyboard’s client view becomes or resigns as first responder and when the selection changes, and selectionDidChange and its peer selectionWillChange are never called. Of course, this might get fixed eventually, so don’t rely on this either.


The documentation for UIKeyInput.deleteBackward states that it deletes “a character”. Those familiar with Unicode, NSString, and Swift’s String type know that the word “character” is quite overloaded – it could mean a Unicode code point, a UTF-16 code unit, or an extended grapheme cluster. But that’s only where the trouble starts.


Implementing forward deletion as described in the API Quick Start for Custom Keyboards section of the Guide also does not work. It depends on the assumption that the increment used by adjustTextPositionByCharacterOffset matches what deleteBackward deletes, but in reality that’s not always the case.


It seems unlikely that you could invade the user’s privacy by playing click sounds when she taps a key, but the method in charge of these sounds, UIDevice.playInputClick, hangs for several seconds rather than doing its job when called without full access.