Skip to main content

Posts

Showing posts with the label App Store

Built & Released app within 2 weeks

After successful launch of my last iOS app ,  I wished to make another one  for a different app category. Last time it took me comparatively long time to make highly stable, premium quality UX after much many iterations. Thanks to valuable feedbacks from my peers & social media friends. But this time all I need it in a very short duration. Yes! at the speed of F1 car. Being an F1 fan, I felt heat of upcoming 2019 season a month before it actually begins. I was assured that there are already couple of apps in the App Store which serves the same purpose. Even the official F1 organisation has got own feature rich / futuristic app. So why I am thinking to make my own version which could be a clone... 🤔 Well... the official F1 app is loaded with many great features & uses Unity framework under the hood for live circuits (a state of art feature). All these made heavier (~165MB when installed in my phone) app size to just view race results (if in case!). Couple of...

Backing multiple iOS versions

A latest iOS version update can cover ~85% of iPhone users which is significant compared to a newly released Android running just ~0.1% of devices. ( @StatistaCharts collected on September 2018 - iOS 11 vs Android Pie). If your application matters for the rest ~15% of “genuine” iOS users, then you have to spend extra time to support. Why does it matters ? Giving uniform user experience irrespective of iOS version and device factors - will give bonus market space for the sales. Essentially it will boost your revenue and popularity of the application. Deployment Target vs Base SDK Before heading to solution, we have to understand Xcode settings for Deployment Target and Base SDK.  A deployment target refers to the oldest version of iOS that is capable of running your project. To change your deployment target, open up your project file in Xcode and check the setting under Build Settings -> Deployment. Base SDK refers to the newest version of iOS that is capable of runn...

Top App Store rejections and common reasons

Apple scans on each and every app submitted to App store. Our responsibility is to make sure app followed all  App Store review guidelines  and will get approved before dead line. But sometimes the guidelines are interpreted differently by different reviewers and frequently change over time.  Interestingly, I exposed to some common and "repetitive" rejections. Those I listed below and you are welcome to consider it as your checklist. 1. If the app contains any kind of bugs and crashes will surely rejected. Make sure app involved in testing and cleared test cases. Also involved various iPhone models & iOS version in the process. 2. Lacking of meta data is also leads to rejection. The key point is Apple expects behaviour of app should match with app description.  3. If the app submitted with demo features will be considered as incomplete. So make sure your app  doesn't include keys like 'Beta', 'Demo' or 'Test'. 4. Even missing demo a...

Next tide of App market

  E very time when you rush to Appstore or Playstore, you can see tons of apps. Does every best or top trending app will fit in your smart phone ? Well it does not!. You have to make choice. Yes, the mobile app market is really saturated . There are more than 3 million apps floating across app stores. But average user has only 20-25 apps on his device. Out of these, most of them covers Social Media apps and Productivity tools as well.  The first study , by Nielsen, revealed that the average number of apps that users open on a monthly basis has remained relatively stable over the past two years between 26.5 and 26.8 (although average time spent in apps per month has increased by more than 50% in the same period). Consider a taxi booking app you want to download.  Wave of apps like Uber, Ola, Meru and many more listed in the store. Which one would you choose? One alone or Two apps cannot serve your purpose. For instance you have Ola app installed. U...

Popular posts from this blog

Implementing autocompletion OTP field in iOS

Long waiting is over. !!  iOS 12 brings Autofill for OTP text field which is close to Android provided a decade back. Previously in iOS we used to toggle between OTP text screen and message inbox.  Which was hard to remember and time consuming resulting a bad user experience. Personally, I have been asked from the client/customer couple of times to implement autocompletion for OTP field and took me a lot of time to convey that it is not possible in iOS. Why Autofill was not possible previously?  We all know that Apple gives at most care for user privacy. When we see iOS architecture, each individual app is like a separate island. There is no inter-app bridge between apps (exception for Keychain and URLSchemes APIs which gives very limited scope). Thus we cannot read message content from inbox. Where to start Autofilling? First of all, the target SMS need to have the OTP Code with prefix string "Code" or "Passcode"on its message content. Beware of OTP c...

Animating label text update - choosing a better way

Recently I published a countdown app .  At one point of development - I have to show a timer on a UILabel which ticks on each seconds. As usual I started  setting text to a label object - self .timerLabel.text = someString Easy piece of cake right !?   But wait ... it won't take much user attention when timer ticks on every seconds. So I decided to make use of a simple animation while label gets text update. I found there are dozens of ways to animate a label. In this short article, I listed 3 best way you can animate text on a label. ( Spoiler Alert 👀- I decided to go with 3rd option)  1. Fade In - Fade out animation : CATransition class has got transition type `fade`. With timing function of CATransition - I was able to see the below result. let animation: CATransition = CATransition () animation.timingFunction = CAMediaTimingFunction (name: CAMediaTimingFunctionName .easeInEaseOut) animation.type = CATransitionType .fade animation.subtype = C...

Cached Async Image in SwiftUI

 SwiftUI’s AsyncImage is handy, but every time your view appears, it refetches the image—leading to flicker, delays, and unnecessary network use. What if you could fetch once, then reuse instantly? That's exactly what the Cached Async Image  delivers: a memory-powered caching layer that keeps SwiftUI image loading smooth, snappy, and resilient. First a simple in-memory cache without disk persistence. This will be thread-safe and auto-purges under memory pressure. A Singleton wrapping NSCache for URL → UIImage caching as follows : final class ImageCache {   static let shared = ImageCache()   private init() {}   private let cache = NSCache<NSURL, UIImage>()   func image(for url: URL) -> UIImage? {     cache.object(forKey: url as NSURL)   }   func insertImage(_ image: UIImage?, for url: URL) {     guard let image else { return }     cache.setObject(image, forKey: url as NSURL)   }   func clearAll() { ...

Prevent Navigationbar or Tabbar overlapping Subview - solved for Card view

Recently, I started with a Card view added as a subview of UIView in a view-controller. When a view controller created along subviews, it tends to use entire screen bounds and also slips behind Tab bar or Navigation bar. In my current situation, it's second case. Casually new iOS developers will write a patch by additional value for coordinate y and subtracting bar height from its size. A lot of them posted in SO threads too : How to prevent UINavigationBar from covering top of view? View got hidden below UINavigationBar iOS 7 Navigation Bar covers some part of view at Top So, how I got solved ? self.edgesForExtendedLayout = [] This  will avoid all subviews in a view controller get behind any bars. Read full apple  documentation on here. Full Source code below :  //Simple view controller where its view layed-out as a card. class WidgetCardViewController : UIViewController { var containerView = UIView () //MARK:- View Controller Life Cyc...

UICollectionViewCell shows with wrong size on First time - Solved

We commonly use Collection view where its cell size calculated run time. The flow layout delegate is responsible to return individual cell sizes. BUT in most of the cases, delegate method `collectionView: layout sizeForItem:` expects cell size too early. Before generating actual cell size. extension YourViewController : UICollectionViewDelegateFlowLayout { func collectionView ( _ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize (width: externalWidth, height: externalHeight) } } For instance, if a cell size depends on external view and its frame is not yet ready - results with wrong (or outdated) cell size. Typically happens for the first time view controller laid out all views. You can find similar queries in StackOverflow community : Collection view sizeForItemNotWorking UICollectionViewCell content wrong size on first load How to refresh UICollec...