A Recognition for Cogent IBS

In the July edition of Silicon India (a leading technology magazine), Cogent IBS received a special mention. Cogent was featured in the list of 20 most promising Enterprise Mobility Solution Providers in the country. It is a small honor, but the Cogent team feels really proud to be featured in this list amidst other well deserving companies.

It is always an honor to be recognized this way and it hasn’t come to us easily. The story of the Cogent Mobility team is just beginning to get written and such a recognition within 2.5 years since the birth of this team is not a bad achievement and we consider this accolade as a gentle pat on our back & a push to move forward to achieve much more.

Here is the link to the article, which features an interview with Ganpy.

Takeaways from WWDC 2014

By Phillip Garton

Apple’s World Wide Developer Conference (WWDC) took place this year on June 2nd. Although Apple didn’t unveil any new hardware like everyone had hoped, from a mobile application developer perspective, it was still an impressive conference bringing new software and features in Apple’s next generation of software.

Apple unveiled iOS 8, which in terms of UI is not a major leap forward but rather an enhancement of iOS 7.  Where iOS 8 shines is the new features and new content, as well as long awaited enhancements that have gone missing from iOS 7. We will be looking in detail, the new things that iOS 8 brings and what their impact will be to the mobile market place.

Notifications

Something on the surface that seem simple—but for iOS users is a huge change—is interactive messaging and notifications from the notification center in iOS. This is a feature that has long been a part of Android and has further been long desired by iOS users: the ability to interact with messages and notifications without having to open the actual message! iOS users will now be able to respond to text messages and third party application notifications directly from the notification center or the lock screen, making responses to simple tasks even faster then before. Along with quicker access to messaging and notifications we get quicker access to our recent contacts. By double tapping the home button, along with the apps that are open on your device, in iOS 8 you will now see a list of recent contacts at the top of the screen. Through this you will be able to call, message, or email your most recent contacts, making it even faster to reach to those with whom you are most connected.

Extending notifications further Apple has introduced travel time notifications. Improving productivity and timeliness, Apple calendar will now notify you of the time needed to get to an appointment on time, eliminating the excuse of a ‘got caught in traffic’.

Email

 iOS 8 enhancements are themed around productivity and making repetitive tasks faster and more efficient. Email, being one of the most used smartphone applications, was not ignored. Email can now be swiped right to be marked unread/read, and swiped left to allow for flagging or deletion giving quick access to common mail functions. Swiping down on an email being composed allows for access to other email content which is very beneficial for professionals as the need to reference or copy information into a composed email is a common activity and helps elevate iOS email to the next level. One of the most interesting and useful updates to email is that it now recognizes an event in the email body and allows the user to add it to their calendar without having to create an entry manually or receive a traditional invite. This is best explained by illustration: someone sends you an email asking if you would be free for dinner tomorrow at 6pm; from within the email iOS allows you to add this new event to your calendar by clicking on it. This is not only limited to events. Contacts can be added to your iOS contacts by simply clicking on the number.

Spotlight

Search iPhone/Search iPad just got a whole lot more powerful. Again focusing on efficiency, Apple introduced Spotlight Search. Searching by either pulling down on the home screen or searching within Safari now utilizes the Spotlight search. When searching, Spotlight not only searches the web, but searches apps on your device or in iTunes, news, etc. for relevant feedback on the query. This is not a new concept. But as always, Apple takes this one step further and Spotlight presents top recommendations based on your search, giving you faster connection to the content that you are searching for.

 QuickType

Like it or hate it, we have all become accustomed to autocorrect on iOS devices. We have all seen the sometimes laughable auto corrections that have been posted all over the internet. Apple has taken autocorrect one step further in a positive direction, adding intelligence and content completion. QuickType—as Apple calls it, makes suggestions based on commonly used words to complete the sentences that you are currently typing. But in true Apple style they take it to the next level! QuickType also manages how you talk to individuals and makes suggestions based on the context of the message and the person. An example of this would be if you are messaging a professional contact you might type “Exceptional Job!” but if you are messaging a friend you might type “Awesome Job!”. QuickType learns this and suggests words based on this predictions. Again, Apple is going after efficiency and ease of use.

Continuity

Continuity isn’t limited just to iOS but has been expanded to Mac OS as well. Continuity brings cross device interaction and connectivity to a level that most manufactures could only dream of. With continuity, messages, notifications, phone calls, and alerts are available on all devices within the same area. Even if your iPhone is in another room, you can receive, and place phones calls from your Mac computer, or receive and reply to messages. Not only does continuity bring your devices together, but also it brings a host of additional features. Group messaging is now improved allowing for threads to me named for better understanding. Attachments within the thread can be viewed within the details of the thread, eliminating the need to scroll through the entire thread to view an attachment. If you have ever been annoyed by an ongoing thread that has diverted from information that you care about, you can now elect to either set the thread to “do not disturb” or leave the thread all together. Further increasing messaging efficiency and ease of use, Apple has added the feature to quickly add images and content inline to the messages being composed. And if you just don’t feel like typing a response you can now simply add an inline voice or video message to truly convey something to the other party. Here is to hoping, no one will ever misunderstand your text message as it was intended!

Enterprise

Apple has not lost sight of the customer base that has had a major impact on its market share which is the enterprise market. Ninety Eight percent of Fortune 500 companies use iOS devices, and Apple is looking to further that by making easier for companies to roll out devices within their enterprise. Apple is introducing a Device Enrollment Program which will automatically configure your device for your business when a new device is activated. The enrollment program makes it even easier for device configurations, applications, and restrictions to be loaded on the device—making a huge impact on the cost and maintenance of devices on your corporate network, removing the burden for your IT staff, and making simpler for your employees to connect their iOS devices then ever before.

Apple also knows how important security is to the enterprise market. iOS 8 supports S/MIME controls per message, giving users the ability to choose to sign and encrypt individual messages for greater control over the security of mail messages. Message threads can now be set to VIP status to give higher priority to import messages. MDM enhancements give greater control over devices on your corporate network. Third party document support allows access to the documents which are accessible on device and the ability to manage both books and PDFs. Apple hasn’t ignored one of the biggest threats to enterprise security connecting to unknown networks. iOS 8 supports peer to peer AirPlay, eliminating the need to connect to a network to display content on other Apple devices.

iCloud Drive

Apple is looking to change how we think of the cloud and increase how we use the cloud. Currently with iCloud, most users use it for backing up important information and content on their device. With iCloud Drive, Apple looks to change this into a true storage alternative for your Apple devices. Apple does this by reducing the cost for storage 20GB for $0.99 and 200GB for $3.99 and increasing the sharing and ease of sharing content across devices. Spotlight now searches not only your device, the web, and apps, but also the cloud. Apple then takes it one step further by introducing Family Sharing so up to six users can share information across devices, share reminders, purchases, find friends, and find iPhone. Apple looks to connect users and the cloud more than before.

