Archive for October 5, 2016

Wednesday, October 5, 2016

Apple Removed Dash From the Mac App Store

Bogdan Popescu (tweet, Hacker News):

A while later my iTunes Connect account started showing as “CLOSED” and my apps were removed from sale. I thought this was normal and part of the migration.

Today I called them and they confirmed my account migration went through and that everything is okay as far as they can tell. A few hours ago I received a “Notice of Termination” email, saying that my account was terminated due to fraudulent conduct. I called them again and they said they can’t provide more information.

Keith Smiley:

The scariest part of App Store distribution

Brian Webster:

This is almost certainly a mistake, but even so, it’s a hell of a situation when another company can just mistakenly delete your business.

See also: other Dashes in the Mac App Store.

Update (2016-10-06): Chuq Von Rospach:

Apple really needs ways to communicate in these situations, a process for developers to appeal and work it out. FYI I’m available.

I had expected the Kapeli/Dash situation to be resolved in short order, but I was not expecting it to be resolved in this way (tweet, Hacker News):

Apple contacted me and told me they found evidence of App Store review manipulation. This is something I’ve never done.

Apple’s decision is final and can’t be appealed.

So it doesn’t matter that they offer no proof.

Rudy Richter:

Makes you wonder, if your competition could get you nuked by gaming your reviews?

Jeff Johnson:

I’m sure review manipulation happens for games and such, but it sounds pretty far-fetched for a well-known developer tool.

I should have mentioned this before, but Dash is an absolutely fantastic app. There’s a license migrator for Mac App Store purchasers, however I plan to buy it again to support the developer.

Tim Burks:

That’s what’s so galling about this. This has been done for millions of apps that have undercut legitimate developers.

Brent Simmons:

Required reading for understand the MAS.

Marco Arment:

Scary stuff over at the @AppStore. Makes it hard to trust any of our businesses there.

Mike Rundle:

1000s of apps pay for downloads and 5-star reviews. Apple pulls one down that never did.

Craig Hockenberry:

All that good things happening on the App Store lately are being overshadowed by this.

Christopher Sardegna:

I’ve had Apple claim that I was not allowed to appeal but I did anyway and ended up winning.


