How to read (GID1) Group Identifier Level 1 value on iOS application - ios

We have a requirement in our iOS app to identify the carrier based on the SIM and show some custom features in the app when the user is using that particular network provider. For this we have to identify the carrier based on the mobile network identifier (which is a combination of MCC/MNC codes) and the GID1 values. We were able to able to find the values of MNC/MCC codes using API's provided inside the Apple's CoreTelephony. But I was not able to find any means of accessing the GID1 values. GID1 stands for Group Identifier Level1. It can be used to identify a group of USIMs for a particular application as described in the document here (Section 4.2.10). Is there a way to read this value in iOS. If so how to do this. Any help is really appreciated. Thank you!!
NOTE: It looks like there is a way to read this value in Android : https://developer.android.com/reference/android/telephony/TelephonyManager#getGroupIdLevel1()

Related

Xamarin IOS identifying device

I'm writing an application which will be used in an enterprise, no outsiders.
This application should fetch data from API response and display it.
Each user has his own device, Ipad and should see only the data he is the owner of.
Problem i'm facing is identifying the device/user, so that API responds with only the information the user is supposed to see.
brief example of how it should work:
App is opened -> get unique id -> attach ID to API call -> receive appropiate response -> display data
As i imagine this ID should be static and not made upon installation of the app or generated.
I've tried getting UDID, Serial, MAC,- no luck, they're deprecated. Only managed to get .IdentifierForVendor, which is unique not in the way that i need.
So here is my question, are there any other options left?
Like fetching appleID name,email or should i make unique deployments for everyone separately?
Or a Log-in screen?
You could create a GUID for every App instance. However, apart from that you will have a hard time doing what you want.
These ways of identifying a device have been deprecated to ensure Advertisers and other malicious Apps cannot fingerprint a device easily.
If you don't want too much hassle authenticating everyone, you could apply a simpler scheme such as using a pin code, QR code, NFC tag or whatever you prefer.
However, if someone were to steal one of these enterprise devices and it would contain any secret information I would rather rely on something more secure as username and password, or even better something multi-factor.
Unique id's will have to be set by deploying the app from MDM. For example:
https://docs.jamf.com/9.9/casper-suite/administrator-guide/In-House_Apps.html
How should the application accept those variables, i dont know. Maybe it modifies .plist when deploying.
Solution i did was enforcing device name from MDM, so that users are unable to change it - and using that as the unique identifier.

How can I get identification string look like IMEI in IOS

My project have a case: one account user can only log on to one device ( if user log on to app in device A, user can't log on to app in device B). My Idea is: when user login, I'll get the imei Iphone (like android) and send it with request login to server. But I can't get imei. I try with UUID, but UUID will change when re install app. Keychain does not solve the problem. Please help me.
You have to use Keychain to store Unique Id , this will not change even if user delete app
You can use any wrapper Source code to do this
here is an example
https://github.com/Joe0708/KeychainUUID
At the beginning I'd like to mention that I do not know any method that directly answers your question, especially that Apple does not allow you to read IMEI and other similar stuff due to privacy concerns. This has been answered here.
The workaround might be as follows
Take a look at the UIDevice class, especially at the identifierForVendorProperty which provides you (according to documentation ) with a device specific value.
The value of this property is the same for apps that come from the same vendor running on the same device. A different value is returned for apps on the same device that come from different vendors, and for apps on different devices regardless of vendor.
As far as i know some financial apps are secured this way to permit only one device to access the account. This however requires registering a device each time application is reinstalled.
Alternatively you can use UUID you generate within your app (first run) and then you assign it for the user online. It might take the form similar to two step verification process. Be aware however that with such restrictions user will have to be online all the time to use your app.

Get IMEI and serial number from SIM on iOS programatically

I need to get the IMEI number and serial number of the SIM card in iOS, i have done this in android using the telephonymanager, but how can i achieve this on iOS?
I need this value because I save it in a data base using a web service, each time a client attemp to log in, so it doesnt matter if the client changes celphone or not, the account will be the same because the SIM card will be the same one.
I have been searching on the web, and found a way with this:
NetworkController.m
But it seems like this class has been removed from the web. Another possible way to achieve my goal is to use:
UIDevice-IOKitExtensions.m
But no documentation is given. Any ideas?
Does apple accepts an app using private framework?
Apple does not allow the use of private framework / api. Also, getting the users IMEI number will cause Apple to reject the app.

How to get geolocation data with JavaCard from SIM

I would like to write a simple cardlet which takes geolocation data from my SIM card.
I read about JavaCard but I have no idea how I can use it to get geolocation.
I read that SIM cards keep the information about
Local Area Identity
and I would like to get this data with my cardlet.
Could you suggest me some solutions(APIs) f.e. with JavaCard.
Thank you in advance
There are some possible (U)SIM Toolkit APIs:
Using EVENT_DOWNLOAD_LOCATION_STATUS. Register this event on install method, and applet will receive the event when there is location update in processToolkit method.
Using PROVIDE_LOCAL_INFORMATION proactive command, with command qualifier set to '00' ( Location Information / MCC, MNC, LAC and Cell Identity).
For two solutions above, you need to check that the mobile phone you are using has the support of the mechanism, indicated in its TERMINAL PROFILE.
Alternatively, you can also check for EF LOCI under DF GSM which keeps the Local Area Identity information and read it using READ BINARY.

Restrict features of iPhone app work for different app stores

I have an app that is on appStore.However this app gets some of the data from server side from an xml
My app is on different apple stores. However I want to restrict some features to only specific app stores. How can I make the application to work for different app stores , lets say make the app read different xml for different app stores or something like that? Is that possible? Or maybe Any place inside app where my app can read the store Type e.g find out if its USA Store or Japanese store or Etc.
An easy way of doing this would be to have a input parameter in your API call which the application can request which country it's from, and then deliver your refined results based on that. Then, launch multiple apps in iTunes connect where each one specifies which country it is in the API request, and only allow it to be downloaded from that country.
For example, if you had two applications:
MY APP (UK) - API call: http://example.org/api/uk/request.xml
MY APP (USA) - API call: http://example.org/api/usa/request.xml
Note: The country you set in iTunes connect is the app store registered to the users account and not based on what country they are actually in!
Alternatively, you could use a online service to determine the location based on their IP. I haven't done this but a quick search finds:
http://www.makebetterthings.com/iphone/how-to-find-ip-address-of-iphone/
http://www.geobytes.com/iplocator.htm?getlocation
i think in you developer account in the app setting you can choose to which stores to upload, or do you mean like having different content for some stores?
Actually you can do it in two ways:
1- build a different binary for each country
or
2 - find an API that let's you know what is the reference store for an user
About this second option, a quick search in the Apple documentation didn't return me a specific API to do this.
Sure, basing on the Locale is not good (what if the user changes the language settings?)
The only way I found is to use SKProduct class. It has a priceLocale property that returns an NSLocale instance. So if you do:
mySKProduct.priceLocale.localeIdentifier
you'll have a NSString with the locale associated to the reference AppStore. (in my tests: it_IT#currency=EUR ).
I tried it in a project with in app purchase enabled, I think that you must setup a real SKProduct to make it work properly
Regards
Fabio

Resources