Thoughts and Reactions to iOS 8

Apple has continued to build on a strong OS that it started with iOS 7. iOS 8 brings more content and features, and I am sure even more will come to light as this is just a subset of what is to come from iOS 8. Apple has released both iOS 8 and Xcode 6 to developers so we are sure to see more in the coming months before its release in the fall.

The Cogent IBS Mobility Team is still reviewing all that Apple presented.

Please see some of the initial reactions from the rest of the team regarding Apple’s announcements.

Thorsten Gorny – Senior Manager & Business Development, Mobility

 – Health / HealthKit seems to be a great platform to unify and connect data from different devices, lets me hope for the iWatch…:)

 – HomeKit see above + curious to see what Apples strategy is in terms of hardware… Maybe this is going to be Apple’s second big product category after the iWatch…

 – Swift / Developers are sure to be excited!

 – TouchID open to other apps / cool, this could be something for us:)

 – Better / easier exchange of data between apps / could this solve our caller ID recognition issue in mD?

 Overall, even being still a little disappointed about the missing iWatch, I guess with HomeKit and HealthKit Apple laid the foundation for two new product categories which might take Apple to the next level – at least now I am 100% sure there will be the iWatch coming out soon…:) “

 Peng Xie – iOS Developer, Mobility

  • App extensions enables users to share contents across apps or perform one app’s action in another app. Developers can also use extensions to extend their app’s ability to Notification Center.
  • Custom keyboards are also considered as app extensions. I believe developers will come up with creative keyboards aimed to specific tasks such as entering email addresses or special strings that only requires a subset of the full keyboard. (Example: employee IDs)
  • The new games related kits in iOS7 should have a broader application than just for game developments. Especially with the improved Sprite Kit and newly introduced Scene Kit, developers will be able to create some pretty interesting new controls to greatly improve user experience of apps.
  • The introduction of Cloud Kit and Document Picker will make the communication between apps and iCloud easier for developers and provide more possibilities for sharing and editing documents across apps through iCloud
  • Unified Storyboards for Universal Apps
  • Developers can now use one Storyboard for both iPhone and iPad interface. The size classes will be used for app to adopt different screen sizes base on deploy target.
  • This change is important for developers since it’s rumored that Apple will introduce next generation devices with larger screens. In addition, it’s highly possible that Apple will continue using iOS and offer SDK for future Apple TV models. The unified  Storyboards will make it easier for developers to add support for Apple TVs.
  • App Store Improvements
  • Burstly, the owner of the famous testing platform TestFlight, is acquired by Apple earlier this year and Apple has included the TestFlight as a new feature to App Store. This improvement will greatly help the developers to beta test their apps.
  • A completely redesigned iTunes Connect will also come later this year. The new analytics feature will surely provide a better experience for developers and make it easier to maintain the apps in App Store. 

 Sean Kollipara – Android Developer, Mobility

  1. A good move to introduce long-overdue features.  These are long-overdue because most have been available in iOS’ biggest competition, Android, for quite some time.

            A. Extensions framework

▸    Similar to the “intent” system on Android where pieces of data can be sent between apps by attaching them to the intent

▸     Available on Android since 1.0 (September 2008)

 B. Third-party keyboards

▸       Available on Android since 1.5 (May 2009)

C. Third-party widgets

▸       Available on Android since 1.5 (May 2009)

D. Typing suggestions

▸       Available on Android since 1.5 (May 2009)

▸       iOS takes it a step further by analyzing the content of incoming messages to provide contextually relevant suggestions when authoring a response

E. Battery usage stats

▸       Available on Android since 1.6 (September 2009)

F. Videos in the AppStore

▸       Available in the Google Play Store (then known as “Android Market”) since December 2010

G. Interactive notifications

▸       Available on Android since 4.1 (July 2012)

▸       iOS takes it a step further by allowing a text field in the notification, which enables quick text-based input for responding to a message (or performing any other task that requires text input from the user)

H. Searching

▸       One search queries against multiple sources and produces a compiled list of results: apps on device, contacts, Google search, Bing search, etc.  I feel that this is merely a natural progression of technology and should be expected of all modern search tools.

▸       Spotlight similar to Google Now, which has been available on Android since 4.1 (July 2012)

▸       Music search (serviced by Shazam on iOS 8) has been available on Google Now since February 2013

▸       Use a hotword (“Hey Siri”) to activate voice assistant; available on Android (“OK Google”) since 4.4 (October 2013)

I. iCloud Drive

▸       Service is pretty much identical to Google Drive

▸       Nice that it’s available for a non-Apple platform such as Windows

▸       Disappointing that it is not available for Android or Linux.  Maybe there will be an Android version in the future, but that is doubtful because Apple has never released any apps that allow its services to be used on Android.

  1. Continuity (Airdrop, Handoff, and call integration) is really cool and convenient, and it will be difficult for the competition to imitate.  No one else has a full-blown device ecosystem in the way that Apple does with Mac, iPhone, iPad, OS X, and iOS.  Because the competition is so fragmented (multiple hardware and software vendors in desktop, laptop, mobile, etc.), there would first need to be a standardized protocol over which all of these devices can interact.  Even then, there would still be varying user experiences between vendors.  Currently there are third-party solutions (AirDroid, Pushbullet, Mighty Text, et al.), but the lack of native support in the operating system is a big UX papercut.
  2. Family sharing creates a simple framework by which parents can approve their child’s iTunes/AppStore purchases.  This will probably save headaches for lots of parents.
  3. Disappointed that TouchID is expanding, as I think fingerprints provide a false sense of security.  This is especially true when they are relied upon to unlock the device’s entire keychain. They are easy to steal: they’re probably all over the phone, and they can be lifted cheaply and easily using Scotch tape.  If compromised, fingerprints cannot be changed.  Within 3 days of TouchID’s public availability was originally released, many hackers had already found ways to circumvent its protections.  This demonstrates the inherent lack of security in using fingerprints as a sole means of identification.  I would like to see Apple, Samsung, and all other mobile device manufacturers discontinue the use of fingerprint-based identification, especially where security is mission-critical (ex: protecting bank account information).  Fingerprints are better suited as a replacement for usernames, not passwords.
  4. Location-based app suggestions on the lockscreen are really cool, especially when visiting new places.  I really liked the demo of showing a transit system’s app when in/near a subway station.
  5. Health and HealthKit are an awesome step forward in the realm of the health and fitness apps.  The idea of a properly-secured central repository for storing health data makes lots of sense, and it allows for a more complete picture of a person’s health situation because it combines data from all sources rather than it being fragmented in each app.  This also allows for the sharing of data with a user’s physician, which enables better, more personalized, and timely health care decisions.  I think this has the potential to revolutionize the way health care is handled.