One of the best Mac and iOS apps I use. This also removed the program from purchases, so it can’t be downloaded again :-(

Phil Schiller (via Benjamin Mayo):

I did look into this situation when I read about it today. I am told this app was removed due to repeated fraudulent activity.

We often terminate developer accounts for ratings and review fraud, including actions designed to hurt other developers. This is a responsibility that we take very seriously, on behalf of all of our customers and developers.

Benjamin Mayo:

“If you run to the press and trash us, it never helps.”

To be fair, that line was removed from App Store guidelines on 13 June. So I guess running to the press is implicitly advised now?

David Owens II raises the issue that if the developer account is terminated, eventually the non–Mac App Store version of Dash will not be able to work with Developer ID.

Brent Simmons:

While this is legal, and within Apple’s rights, it’s not what we’ve come to expect from a moral judicial system. No matter what the context, we expect that the accused see the evidence against them, we expect avenues for appeal to be made available, and we expect proportional penalties.


In the meantime, it’s our job to presume innocence in the absence of evidence. This is also a moral issue, and it’s true even if you’ve never heard of the developer.

Paul Haddad:

1. Why do review manipulation on a niche app with no competition?

2. What are the odds its a mistake by the time a SVP responds?

Manton Reece:

Imagine instead if the App Store worked more like the web. Google dominates search, but they can’t shut down your web site. If you try to game the system, Google can remove you from search and limit your exposure. Likewise, developers should be able to distribute iOS apps with minimal involvement from Apple, yet apps that haven’t passed formal review won’t be searchable without a direct link, won’t ever be featured, and won’t show up in the top 100 lists.


Apple should focus on highlighting the best apps within a system that lets the app review team make occasional mistakes. There shouldn’t be such an easy toggle that wipes out an indie developer’s business.

Update (2016-10-07): Jeff Johnson:

It is said that distributing apps outside the Mac App Store is safe from meddling by Apple, because they cannot impose arbitrary rules on you or remove your apps from sale. That is true, to an extent. However, the potential still exists for Apple to put you out of business, for all practical purposes. The power to do this resides in Gatekeeper.

Dave Verwer:

I do believe Bogdan when he says that he did not do what they have accused him of, not because I know him (although I did meet him in person once, just for full disclosure) but because there was no need for the reviews to be manipulated. The app is great, in a niche market with little competition, so why risk it for more good reviews? It doesn’t make any sense.


It’s a disappointing and messy situation whichever way you look at it.

Swift 3.0 Unsafe World

Roberto Perez (via Hacker News):

But, what if we want to take a pointer to a Swift managed memory without having to create a function? To do it we will use withUnsafeMutablePointer, that will take a reference to a Swift type and a block with the pointer as it’s parameter.


When dealing with C API you need sometimes to cast pointers to struct to a different struct. This is very easy to do en C (and very dangerous and error prone too), as you have seen in Swift, all pointers are typed, that means that an UnsafePointer<Int> cannot be used where an UnsafePointer<UInt8> is required, that’s good in terms of producing a safer code, but at the same time that makes not possible to interact with C APIs that requires this types of casts, like for example socket bind() function. For theses cases, we will use withMemoryRebound which is a function that will convert a pointer from a type to a different one.


Before Swift 3.0, you could do it with UnsafePointer<Void> however, in 3.0 a new type has been added to handle these types of pointers: UnsafeRawPointer. This struct is not generic, so it means that it won’t hold information tied to any specific type and that will simplifly our code.


If we construct a UnsafeBufferPointer from an UnsafePointer we will be able to use most of the array functions of native Swift type given that UnsafeBufferPointer implements Collection, Indexable and RandomAccessCollection swift protocols.


Swift has an utility to take pointers to objects retaining its reference or not depending on our needs. Those are static functions of Unmanaged struct. With passRetained() we will create a retained reference to an object, so we can be sure that when using it from C world, it will be still there. If the object is already retained for the life of the callback we can also use passUnretained(). Both methods produces a instance of Unmanaged that will be converted to a UnsafeRawPointer by calling toOpaque()

Caveat Formatter

Jeff Johnson:

However, if you attempt to return the original string by reference, it doesn’t work right. The new, invalid string will still appear in the text field, despite the fact that -isPartialStringValid: returns NO. By experimentation — computer science! — I discovered that you have to provide a reference to a copy of the original string rather than the original string itself. This is probably some kind of bug in AppKit.

This does seem to be consistent with the documentation:

In a subclass implementation, evaluate partialString according to the context. Return YES if partialStringPtr is acceptable and NO if partialStringPtr is unacceptable. If you return NO and assign a new string to partialStringPtr and a new range to proposedSelRangePtr, the string and selection range are changed, otherwise, if no values are assigned to partialStringPtr or proposedSelRangePtr, the change is rejected. If you return NO, you can also return by indirection an NSString object (in error) that explains the reason why the validation failed; the delegate (if any) of the NSControl object managing the cell can then respond to the failure in control:didFailToValidatePartialString:errorDescription:.

But it’s probably not what you would expect.

How to Save the Princess in 8 Programming Languages

Toggl Goon Squad (via Mary Branscombe):

You need to rescue the princess with code - but sometimes your code doesn’t work and the princess is a dragon and you’re a fish.

Google and the Limits of Strategy

Ben Thompson:

This is why favoring Android in any way was such a strategic error by Google: everything about the company was predicated on serving all customers, but Android by definition would only ever be on a percentage of smartphones. Again, it’s possible Apple would have built its own Maps product regardless, but Google’s short-sighted favoring of Android ensured that for hundreds of millions of potential Google users the default mapping experience and the treasure trove of data that came with it would belong to someone else.

This is where that infamous Gundotra speech matters: I’m not convinced that anyone at Google fully thought through the implication of favoring Android with their services. Rather, the Android team was fully committed to competing with iOS — as they should have been! — and human nature ensured that the rest of Google came along for the ride. Remember, given Google’s business model, winning marketshare was perfectly correlated with reaping outsized profits; it is easy to see how the thinking and culture that developed around Google’s core business failed to adjust to the zero-sum world of physical devices. And so, as that Gundotra speech exemplified, Android winning became synonymous with Google winning, when in fact Android was as much ouroboros as asset.

Self-Absorbed Release Notes

Kirk McElhearn:

This is wrong, and dangerous. Users look to release notes to find out what is new, and what has been fixed. If you cannot quickly see these changes in the release notes, you miss out on something important.

I think a cute phrasing or occasional joke is fine, but this is a whole screenful with no useful information. Better to have just written, “Bug fixes.” Cesium is a good app, though.