I am using TestFlight - must I remove all the source code from my solution or is it okay just to comment out any calls to TestFlight before submitting to App Store?
The testflight library adds quite a bit of weight to your app, and it would seem sensible to remove it from your app store builds if you are not using it. Commenting out your calls is also rather cumbersome.
You can use a different build configuration which uses preprocessor definitions to prevent your testflight calls unless you have built for beta, this configuration can also exclude the test flight library from non-beta builds.
This also means that your simulator runs don't call testflight either, which is usually a good thing.
There is a good explanation of the process here which also refers this other question here on Stack Overflow.
Related
I realize this is a stretch and I can't give much info to help but I am reaching for anything. My App has been under continuous development for 3 years and never seen anything like this. I recently submitted a small point release to Apple for Release, and twice now it has been rejected for Crashing on Launch on ALL their devices?
The Crash reports point to some code in static library but the key lines are not getting symbolicated. Tried Atos no luck.
The key point is that I have 7 devices I have tested the app on in every mode I can think of, in particular no connection to anything: Wifi-OFF, AirplaneMode-ON, Location services-OFF. I can NEVER simulate what they claim to be seeing, which is App crashes on launch every time?!
I found one report in the AAPL Dev Forums that sounded similar, but he never got any explanation as to what was up. After he submitted an app with loads of logging in it out of desperation and asked them to send the logs. They got that version and... approved it in hours.
Anyone have ANY ideas. I NEED to get this release out.
NOTE: Resolved
This turned out to NOT be a weak link issue. We only saw the crash when running the App using Ad Hoc distribution of the Archive version as Brad suggested... so that was helpful.
However the resolution turned out to be some compiler flags which I listed here:
https://stackoverflow.com/a/10302012/754494
I'll repost and expand upon my comment from above so that this question can have an accepted answer.
I recently came across a case similar to this when building my GPUImage framework. It appears that the build process is slightly different when archiving than when building and directly installing an application on the device via Xcode.
This can be exposed by building and archiving the application, then choosing to distribute it for ad hoc or enterprise distribution. Take the .ipa and place it in iTunes and manually load it on one of your test devices that way. The behavior of an application prepared in this manner may differ from one built and installed through Xcode, and should be closer to how a build submitted for review will act.
In my case, the problem was due to a lack of proper weak linking. On SDKs newer than iOS 4.3, you should no longer need to weak link whole frameworks if you wish to conditionally use classes and functions that are present in newer SDKs but missing in older ones. If you target 4.0 and higher, the linker should now perform class- and function-level weak linking.
However, this was failing for people using my static library, which does runtime checks for the presence of the new texture cache functions in iOS 5.0, but it only failed in these archived builds. I never saw it in all my testing against 4.x devices, because that was done by installing via Xcode. In the end, I needed to have users explicitly weak link the entire Core Video framework in order to get applications using this framework to run properly when archived and installed via iTunes.
Note that this wasn't due to the Release vs. Debug build configurations, because I tried switching between these in my build schemes when deploying to the device through Xcode and it made no difference there. Something else is different in the way that archived applications are built and linked.
When an app is undergoing the app store approval process, do the people at Apple check the warnings in your project, or do they only check for errors?
e.g. I have this warning on a lot of my NIB files:
Unsupported Configuration: Title set but using a system Identifier (These attributes are mutually exclusive; the Title will be ignored)
Will this be a reason for Apple to reject my app for the app store?
Apple won't check for warnings in your project, because they can't. They don't get the source code to your app, only the compiled binary and supporting files. So long as you follow the rules, you should be fine.
As for the specifics of your question: I very much doubt it, but nevertheless, you should definitely aim for a project which compiles without warnings, just as a general programming practice.
I'm whipping up a short specifications/requirements document for a small prototype iPhone app project. Describing the basic functionality and behavior is not an issue for me. But, since my mobile application and iPhone development knowledge is very weak, I'm not really sure what else should be in such a document regarding best practices and such.
Example: In my programming world (server side Java), when spec'ing a project for outsourcing, I state that the project must pass static bug analysis by FindBugs.
Example: I understand that there are API calls Apple does not want app developers invoking. These can be cause for having an app rejected from the app store. But I'm not sure how to say that we want Apple's guidelines respected. (I don't even know how to test for that.)
What should I include in a two-page requirements and specification document that is specific to iPhone app development?
These are some points you can mention
1. The application should be developed based on Apple's user interface guidelines
2. There should not be any private API call inside the project which makes the application rejected from apple
3. There should not be any memory leak or excess memory allocation issue during the application running state
4. The application should be supported in all iOS after [your option]. (It mainly depends on the features used in the application)
5. The application should be supported in iOS 4
6. The application should work properly on iPhone 4
Hope this helps
A private API wont be mentioned in any header file or in the documentation so one way to test for that would be to manually go through the source files and search for the functions used in the headers and documentation to see that they are there. It's really not feasable if the project grows but for a small app it could work :)
In addition to the things already mentioned here, I'd add a few more:
The app should work fast, no action should give the user the feeling, the device is doing something
Everything that takes a while should be run in background and even better, be cancelable
Make sure you use animation only where it makes sense but not too seldom. A smooth feeling is most important for users.
These things also imply that you try to minimize application startup time.
There are often tricks to work around performance issues. The feeling a users gets from your application is not how fast it is, but how fast if feels. In my opinion this is the single most critical requirement, besides obvious ones like no crashes etc..
What's the problem with using a private API?
Moreover, I would add that it will be tested on iPhone 3G, 3GS, iPod, 4, all with iOS4 and 3.
I was wondering if there was a way within an app code to determine if the app is real (in the iTunes store) versus test? The reason is that I have every part of in app purchase resolved. However when verifying the receipt you must send it to either https://buy.itunes.apple.com/verifyReceipt if live or https://sandbox.itunes.apple.com/verifyReceipt if just a test.
Currently I switch the setting prior to submission but I know such an approach can easily fail with a sandbox version being submitted by accident. I would like the code to determine which URL to use.
You could have it set using some #ifdefs and the different build configurations Xcode can create (i.e. debug vs. release vs. distribution).
You should use a #define APP_STORE, or something like that, and check with #ifdef. Then, in your build script to build your app store submission from scratch (you do have a one-step build script, right?), just have it automatically define APP_STORE, and you'll never forget.
Those of us with iPhone apps (released or unreleased) are able to send out limited beta builds using ad-hoc distribution. While the Apple docs for this have a few holes in them, there are a number of blogs, postings and other articles out there on "the net" that fill the gaps.
However, one thing I haven't seen anyone mention, and I was curious about: When you do a beta build do you use the same app id as your released (or to-be-released) app?
The argument for using a different id is that the beta could then still run alongside the released app. This is probably more important if you already have a released version in the field.
An argument against is that the beta would not have access to any data the released app may have generated, and vice -versa. This may or may not be what you want on a case-by-case basis.
Are there any issues with this approach? I only have one app id registered currently, but IIRC there are no obstacles to just creating more as necessary..?
Would be interested to hear what others are doing.
We use the same app ID, just for simplicity. There are enough headaches in ad-hoc distribution that we don't want to confuse anybody with "why are there two apps on my phone?" problems.
I use both different Bundle Identifiers to allow my testing team to have multiple versions of the app installed as well as different Bundle Display NAmes, so they can easily see that they are using a development or beta build and report that number back to me when issues are found.
I think it depends on how important the data in your app is. If the data is valuable I don't think beta testers would want it putting at risk, hence having a separate AppID would make sense. Of course, that also means that they won't test the application as fully either and any "upgrade" code won't get tested.
In my case (Yummy), the data is just a cache of delicious.com so a catastrophic bug in my code would mean, at worse, downloading all your bookmarks again. So I tend to use the same AppID for everything.