Stay connected to Cogent IBS blog to see more information, as it becomes available and our reactions and thoughts how iOS 8 will impact you.

Highlights of HR2014 – Nice, France

By Ganpy

Let’s get the obligatory joke out of the way first. Shall we?

“Was the Nice conference nice?”

“Yes. It was..”

Michael (Ingentis) and Ganpy

Michael (Ingentis) and Ganpy

Exhibition Hall

Thorsten giving a Demo

Now that we have the joke out of the way, I will quickly summarize our experiences from the conference.

The +

  • Venue – Couldn’t have picked a better venue in Europe for that particular week. With so much going around Nice in that week and with all the great weather, it seemed just right to have a conference in Nice.

The  –

  • Venue – Yes, This was in France. But there clearly were no French customers at the conference. Or, if they were there, we didn’t spot them. In the hours of idle time we had at the booth on Day 2 and Day 3, we exchanged notes with our booth neighbors who are a French company and they confirmed the same. And the reason? Apparently, the speculated reason was that the Insider conferences are priced very high for an average French customer.

The +

  • Our Booth Location – Yes, it was perfect on Day 1. We had good traffic on Day 1 and we were placed right on course through the main entrance to the Exhibition hall and a beverage/refreshment table was placed right in front of our booth.

The –

  • Our Booth Location – The exact same location. But on Day 2 and Day 3 that was a bane to us (perhaps because they moved the refreshment table somewhere else). We had a low turnout on Day 2 and a lower turnout on Day 3.

The +

  • 5 conferences at the same time – HR, BI, FI, GRC and HANA – all attendees came together for those 3 days in Nice. This made us meet all kinds of customers and we did learn a thing or two about the daily operations challenges in SAP in areas outside of SAP.

The –

  • 5 conferences at the same time – HR, BI, FI, GRC and HANA – all the attendees came together for those 3 days in Nice. This meant we couldn’t really tell who was HR, as our primary focus was HR customers and hence sometimes, what appeared like a decent conversation at the booth eventually would end in a meaningless conclusion.

The ,

  • The European versions of these conferences are still maturing. May take another 3-4 years before they get into a rhythm, if they do that it.
  • They have to keep changing the venue but perhaps, should settle down to one or two options eventually, as from what we have seen, the venue doesn’t necessarily seem to encourage more local customers to show up for the conference.
  • Our partnership with Ingentis keeps getting stronger at a personal level when we get to spend more time at these conferences, because we get an opportunity to understand each others’ businesses in detail, through personal insights.

The ?

  • Many questions to ponder before we plan our next year’s SAP Insider conferences. Cogent IBS, needs to consolidate a product portfolio, with a clear message for these Insider conferences (especially the European versions), so that our pre-conference and post-conference marketing campaigns could be a little more impactful. Our message for 2014 was “HR Anywhere” and that seemed to resonate well in the US conference, but probably not that much in Europe.
  • More analysis on how to generate a better traction at the booth needs to be done (again for the European version). We did well overall, in terms of quality of leads but we are not yet sure, if we missed any opportunity to meet more customers than we did.

The .

  • In summary, this was really a great conference and we will continue to take part in this, either till we see we are not generating any quality leads or till we see the conferences stop growing at some point. For now, both of the above are not true.
  • Our Thanks to Ingentis for being part of this conference and for sharing the booth space.

 

Coding with Blocks in Objective-C (Part 2)

By Peng Xie

Part I of this series can be found here.

In Part One of this blog, we talked about the general idea of blocks and how to use them. We also discussed the concept of concurrency and two APIs in Objective-C for concurrency: Dispatch queues and operation queues. In this second part of the blog, we will dive deeper into concurrently executing blocks using NSBlockOperation objects. And finally, as promised in the first part, we will look at an example of a typical “gotcha” and show you how to avoid it when using blocks. Please still keep in mind that this blog is designed for readers with intermediate knowledges of Objective-C and we’re using Automatic Reference Counting when coding.

NSOperationQueue, NSOperation and NSBlockOperation

NSOperationQueue

As the name described, operation queues are queues of operations, specifically in Objective-C, they are NSOperationQueue and NSOperation objects. Have you noticed that both the queues and the operations are objects. That means we can use them just as any other Objective-C objects. NSOperationQueue* operationQueue = [[NSOperationQueue alloc] init]; [operationQueue addOperationWithBlock:^{NSLog(@”A block in an operation queue”);}];

The two lines of codes above show how to initialize a NSOperationQueue object and add an operation to the queue using a block. You can also add NSOperation objects to the queue but we will talk about it later after we discuss more on NSOperation class. NSOperationQueue roughly follows a first-in-first-out policy when managing the operations and will make its own decision of when to start an operation.

NSOperation

Now it’s time for some NSOperations. NSOperation is an abstract class which means it requires subclassing in order to use it. Don’t worry. It’s not complicated. Below is the content of our SampleOperation’s header file. #import <Foundation/Foundation.h> @interface SampleOperation : NSOperation

@end 
And the implementation.
#import "SampleOperation.h"
@implementation SampleOperation
– (void)main { @autoreleasepool { NSLog(@”I’m an operation”); }
}@end See? It can be as simple as overriding the “main” method in the concrete class you created, creating an “auto release pool” and putting your codes into it. Since the operation won’t be able to access the main thread’s auto release pool, you have to create your own for the operation. And yes, the syntax shown above is written under ARC environment.
There’re also two other important methods in NSOperation class. The “Start” and “Cancel” methods. You don’t usually override the “start” method and when you call the method of a method, the operation will begin to execute. When an operation is added to a queue, the queue will decide when to call the “start” method of the operation. The “cancel” method is used to cancel the operation. When you write your main method, you should frequently check if the operation is cancelled by checking “self.isCancelled”. Whenever the statement is true, you should stop the execution right away.

NSOperation + Blocks == NSBlockOperation

It seems like we haven’t talked about blocks for a long time. I know you miss them. And now, let’s combine our knowledge of NSOperation and blocks by looking at a concrete class of NSOperation provided in Objective-C, the NSBlockOperation class. A NSBlockOperation object can contain several blocks and concurrently execute the blocks just like an operation queue.

