Accessing hardware infos on iOS devices - iphone

Is it possible to write an app that displays hardware infos such as the number of kernels in the processor, the available RAM, GPS, motion sensors?
Using CoreLocation and CoreMotion it's not possible to know for sure if a GPS or an accelerometer is present on the device because of the Location Services switch.
Is it possible to check deeper for hardware?

Pretty much no. You can get some general, implied information, for example by allocating RAM until you get a warning, and then assuming that's your available RAM. You can also check for availability of certain services, for example by asking CLLocationManager if locationServicesEnabled. But you can't get detailed information about it to know for sure if, for example, the GPS is there, but it's just turned off.
So the answer is no.

Check the iPhone Developers Coockbook ( Erica Sadun, http://ericasadun.com ) for the UIDevice Class - UIDevice-Hardware (direct link here: https://github.com/erica/uidevice-extension/blob/master/UIDevice-Hardware.h ) - but I'd also recommend getting the Book. Pretty good stuff, and the UIDevice Extensions are pretty good.
Please note that some of that stuff is private API! - you won't be able to submit it!

Related

How can "memory cleaner" apps determine the amount of used memory on iOS?

Every now and then "memory cleaner" apps bubble to the top of the download charts on the iOS AppStore, yet I am always puzzled: How can these apps figure out how much memory is used when they are sandboxed and can't access any memory outside of their process?
I'm not an expert in memory allocation on C, so maybe the solution is obvious and I just don't know it but I am curious as to how this works/could work.
Obviously the second question is how do they clean the memory once they have the count, I assume they just allocate a ton of heavy objects (eg. images) and thus force the OS to shut down other processes. Yet maybe there is a smarter way?
Note, I am not talking about Cydia here, these apps are available on the regular AppStore and work on non-cracked devices with the official consent from Apple. As an example, here is the current top seller: http://iputzfrau.professional-apps.at/
The Mach/BSD host_statistics and sysctl functions are available on iOS, and they provide access to system statistics such as the amount of physical RAM, processor speed and, indeed, the amount of free RAM available. To get the latter, you'll want to call host_statistics with HOST_VM_INFO, and look at free_count in the structure it fills out for you. Note that this value isn't necessarily useful for any real purpose. You probably don't need it unless you want to write yet another one of these scammy apps.
Low-level functions in the C/UNIX/Mach/BSD layer are generally available for use in iOS apps, although these APIs typically aren't described in the SDK documentation. Look at the headers in /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/include/ and refer to the Mac OS man pages, C/UNIX standard documents or the Mac SDKs for more details about them.
These apps, as with the "track any cell phone" apps that have "for entertainment purposes only" buried in line 30,239 of the description, are scams. It's exceedingly frustrating that Apple lets them through the review process.
You're right -- there's no public API that would enable an app like the one you linked to do what it claims to do.
This would be an excellent question to pose to Apple, or at least post in the Apple developer forums. You could also report a bug, probably the most effective way to register a complaint without knocking yourself out.

Getting cell tower information in an iOS application?

My question is simple but I haven't found a good answer anywhere. My question is this: Is there a way through either the iOS SDK or third-party frameworks to get cell tower location data? Meaning cell tower location, distance from you, etc.
The signal application for iOS does this, so I know it's possible, but I can't seem to find any documentation or resources on the matter.
Thanks!
There is no official way to do this as far as I know.
iOS SDKs abstract that info to a single and easy to use location API.
The application you link is probably using private APIs from iOS.
That means that developer is using undocumented functions from iOS.
If you really want to find more about it, you can try contacting him.
Also check this:
iOS Private API Documentation
The signal app used some private API which will lead to immediate rejection by Apple, which is why it says jailbreak device only.
Plus, you may find this post helpful: iPhone signal strength
The CellStumbler application (CellStumbler at code.google.com) uses undocumented methods in the CoreTelephony framework. There is a CellInfo struct defined which can be queried via the _CTServerConnectionCellMonitorGetCellInfo method.
However, on iPhone-4S - iOS5 the CTServerConnectionCellMonitorGetCellCount always return zero - so no cell info can be queried. Things may look different on a iPhone4/3S since Apple changed the baseband modem from Infineon Gold to Qualcomm mdm6610.
You mal also try to evaluate the built-in FieldTest app (just dial *3001#12345#* to start) which gives you a couple of info related to your cellular network status.

How do I ensure only Region Monitoring capable devices can see my app in the store?

Apple's Location Awareness Programming Guide suggest to include the location-services and possibly the gps for UIRequiredDeviceCapabilities.
My app requires the Region Monitoring APIs. How do I ensure only capable devices can see my app in the store?
You're right, location-services and gps will allow devices other than the iPhone 4 to install your app. You could pick some other feature though that you know is iPhone 4 exclusive, like camera-flash or gyroscope and require that one.
I'm not entirely sure whether apple will frown upon a restriction without an apparent need, however gyroscope appears to me like a likely restriction in a navigation enabled app. If you try this approach, I'd explain things in the text field for the comments to the reviewers. Another caveat would be that you'd risk that a future device wouldn't "fit in" - an hypothetical iPhone mini which would feature region monitoring but lacking a gyroscope or camera flash wouldn't be able to install your app, for example.
To be entirely honest, If I were you, I'd ask apple to make sure.
Check out UIRequiredDeviceCapabilities - Apple Developer Documentation. Basically exactly what you said. Are you looking for instructions on how to do that?

Reading iphone carrier's signal strength

Is this even possible?
If not I'm really surprised this hasn't been open thru the API yet.
Apple doesn't allow the use of low level network/wifi/cellular api's. Interestinlgy during a previous period, there were apps in the app store that made use of private apis (a few WIFI-Scanners for example). They've all been banded from the appStore by now, as far as I know at least.
Also the newly available (since iOS 4) core telephony framework doesn't offer any methods or properties to serve you the information you're looking for.
So unless you're building a non-app-store-app I don't see a legitimate solution to your problem.
*sam
Several apps in the app store use OS 3 and get signal strength.
Apple fully approves them.

Check if iPhone 4 or not

I would like to check if the user is using an iPhone 4 or not. How can I do that ?
Thanks !
Sebastian
Apple specifically recommends against this, instead preferring that you check for individual features and act according to these. This makes your life a lot easier when Apple releases new hardware; if for instance Apple releases an iPod Touch with a camera, and you need a camera for your app, your users wont be upset that it tells them "No camera found" when it does have one, all because it reports as not an iPhone. Here is one way to require all the differentiating hardware features. Do not use these for enabling/disabling features that are supported but not required: this can be determined at runtime through the APIs used to interact with that feature.
UIDevice (see here, also the docs) can help you determine if it is an iPhone, but again, don't do this.
To detect the difference between the iPod Touch and the iPhone, we use
if(![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
There might be something similar to check for a the forward camera.