Restrict features when user is running old version of application, only if there are changes to the online engine - iphone

I would like to restrict online gaming features inside an application, ONLY when there is an update available which impacts the online game code/engine. I know I can disable the online gaming features if the string in [[NSBundle mainBundle] objectForInfoDictionaryKey:#"CFBundleShortVersionString"] (referenced from question here) is not equal to the most recent version in the app store. But if I release an update that does not impact the online gaming experience I do not want to disable the online features.
Does anybody have a creative way to "tag" a release so that I can detect whether the update has an impact to online gaming? Would adding a subversion be the best way? I.E. updates with online features change subversion level 2 (1.2.1) and non-online updates change subversion level 3 (1.1.2)?
As a note, I disable the online gaming features when updates are available in case the update has changes to how a packet is sent or a fix to the scoring engine etc.. so I don't encounter a scenario where an old version is playing a new version and the messages don't match up. (I have also considered using Game Center Groups to make sure you are playing a player from the same app version, but ultimately decided that getting users to upgrade is a better plan)

I would go about this by having a list of valid versions on the server in the form of a whitelist. When checking if the user can be online (for example, when they hit the Multiplayer button), just ping your server including the user's bundle version and have the server return a simple response which denotes whether the user can play based on the version number that they submitted.
I do something relatively similar on an application of mine to push actual code updates to a client based on the version of the application that they are running.

Related

How long time is data cached with GA plugin in Unity apps

We have an Android app built using Unity and the Google Analytics GAv4 plugin for Unity.
The use-case is that the users might use the app for days without internet, and when they do connect to internet again our expectations is that the data is cached on the device and will then be sent off.
Our initial tests seems to work, but cannot find any reference to how long the data persists on the device, and if there are any expiration of the data. The users have experienced that they miss some data generated when offline.
I have tried exploring the plugin, but cannot seem to find anything about how it caches the data. Anyone who have experience with this?
It looks like it is using com.google.android.gms.analytics.GoogleAnalytics which you can search the documentation on. It also might depend on the highest API level/android version on their device, where low version may not be able to send while offline or something. I think this page explains a little about how it keeps checking for a connection and tries to dispatch the events:
https://developers.google.com/android/reference/com/google/android/gms/analytics/GoogleAnalytics#dispatchLocalHits()
I saw in the plugin source code here:
https://github.com/googleanalytics/google-analytics-plugin-for-unity/blob/master/source/Plugins/GoogleAnalyticsV4/GoogleAnalyticsAndroidV4.cs

Inkcanvas with Citrix Receiver Mobility

We currently deploy a CMS type application through the Citrix Environment and i have added an electronic signature feature which I wrote using an WPF Inkcanvas. This part of our application works well when using the pen mouse through a desktop version of the receiver, but very poorly when accessing it through a tablet, Ipad or Droid. When you go to try to scribble you signature you either to hold your finger to initiate the left-click hold, this is longer of droid than Ipad. Does anyone have any experience with this? I want it to work just like Square signing feature a just draw by touch.
You have a few options here. The simplest is to tell admins to set the Application Description to the following when publishing the application:
keywords:mobile
On the mobile receivers (iOS and Android) this does a few things, the useful one for you is it puts them into a different input mode where the receiver does less gesture detection and pushes through events more directly.
You can perform more finer grained control of the input mode using the Mobility SDK for Windows Apps. You can probably get away without the added complexity of using the SDK and just use the extra keywords in the publishing step. But if you're interested there are multiple language bindings for the SDK, including .NET. The main SDK link is here:
http://www.citrix.com/mobilitysdk/
The specific class you use to set the input mode with the .NET binding is here (see BeginSetTouchInputMode):
http://www.citrix.com/mobilitysdk/docs/cmp.net/index.html
Finally the last option is to get your customers using the latest XenDesktop 7 using Windows Server 2012. This is the latest release and it supports touch remoting, so the receiver will not perform any gesture translation that delays user input. Instead it will pass all the touch events directly up to the server for processing. The iOS receiver has implemented touch remoting, however I'm not sure if it's been added to the Android receiver yet.
So the tl;dr is use "keywords:mobile", and then when your customers eventually upgrade to XenDesktop 7 this should become a non-issue.

iPhone app - suggesting that the user update to the latest version

We currently have an iphone app in the app store. We release version updates periodically, about once every other month or so, sometimes more often. Most of the times, the updates are not large, just added bits of functionality, bug fixes, etc. Sometimes however, there may be major changes (so far it had happened once, about a year ago and it's about to happen again).
When major changes do happen, ideally, I'd like to get the users to update to the latest version. I know that there's no way to automatically install the update. As the app communicates with a web service to receive its data, I can use that service to check for the latest version and, if it's not the latest one, I can alert the user that a newer version is available and prompt to update. If the user chooses not to update, I have to options: (1) let them continue running the older version, or (2) effectively force the user to update by blocking the app functionality if it's not the latest version.
As the app requires back-end web-service, usually for major app updates the back-end needs changing. Sometimes these changes render the back-end incompatible with the previous version of the app. The previous time this happened, I had to set up a separate back-end for the new version (I now have to two web apps running on the server: for v.1 of the app and for v.2). While theoretically I can continue doing the same - setting up v.3 and so on, I would much rather prefer not to and force the update on the user.
Now, technically it's quite easy to set up. However what is Apple's view on such behaviour? Could they reject an update because of this? Any experience on this front? Thanks in advance.
It depends on the time frame of your transitions. We have a customer who exactly required the behavior you describe. We can send the client application two signals: should-update and must-update. When the client receives must-update, it will no longer allow the user to run. We have transition periods and tag the breaking changes, so maybe the active backends right now are e.g. V6, V7 & V8. We give users enough time to transition.
The Chase bank app forces you to update when an update is available (or else you can't log in). I think it's pretty annoying from the user's perspective, but Apple has certainly approved updates that do exactly what you're describing.

Database driven ios app - first steps

I'm about to start work on my first app which will be an internal release to gather customer information at a trade show.
I'm hopefully looking into using air for ios or maybe one of the various html/js frameworks to develop this app as an alternative to learning C.
ideally I would do it with some server based php > sql to store and share gathered information between a fleet of iPads, unfortunately due to the population of this trade show there will be no guarantee that i can maintain a wireless connection so need to prepare for these apps all being local access only.
in which case, how would you recommend going about the saving/reading of the stored data, and also how to sync it up with a sql server and then back to the iPads each night.
Did you try PhoneGap? It is an HTML5 app platform that allows you to author native applications with web technologies, in other words it will let you make an iphone app without having to learn C.
People have written tutorials and plugins for storing data locally.
PhoneGap basically wraps a web app hence you can use AJAX for sync with server as and when needed. This article might help.
We explored PhoneGap and found it very useful. and easy too. hope this helps you.

What is the iPhone SDK Missing?

I've been doing mobile app development for a long time (2001?), but the systems we worked with back then were dedicated mobile development environments (Symbian, J2ME, BREW). iPhone SDK is a curious hybrid of Mac OS X and Apple's take on mobile (Cocoa Touch).
But it is missing some stuff that other mobile systems have, IMO. Specifically:
Application background processing
SMS/MMS application routing (send an SMS to my application in the background)
API for accessing phone functions/call history/call interception
I realize that Apple has perfectly valid reasons for releasing the SDK the way they did. I am curious what people on SO think the SDK is missing and how would they go about fixing/adding it, were they an Engineering Product Manager at Apple.
The biggest shortcoming in my opinion is support for separating licensing from distribution.
What I mean by this is that it should be possible to download a trial version of an application and later purchase a license for that application (from an API call inside the application or from the app store). This would make it much easier to try-before-you-buy and get rid of the current duplicates of many applications with 'lite' versions.
I think lack of push notifications for apps is the big thing we're missing right now. With push, you can register your application to perform a task (like getting the most recent data from a web service) even when it's not running, at a time and frequency the OS decides is best. In an ideal world, along with the existing concept of iPhone apps loading quickly and resuming where you last left off, this solves the problem of not running in the background. I know some tasks will be more difficult or maybe impossible with this strategy, but it's still a pretty good compromise between third party applications and the iPhone's limited hardware.
Originally push was scheduled for last September, but it was removed from the beta SDK and not spoken of since then.
API's I'm personally looking for:
Apple80211 as a public API (private, current API is fine if documented)
Access to Volume buttons (semi-accessible via Celestial, private, needs new API)
Access to Calendar (private, API status unknown)
Access to Bluetooth + SPP profile (status unknown)
Access to Camera (directly, API status unknown)
Access to JavaScript runtime (directly, not through UIWebView, API status unknown)
WebKit access that's lower-level than UIWebView (private, current API is fine)
Access to Music Library (private, current API is fine)
Garbage Collection.
CoreData is missing.
You've mentioned some of the big ones - copy & paste (or in fact any way for apps to collaborate) is another huge omission.
It also seems to lack a desktop synch framework (at least if it exists I can't find it).
Language independence and especially lack of scripting is another pet peeve - objective-c is all very well but more languages to choose from would be good.
Inability to dynamically extend apps, via scripts or otherwise, is another big omission. This is partly an SDK/OS issue, partly licensing.
My list ordered by priority:
Mapping abstraction (the MapKit looks awesome), but that would require a new Google Maps TOS
Music library
Camera (photo + video) Access to more
UIViews, Apple designed some pretty nice custom ones for their apps
Better UIWebKit abstraction
The features I see missing that it should have is
Access to SMS
Direct Access to Google Maps App. You should be able have access to this so you could extend your application to use the built in features provided by Google Maps.
Access to the Bluetooth functionality of the phone.
Access to the Calendar. Why not allow access to simply post a calendar event for the user.
Access to Active Sync. It would great if we could directly access this and communicate back to the Exchange Server.
Core Image. They provide Core Animation but Core Image is missing. I hope that this is added to the API soon.
These are some of the features that my clients have access for in the past and are supprised when they are not available.
We definitely miss a Calendar API and SMS access. So many applications could leverage such APIs. The iPhone allows users to have everything in their pocket, but it's almost useless as long as developers cannot leverage this integration in their apps.
A language with proper namespaces.
A limitation that bugs me is lack of access to system features that require root or setuid. For example: opening privileged IP ports.
I'm not sure there is a good solution to this, as long as Apple's policy is to keep the device locked-down.
Allow program to set some kind of local timed event for your application to bring up an alert and launch your app if the user agrees (like any calendar app). You could do that with push notifications but there are many cases I'd hate to have to rely on a whole server infrastructure and network connectivity just to basically do some timed thing.
Some idea of what direction the user is facing. I cannot believe the GPS chip the newer iPhones use are not capable of reporting direction.
I would personally love to see
Access to the CoreTelephony Framework (Currently private). Which allows access to all the phone functions (Especially sending MMS / SMS).
Some sort of ability to run stuff in the background. While push notifications is ok for most things, but it is a bit hard to leverage CoreLocation (i.e. have the app show a notification at a certain location). Of course this would probably need an on/off button or app specific like push is.
animation view which will be reduce developer to make a cool app , of course the core business local still need consider more , but the view layer could more easy to use ....