NSBlockOperation* blockOperation = [NSBlockOperation
blockOperationWithBlock:^{NSLog(@"A block in a NSBlockOperation
object");}]; // 1
[blockOperation addExecutionBlock:^{NSLog(@"Adding another
block");}]; // 2

NSArray* blocksInOperation = [blockOperation executionBlocks]; // 3  The first line is the code to create a NSBlockOperation object. Line 2 uses the “addExecutionBlock” method to add another block to the operation. And the last line shows how we can get all blocks inside a NSBlockOperation object by calling the “executionBlocks” method. Please notice that the blocks added to a NSBlockOperation object should take noparameter and return no value. And since the NSBlockOperation is just a concrete subclass of NSOperation, we can still use the “start” method to kick off the execution.

Bonus: Canceling a NSBlockOperation

Congratulations! You’ve earned yourself a bonus chapter. In this part of the blog, we will combine our knowledge of blocks, NSOperation and NSBlockOperation by looking at an example of canceling a NSBlockOperation. As we discussed earlier, when overriding the “main” method of a NSOperation subclass, we should check if the operation is canceled as frequently as possible. That guideline also holds true for NSBlockOperations. That sounds pretty easy. You may think it should be just like the following codes.

NSBlockOperation* blockOperation = [NSBlockOperation
blockOperationWithBlock:^{
    while ([blockOperation isCancelled]) {
     // do something

} }];

Oops, if you put the codes into Xcode, you’ll see the annoying warning sign shows up and tells you the blockOperation is uninitialized when captured by the block. Xcode is not happy.

__block NSBlockOperation* blockOperation = [NSBlockOperation
blockOperationWithBlock:^{
    while ([blockOperation isCancelled]) {
     // do something

} }];

What about this then? We said earlier in Part One that we can make variables mutable inside blocks by giving them a “__block” storage modifier. And we will get rid of the warning messages from Xcode if we modified our previous codes to the ones shown above. If we try to run the code, it will also work as expected. But… Have we really fixed everything? Let’s check the code from the fundamental stuff. “__block” variables will be retained for blocks to use them because it’s possible that the blocks are still running while the object containing the variables is already released. And how will the “__block” variables be retained? The block will keep a strong reference to them so that they won’t be released unless the block is released. From the NSBlockOperation’s perspective, NSBlockOperation relies on the blocks to perform its task. The last thing a NSBlockOperation object wants is to have the blocks released when they are still needed. Therefore, when you give the NSBlockOperation a block, the block will be copied into the object and the NSBlockOperation will keep a strong reference to the blocks it has. Have you smelled anything wrong with the codes we have yet? If you think it sounds like a memory issue, you are on the right track. Although ARC can dramatically simplify the memory management work for developers, it can’t do anything. Under ARC environment, a strong reference means increment by one to the reference count of the object. When the reference count becomes 0, the object will be released from the memory. In the codes we have, the block has a strong reference to the operation and the operation also has a strong reference to the block. This means the reference counts for the block and operation will never go to zero, which makes it impossible for either the operation or the block to be released from the memory. In Objective-C, this situation is called a “retain cycle”. Since the memory allocated for objects will never be deallocated, the retain cycle will cause memory leaks to the app. Well… What can we do to avoid the retain cycle then? Check out the codes below.
// 1

NSBlockOperation* blockOperation = [[NSBlockOperation alloc] init];
// 2
__weak NSBlockOperation* weakBlockOperation = blockOperation;
// 3
[blockOperation addExecutionBlock:^{
    while ([weakBlockOperation isCancelled]) {
     // do something

} }]; Let’s look at these codes line by line. First, we created a NSBlockOperation object. But this time, instead of using the “blockOperationWithBlock:” method, we used a pretty standard way to create the object by calling “alloc” and then “init” on the NSBlockOperation class. This is because we won’t be able to get a reference to the operation when using “blockOperationWithBlock:”. Then in the next line, we created another NSBlockOperation object but this time, we explicitly gave a “__weak” storage modifier to the new operation object and make it refer to the blockOperation object we created earlier. The magical word “__weak” will prevent the weakBlockOperation to have a owning relation with blockOperation and this will make sure no strong reference will be assigned between weakBlockOperation and blockOperation. Lastly, we added the block to the blockOperation. Be careful, in the block, we will check if the weakBlockOperation is cancelled not the blockOperation. Because the weakBlockOperation is assigned to the value (or rather memory contents) of the blockOperation, the value of their “cancel” properties should always be the same. This is the key to break the retain cycle. The blockOperation will still keep a strong reference to the block. But this time since the block is checking the weakBlockOperation’s “cancel” property, it won’t establish any strong reference to the blockOperation object. The retain cycle is broken. Without the retain cycle, the blockOperation will be released when its reference count is 0 and the block will be released with the blockOperation as it should. The weakBlockOperation is “weak” by its nature thus it will be released with no problem when it’s out of scope. We have solved this memory manage management issue.

Where To Go From Here?

In this part of the blog, we introduced NSOperationQueue, NSOperation and one of its concrete subclass, NSBlockOperation. We also solved a memory management problem in our bonus chapter by utilizing our knowledge of NSBlockOperation and blocks. Hopefully you can find some useful information from this blog. If you want to lean more about blocks and NSOperation, please refer to Apple’s guide on blocks programming and don’t forget there is alway the class reference for NSOperation.

iOS7 – Unlocking Enterprise Mobility

By Phillip Garton

iOS 7 has brought about a fresh new face to Apple’s product line and with it, many new features for the consumer market. iOS 7 has come with a new layered UI, new integrated apps such as iRadio and many features that have bolstered the gaming and consumer app market. But the unsung heroes of iOS 7 are the extensive strides that Apple has taken to make their products more secure and more configurable solutions for the enterprise market, furthering the gap in this segment from its competitors. In this blog post, we will look at some of the key features that make Apple products the “go to” choice for enterprises running both Corporate Supplied Devices and Bring Your Own Device (BYOD) networks.

Find My iPhone

A key issue facing all enterprises is how to handle a lost or stolen device that contains corporate information.  iOS 7 goes a long way to address this issue. Find My iPhone can be accessed from another iOS device, an iCloud account through the web, or iCloud when it’s installed on a computer. This utility can locate your device, lock your device, or wipe it remotely. The only way to gain access to the device is to log on with the iCloud account that it was activated with. This remote access to the device gives the owner great control over the security of the phone. Find My iPhone doesn’t restrict this functionality to the sole owner of the phone. Apple has extended this feature to the enterprise as well. Find My iPhone can also be used  by IT when the device is registered to a MDM. Through a MDM IT can put the device into “lost mode” when it has been lost or stolen. This feature greatly extends the reach of IT for mobile devices and goes to great lengths to give more control over devices that are utilized for corporate purposes.

Touch ID

Available on iPhone 5S models, the fingerprint identity sensor  adds an extra level of security to the device. The 500ppi fingerprint sensor embedded in the home button can keep data more secure with a unique  identifier that we all already posses: the fingerprint. As this doesn’t bring true two-factor authentication to the device, the passcode is reserved as a backup to the Touch ID. However, the passcode is utilized when the device is restarted or has not been unlocked for 48 hours. This enables enterprise IT to enforce secure passcodes (7 or more characters), while allowing easy day to day access to the device.

Open in Management

Open in Management gives IT greater control over how corporate data is used, once on the device. This is achieved by giving IT control over what data is opened in what app on the device, possibly keeping sensitive data from being opened in unauthorized apps. How this effectively works is by the following means. Managed apps can only send data to other managed apps, i.e., work apps can only talk to other work apps, while unmanaged apps can send data to both managed and unmanaged or they can send only to unmanaged apps. This helps control the data, so that corporate data can not be shared or opened in unwanted apps.

Per App VPN

The use of VPNs is nothing new. Corporations have used Virtual Private Networks to keep their networks secure and restrict outside access to the network. The issue with a VPN is that, while the user is  connected to the VPN, all traffic – including personal traffic –   is routed through the corporate connection. Per App VPN removes this issue by allowing only managed apps data traffic to be routed through the VPN connection, minimizing network traffic, thus giving a greater level of freedom to the user, as personal traffic stays outside the corporate network.

Enterprise Single Sign On

Handling app authentication can now be achieved by only signing on once. Enterprise single sign on (SSO) means that the user only needs to log into corporate systems once. This is available for app purchased from the app store as well. Each app that is configured with SSO, confirms roles and permissions for access corporate systems, thus eliminating the need for multiple log ins. This greatly increases usability of multiple applications on a users device. However, this comes at a cost: for SSO to work in most environments, it must be connected to a secure network.  This limits its use to local networks or VPNs, as home networks, public WIFI and cellular connections are not secure.

Caching Server 2

Caching Server 2 now supports iOS 7 and runs on a corporate Mac running OS X Server.  Caching Server 2 allows the caching of purchased content and software updates on a local networked Mac. This allows for the download and delivery of content through the App Store, iTunes Store and iBooks Store to be greatly sped up, reducing network traffic in all, by allowing users to get content to their iOS devices, over the corporate network.

iWork

Apple has now made iWork a more viable cross device and cross-platform alternative to Office. iWork is now accessible from the cloud and can be ran on any computer Mac or PC through the browser.  Apple has also made iWork apps free starting with OS X with any new purchase. At this time iOS based apps are still $9.99 for each app. Early releases of iOS 8 images show the iWork suite on the Home Tab, bringing the question of whether iWork will become free on mobile as well. If so, this could unlock a large portion of corporate users who still feel tied to Office and grant freedom to view, edit, and create documents from anywhere.

iBeacons

iBeacons are Bluetooth low energy signals that allow the locations of iOS device users, to be found with much greater precision than GPS or Wi-Fi. The range of usefulness of this technology hasn’t yet been fully realized. The applications for this can range from finding a printer in your office building to finding the nearest emergency exit. Apps can alert when approaching or leaving a location. This could potentially even be used for check out at a retail store. Maybe an iWallet? The limits for this could be endless depending on your imagination This is just a tip of the iceberg of the enterprise improves that Apple has made to iOS 7. It is easy to see, however, that Apple knows it’s the choice mobile device for enterprise mobility and they are working hard to keep it that way. Improvements have come in iOS 7.1 and I am sure we will see even greater improvements in iOS 8.

Make sure to check back in June on the Cogent Blog, when we will cover all the latest news from WWDC and how it will impact your Enterprise Mobility!  

A Brief Overview of Android Fragments

By Sean Kollipara

Introduction: Activities

When learning to develop for the Android platform, one of the first components of the Android SDK that you will encounter is the Activity object.  An activity is the basic component that provides UI and functionality in an Android app.  It has a lifecycle and callbacks associated with the lifecycle events, and is contained within its own window.  Multiple activities are usually present in a single application.

For example, consider Cogent’s directory app, mPower mD.  When launching mD, the first thing you see is the login screen.  It is its own activity.  Upon successful login, the login activity closes, and the home activity appears.  The home activity contains tabs that enable the user to navigate through the app content.  This is the basic gist of an activity.

Meet Fragments

Android 3.0 introduced the concept of a fragment.  A fragment can be thought of as a reusable piece of an activity.  It can have either or both of its own UI and functionality.  Like an activity, a fragment has its own lifecycle and set of callbacks to response to its lifecycle events.  Creating a fragment is easy: make a new class that extends the Fragment class.

public class MyFragment extends Fragment {

 …

}

Fragment Lifecycle Callbacks

When creating your own fragment, there are a couple of lifecycle callbacks you’ll want to define at minimum.  The first is onCreate().  It is just like the method of the same name in an activity.  It takes a bundle parameter and you use it to perform initialization activities, such as a call to the superclass.

@Override

public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  …

}

Unlike an activity, a fragment does not have a setContentView() method.  Instead, it has a lifecycle callback named onCreateView().  This is the other callback that you’ll probably want to define.  This callback is used to inflate a view and perform other operations on it as necessary.  For example, you might want to assign some of the UI elements as members of the class if you need to perform operations on them during the fragment’s lifecycle.

class MyFragment extends Fragment {

  public Button mButton;

 @Override

     public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    …

  }

  @Override

  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View myView = inflater.inflate(R.layout.myview, container, false);

    mButton = (Button) v.findViewById(R.id.mybutton);

    return myView;

  }

}

Other lifecycle callbacks for fragments include onAttach(), onActivityCreated(), onStart(), onResume(), onPause(), onStop(), onDestroyView(), onDestroy(), and onDetach().  As you can see, many of these are similar to the lifecycle callbacks for an activity, though a few are specific to fragments only.

Why use fragments instead of activities?

Fragments are an ideal solution when you need reusable pieces of UI and function that go together.  For instance, you might have an app where the phone layout has the main content in the entire screen and the menu in a navigation drawer.  But, in order to make use of increased screen real estate, your tablet layout has the content on the screen with the menu as a sidebar on the left.  The menu, with its UI and own functionality, is a reusable component that can be utilized in both layouts.  The same is true for the content.  Thus, it is sensible to put each of these two pieces in its own fragment.

Why not create and swap views or view groups instead?

This is a good question because it suggests a viable alternative to using fragments.  The main reason you would pick fragments over views and view groups is because they have a lifecycle and a backstack.  If either of these features are needed, it is advisable to use the fragment.  Otherwise, you’d have to roll your own lifecycle or backstack, and that would end up being a project in and of itself.  So the best course of action would be to use a fragment.

Special Types of Fragments

There are a few special types of fragments available for common UI paradigms.  In mobile apps, there are often master-detail design flows, where the master component is a list.  For this purpose, the Android SDK provides a special type of fragment called a ListFragment.  It inherits from Fragment and contains a ListView with the ID @android:id/list.  It can also be subclassed and customized to your liking, provided that the view contains a ListView element with the aforementioned ID.  For more information, see the Android development documentation for ListFragment.

Another special type of fragment is the PreferenceFragment.  This replaces the deprecated PreferenceActivity with a fragment that is wrapped by a FragmentActivity.  The PreferenceFragment can be used in a manner just like the PreferenceActivity in order to load an XML definition of preferences into the UI so that the user can customize the app to their liking.

The Fragment Manager and Fragment Transactions

Android contains a special Activity called a FragmentActivity, which includes an object called a FragmentManager.  The fragment manager allows the developer to manage the fragments that appear in each of the fragment containers defined in a view.  The fragments are loaded, switched, and removed through the use of transactions.

Within the FragmentActivity, you can start a FragmentTransaction by grabbing the fragment manager and calling the beginTransaction() method:

FragmentTransaction txn = getFragmentManager().beginTransaction();

Note: if you are using ActionBarSherlock, you should use getSupportFragmentManager() instead.

Once you have a handle for a fragment transaction, you can call various functions to add, switch, hide, show, and remove fragments:

Fragment myFragment = new MyFragment();

Fragment myOtherFragment = new MyOtherFragment();

txn.add(R.id.my_fragment_container, myFragment, “my_fragment”);

txn.replace(R.id.my_fragment_container, myOtherFragment);

txn.remove(myFragment);

Finally, to complete the transaction, call the commit() method:

txn.commit();

For a full rundown of the available methods in the fragment manager, see the FragmentTransaction documentation on the Android developer website.

Conclusion

Fragments are a bit confusing at first, but with some time spent researching and playing with code, it becomes easy to understand how they work.  Once you begin to incorporate them into your app, you can see the benefits of performance and reusability that they can bring to your Android app development.  For those who are new to fragments, I hope this post has helped to introduce you to the concept and provide a basic level of understanding as to their function and benefit.  Feel free to leave comments, suggestions, and questions in the comments section.

Happy coding!

A Recap of HR 2014

-By Ganpy

As with every year, the first conference in the calendar is always exciting for us. And that too as an exhibitor.  The HR 2014 conference in Orlando held was the first scheduled conference for us. And needless to add, we were planning for this with so much fervor and eagerness, during the past couple of months leading up to the conference. Ingentis GmbH, our partners, were also with us at the conference and we had a great time in Orlando for a week. The below is a quick recap of my experiences from the conference both as an SAP HCM practitioner and as an Exhibitor.

As an SAP HCM practitioner

SAP, after the acquisition of SuccessFactors has definitely been very aggressive in pushing cloud HR solutions in the last year or so. But since the penetration of on-premise SAP HCM has been pretty deep already, it has been and will continue to be a challenge for SAP to get every customer onboard with cloud. They have been reasonably successful till now, in getting all their customers’ ears, but what is also true is that many of the customers are probably doing this, merely because they don’t know how else to react.  Having said that, I believe that SAP on-premise solutions will continue to dominate in the near future, while more and more customers, for the fear of being left out and also due to peer pressure in the industry, will simply purchase SuccessFactors Employee Central and start playing around with the landscape it offers. I for one, expect more discussions in the marketplace and perhaps some confusion as to what is the right strategy for every customer. This also means, some consultants will be busier than the rest, while the general overall HCM consulting landscape will continue to dwindle. In this context, for me, as an SAP HCM practitioner, this conference was particularly interesting to see what kind of mindset customers were in and how the conference & the many educational sessions were going to help them answer some of their questions. I did talk to many customers and I also had some knowledge exchange discussions with fellow HCM practitioners in the market. I met with some companies with interesting new solutions to augment HR systems, much like what Cogent IBS and Ingentis are doing.

Here are my takeaways:

  • There is lot of angst amongst customers
  • The options available for a regular SAP HCM customer are too many that it is not very clear what the best option is for someone at a given point of time
SAP HCM Options

SAP HCM Options

  • There is more acceptance of cloud for HR than a couple of years ago
  • Majority of the customers have either already bought SuccessFactors or are going to in the near future. But how far they will use EC and ECP is an unknown
  • From a consulting standpoint, many established consultants are very optimistic with these changes while some are not, but the universal consensus is that SAP HR consulting will never be the same and the net monetary effect on the consulting industry will actually be negative
  • SuccessFactors has come a long way from being a standalone Talent Management solution to being the center of the HR universe
  • In about 24 months, we will know if SAP’s SuccessFactors bet actually worked or not

As an Exhibitor

Alright. Now, to the more interesting aspect for me in this blog post, that is to share our experiences as an Exhibitor. If you were part of the mailing list, you would have received some of our pre-conference campaigns and you would have noticed that our concept for HR 2014 was “HR Anywhere”. Our main objective was to showcase  our mPower HCM suite of apps – mPower mD, mPower mE, mPower mM, DynaMeet and Ingentis org.manager & distribution.list. In addition, we were also trying to highlight our Mobility consulting and HCM consulting services.

Set Up

Booth Set Up – 1

Booth Set up - Done

Booth Set up – Done

On Monday, the Cogent-Ingentis team (Ganpy, Sean, XP and Markos) finished setting up the booth. And on Day 1, Day 2 and Day 3 of the conference (March 11, 12 and 13 2014), we were there bright and early at the venue, to get things started.

At the Booth - Day 1

At the Booth – Day 1

The below are some pictures from our booth.

At the Booth - Day 1

At the Booth – Day 2

Day 3

Day 3

Day 1 was certainly the busiest, as we met several customers and other conference attendees stop by. As the conference continued to gain some momentum, we were able to get the attention we wanted to and bring some traffic to the booth.

Overall, here are some takeaways from the conference as an exhibitor:

  • The general interest for highly easy to use HR Mobile solutions is high
  • In spite of several HR apps being available in the mobile marketplace, there is no single app that gives user experience the importance it deserves
  • Our mE (ESS) and mM (MSS) apps certainly got the most attention
  • There were at least 5 or 6 potential customers who showed particular interest in these mE apps and we hope to follow up with them in the coming weeks
  • There were some interesting leads for Ingentis as well (for org.manager)
  • mPower mD as an augmented solution for Ingentis org.manager probably was not messaged well during this conference but we hope to do a better job of that in the next conference
  • The idea of selling a standalone Mobile Directory was a bit of a challenge in an SAP conference. But interestingly there were customers who wanted to hear a bit more about Employee Engagement, when we brought that up. As our mD solution continues to evolve, I am sure this is something we will keep in mind

After we dismantled our booth and packed our booth materials on Day 3, we couldn’t help but agree that the conference went by too fast. We had ups and downs throughout the conference and the kind of team we had made it all worth. There were probably a few things that the conference organizers could have done differently to accommodate more exhibitor friendly schedules, but there is never a perfect schedule in such conferences.

So, Thanks to the wonderful team from Wispubs/SAP Insider for putting together a great conference.

We should also acknowledge and thank our partners from Ingentis, especially Markos, for all the help & support they provided for the conference.

Now that we are back at our home bases, we hope to carry forward the momentum we gathered at HR 2014, Orlando.

The next stop will be Nice, France. See you soon! Oui. Oui.

Coding with Blocks in Objective-C

By Peng Xie

Part I

There are two things to mention before we start:

  1. This blog is for readers with intermediate knowledge of Objective-C and memory management. However, readers with knowledge of other programming languages or even without any programing experience may still enjoy the blog and get a flavor of the block concept.
  2. This blog assumes the coding is done under Automatic Reference Counting (ARC) environment. ARC can greatly simplify memory management work. Apple encourages developers using ARC for projects. Most tutorials and libraries are using ARC. So of course we are going to use ARC in this blog.

Getting Started with Blocks

Introduced in iOS 4.0 and OS X 10.6, blocks have become a great way to reduce code and dependency on delegates. Like functions or enclosures in other programming languages, blocks encapsulate data and codes inside themselves so they can be used as callbacks or executed concurrently. Blocks are treated as first-class functions in Objective-C. That means blocks can be assigned to variables, passed as parameters and returned from functions and methods as Objective-C objects.

Creating a block is fairly straightforward once you get used to the caret (^) symbol. In Objective- C syntax, the ^ symbol means “block.” Below is a picture from Apple’s iOS Developer Library illustrating how to create a block.

Creating Blocks

Creating Blocks

As you can see from the picture, the int (^myBlock)(int) is the declaration of the block and ^(int num) {return num * multiplier;} is the definition. The block has an int type parameter called “num” and it will return an int type value. There you have a block and you can call it by simply doing “myBlock(5)” just like calling a function. (The parameter “5” can be any value or variable.)

Another feature you will notice from the picture is how blocks interact with variables. Other than the parameters passed in, blocks also have access to local and global variables. Here comes the confusing part: Blocks will copy local variables as const type inside the blocks themselves. Only by giving the variables a “__block” storage modifier can you change values of variables from within the block. And when working with Objective-C objects, the block will make a strong reference to “self” if you access an instance variable by reference or the block will make a strong reference to the variable when you access an instance variable by value. If you are not careful with these “rules”, you may end up getting some pretty messy memory management issues. You can see that in an example in the last part of the blog. For now, let’s move on and talk about some benefits of using blocks.
Maybe you will ask, how can blocks simplify the code and why do we want to use them. Let’s look at this example of how blocks simplify the iteration of an array.

“Traditionally”, we can iterate over an array using a for loop:

For Loop

For Loop

Or, we can also iterate over an array using the fast-enumeration in Objective-C:

Fast Enumeration

Fast Enumeration

Now, using blocks:

Block Enumeration

Block Enumeration

As shown above, we used the built-in method “enumerateObjectsUsingBlock:” of NSArray class to iterate over the array. When using the traditional for loop or fast-enumeration, we have direct access to either the index or the object. However, by using blocks, we can get access to both the object and the index with less coding. One thing worth mentioning is the “stop” parameter for the block in “enumerateObjectsUsingBlock:”. The developer can set the “stop” to YES from within the block to stop the iteration. In addition, there is a speed advantage when using blocks to iterate over an array. Under complex cases, the advantage can become significant.

Blocks and Concurrency

As mentioned in the beginning of this blog, blocks can be executed concurrently. Before we dive into the topic of blocks and concurrency, let’s change gear to talk about the concurrency concept a little bit. Concurrency means multiple things happening at the same time. In the world of Objective-C, developers use APIs like dispatch queues and operation queues to execute multiple tasks at the same time. Dispatch queues are part of the popular Grand Central Dispatch technology provided in Objective-C and require the submitted tasks to be encapsulated inside a block object. While using dispatch queues is pretty main stream and straight forward, operation queues can be complicated, but at the same time, more interesting, especially when working together with blocks.

Where To Go From Here?

In this part of the blog, we went through some basics of blocks, discussed how to use blocks and why they are a better choice for coding. We also briefly introduced the concept of concurrency and how developers execute blocks concurrently by using APIs provided in Objective-C. Make sure to come back and check out the second part of the blog, where we will look into the operation queues and blocks to see how NSBlockOperation can help us concurrently execute blocks. There will also be a bonus chapter in part two of this blog to show a pitfall you can easily run into when dealing with NSBlockOperation. And of course we’re going to show you how to deal with that pitfall to make sure you won’t get into that bad situation.

Context and Fragmentation: Two things I learned in early Android development

By Sean Kollipara

Introduction

This past summer, the Cogent mobility team decided to switch from a cross-platform development toolkit to the native iOS and Android SDKs.  Our previous toolkit was based on Javascript, HTML, and CSS.  My years of web development experience put me in a great position to work with a toolkit like that.  However, our switch to native development meant a dive into the world of Java that I had never taken before.  Five months have since passed, and I have learned a lot about the Android platform and Java.  This blog post intends to cover a couple topics that I think will be helpful to individuals who are new to native Android development.

Context

One of the big issues that I had in the beginning was grasping the concept of context. In Java, context refers to the conditions under which code is executing and how those conditions might have an effect on the execution of the code.  Truly, it is not that far off from the plain dictionary definition of the word. In Android development, context is widely used when creating objects or retrieving system resources.  Creating a dialog box, getting the shared preferences, or creating an intent are all examples of actions that require context.  Many objects in the Android SDK are also contexts.  The biggest one is an Activity.  Another example is a Service. In code, context is passed as a parameter. When writing code in an Activity (or any other object that is considered a context), developers can simply use the this keyword to refer to the current object as context.  However, when writing code in objects that do not have their own context, the context of the parent object should be passed as a parameter in the constructor. For example, an AsyncTask—a class which is used to do work on a background thread—does not have its own context.  So, when the developer needs to do something in a background thread but requires context, the this keyword cannot be used like it can be in an Activity or a Service.  The solution here is to extend AsyncTask, creating an object that has context as one of its member variables.  Then, pass context as a parameter in the constructor and set the member variable equal to the parameter.  That way, when calling the custom AsyncTask from within an Activity, you can do something like new MyAsyncTask(this).  Within MyAsyncTask, you now have the Activity’s context available for use. One of the contexts available is the application context, which can usually be retrieved using getApplicationContext(). This is often a convenient way to get context when you find yourself writing code in a class that isn’t considered to be its own context.  However, in most cases, it is incorrect to use the application context because it leads to excessive memory usage by your app.  Instead, find a way to pass the current Activity’s context between your classes.

Fragmentation

It’s no secret that Android has a fragmentation problem.  This is the phenomenon by which the Android user base is spread across a variety of versions of the OS.  A quick look at the Android developer dashboards illustrates that there are many versions of Android in use on a regular basis.  This can quickly become a developer’s nightmare. Being in the enterprise mobility space, we need to target as close to 100% of Android devices as we can.  This means that we have no choice but to tackle the fragmentation issue.  The dashboards show that Gingerbread, a version of Android that was released almost three years ago, still accounts for 24% of the Android userbase.  The issue here is that many of the features available in the later API levels are not available in Gingerbread.  Perhaps the biggest difference is the introduction of the ActionBar and Fragment classes in Android 3.0.  (It should be noted that, as ironic as it is, the Fragment class is unrelated to the fragmentation problem.) Luckily, there are some tools out there to help address this issue.  The first tool is a set of support libraries, which can be downloaded through the Android SDK Manager.  There are three versions (4, 7, and 13) of the support library, where the version number corresponds to the API level with which the library was released.  When dealing specifically with Gingerbread, the most useful support library is v4, which backports features like the ActionBar and Fragments.  There is, however, a problem with the support libraries: it leaves the developer to implement either the native class or the support class based on the version that the device is running.  This makes for a lot of ugly conditional code. Enter ActionBarSherlock—often called ABS—which is the second tool that helps solve the fragmentation issue.  ABS is a set of classes that serve as a wrapper around the native classes and the support classes.  It takes care of all of that ugly conditional code (mentioned at the end of the previous paragragh) for you.  When creating your activities, simply use the ABS classes rather than the ones in the API (ex: extend the SherlockActivity class instead of the Activity class).  If you are adding ABS to an existing project, be sure to import its classes rather than the Android API classes.  For example, your project will not compile if an activity extends SherlockActivity but imports android.view.Menu instead of com.actionbarsherlock.view.Menu. Finally, we can target specific code to specific versions of Android using some built-in constants along with conditionals.  This is useful when you want some code to run only on specific versions of Android.  I had to use this in one of our apps when I encountered a bug that was introduced in Android 4.0 and fixed in Android 4.4. I found some code that fixed the bug in a hacky kind of way, so I only wanted it to execute on the versions of Android that had the bug.  The code was set up like this: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH && Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN_MR2) { // … // hacky code that fixes the bug // … } Another use case for targeting code to specific versions of Android is when functionality changes between versions.  KitKat introduces a number of techniques to reduce battery consumption.  One specific change is the timing at which Alarms are broadcast.  In Jelly Bean and older, alarms were broadcast at the exact time for which they were set.  Beginning in KitKat, alarms are broadcast sometime near (but not exactly at) the time for which they are set.  So, if you want to set an alarm for an exact time on both KitKat and pre-KitKat versions, you need to target slightly different code to different versions: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { alarmManager.setExact(AlarmManager.RTC_WAKEUP, time, pendingIntent); } else { alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent); }

Closing

Context and fragmentation can cause a headache for those new to Android development.  They certainly caused me some trouble, and a few Google searches show that others have similar experiences when they are new to Android development. I hope that this post has helped to clarify these problems and assist developers in solving them.  If you have any questions, suggestions, or tips of your own, feel free to leave them in the comments. kk-hero           Happy coding!

HTML5 vs Native

By Phillip Garton

HTML5 vs Native

HTML5 vs Native

HTML5

HTML5 is a language used for presenting material on the internet. HTML5 is the fifth generation of HTML which further pushes the support for CSS3 as well as JavaScript APIs. HMTL5 is not revolutionary, rather evolutionary. It’s an evolution of technology and features that combine to bring a powerful yet interactive presentation to the internet. HTML5 is an improvement in markup language and it better supports most of the latest trends in media, and is becoming more widely accepted by most browser formats, including Chrome, Safari, and IE.

Web Mobility

The mobile web browsers adoption rate is high with almost all mobile browsers now supporting HTML5. Companies and programmers alike are turning to HTML5 to solve the cross platform compatibility issue that plagues us all, when developing mobile applications. With no formal SDK to be confined to, large resource pool of web programmers to pull from, and media rich features, HTML5 is thought to be the answer everyone has been looking for. As HTML5 and its programmers mature, web based applications are feeling less like a web page and more like an actual app when viewed on a mobile device.

Mobile web developers are learning how to remove the common items that tell us we are in a web page, like address bar headers and navigation buttons, so we become more submerged in the page than ever before.   With the proliferation of hybrid web containers like Phonegap, and with their ability to create apps, it is making it even harder to identify if you are using a phone app or viewing a web page. The web has truly become mobile with mobile formatted websites and “apps” with HTML5.

HTML5 vs. Native

Companies are now being faced with the question “Do I use HTML5 or Native to provide solutions?” The answer to that question isn’t as clear as we would like it to be, and we have to weigh the strengths and weaknesses of each and how it relates to the solution you are trying to provide to determine which is best suited to implement for your environment.

HTML5 provides solution support across multiple mobile platforms, both for smartphones and tablets, as well as support for desktops, allowing for a consistent environment experience from the office to on-the-go. Ease of implementation and this common “look and feel” make HTML5 a very attractive avenue for solutions for those dealing with multiple device management struggles.

However, HTML5 is not without its disadvantages. Speed, security risks and lack of phone enabled features all have been pointed out as shortcomings of HTML5 derived apps. In the below chart, we compare the features of HTML5 and its Native counter parts.

Features

HTML5

Native

SDK

None

Xcode, Eclipse

Programming Language

HTML, JavaScript, CSS

Objective-C, Java

App Store

No

Yes

API

None

Native

Processing

Remote (server based)

Local (on device)

Security

Low

High

Device Specific Features

None

Native

Upgradable

High (every time app is run)

Low (only through app store)

Code Reuse

Cross Platform

Device Specific

Native solutions support stricture polices and more control over your data and environment. Native SDKs provide a structure in which your solutions can be developed in, allowing for corporate polices to be more strictly enforced and offering a level of security that HTML5 cannot match.  The SDKs also provide a solution environment that most device users have come to be familiar with enabling quick adoption rates and providing access to device features that most users come to expect when using mobile applications.

Native like HTML5, is not without its downfalls. Since apps are only available through the app store, this ties the corporation to the native eco-system, limiting updates and the ease of installation.  Because of the limitation of resources available for development, and device specific increase in code base, there will be an increase in overall development time & cost, in multi device environments.

Which brings us to our question, HTML5 or Native?

This can only be answered by your needs for your solution.

HTML5 is your answer if you answer YES to all the questions below (or most):

–       Do you need a solution that doesn’t require a lot of front end processing?

–       Do you need a solution to support multiple devices?

–       Do you need a solution that you can easily push updates too?

–       Are your security requirements low and do not need on device storage?

–       Are Native features needed to support your solution?

Native is your answer if you answer YES to all the questions below (or most)::

–       Do you need a solution that provides on device processing?

–       Do you need a solution to support only a few devices?

–       Do you require data security both on device and during transmission?

–       Do you require access native device features for use in your solution?

–       Is speed/performance critical to your solution?

As your mobile strategy evolves and the features that you are willing to comprise on and the ones you are not become clearer, the best alternative for your solution will become apparent. The end result will be a solution that not only works but also is optimal for your business.