Universal iPhone/iPad application debug compilation error for iPhone testing - iphone

I have written an iPhone and iPad universal app which runs fine in the iPad simulator on Xcode, but I would now like to test the iPhone functionality. I seem unable to run the iPhone simulator with this code as it always defaults to the iPad?
Instead I tried to run on the device and as it begins to run I get the following error:
dyld: Symbol not found: _OBJC_CLASS_$_UISplitViewController
Referenced from: /var/mobile/Applications/9770ACFA-0B88-41D4-AF56-77B66B324640/Test.app/Test
Expected in: /System/Library/Frameworks/UIKit.framework/UIKit in /var/mobile/Applications/9770ACFA-0B88-41D4-AF56-77B66B324640/Test.app/TEST
As the App is built programmatically rather than using XIB's, I've split the 2 device logics using the following lines in the main.m method:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
retVal = UIApplicationMain(argc, argv, nil, #"AppDelegate_Pad");
}
else
{
retVal = UIApplicationMain(argc, argv, nil, #"AppDelegate_Phone");
}
From that point forth they use different AppDelegates and I've checked my headers to ensure the UISplitView is never used nor imported via the Phone logic.
How do I avoid this error and is there a better way to split the universal logic paths in this programmatically-created app?

That error is being triggered because you didn't weak-link the UIKit framework. The UIKit framework in iPhone OS 3.2 added the UISplitViewController, and if you link it in as normal your application will assume those symbols exist on 3.0, where they don't.
To weak-link a framework, find your application target in Xcode, inspect it, and go to the General tab. At the bottom of that tab should be a list of frameworks, with a column for Type. Change the Type for UIKit from Required to Weak and rebuild your application. That should take care of the runtime errors.
Your conditional logic is sound, but I tend to share an application delegate and do the interface-specific layout further down the line.
(Update: 12/21/2011) As of iOS 4.2, you should no longer need to weak link frameworks to prevent errors like this. As Marco Arment describes, if you build with iOS 4.2 or later and target down to iPhone OS 3.1+, individual classes are now weak linked and should have their +class method return nil if the class does not exist on the currently running version of the OS.

I was having a very similar error and it was driving me nuts! :-) Searching for hours and couldn't figure it out...
Like you said, everything was fine when running in the iPad Simulator but when trying to test the App on the iPhone with iPhone OS 3.1.2 it would not even start but crash with the following error message:
mi_cmd_stack_list_frames not enough frames in stack
By checking nearly every line of code I realised that the allocating of 3.2 classes like UIPopoverController or UISplitViewController (already inside forked iPad-specific code) was causing the problem.
So instead of i.e.:
infoPopover = [[UIPopoverController alloc] initWithContentViewController: infoNavController];
i would write
infoPopover = [[NSClassFromString(#"UIPopoverController") alloc] initWithContentViewController: infoNavController];
and that solved my problem! (Debugging can be so hard if the error message gives you no clue about where the bug could possibly be found...)

Xcode 8.3, iPad 2 (non retina), Swift 3 code
What helped for me was:
restart Xcode
do a 'Product -> Clean' ShiftCommandK
rebuild the project

Related

Alamofire installation problem on testing iPhone

Hello I installed Alamofire 5.0 via pod and I try to run it on the real phone.
The project is empty only Alamofire and a contentView say hello world.
if a run it on simulator it work perfect, if I run on the real phone I get the following warning. (I authorized in general setting the app)
any solution? I don't know what is this
/private/var/containers/Bundle/Application/C526B7F7-4337-4D36-A9EB-C56913D97329/FlyWeatherX.app/Frameworks/Alamofire.framework/Alamofire: code signature invalid for '/private/var/containers/Bundle/Application/C526B7F7-4337-4D36-A9EB-C56913D97329/FlyWeatherX.app/Frameworks/Alamofire.framework/Alamofire'
thanks for the help
Check the version of your ios on your phone is it matching the version of ios on xCode or not.
also if your iphone under ios 13 then
first - choose from xcode your exact iphone version from the building tap
second - delete the SceneDelegate file and then go to AppDelegate and remove the last two functions then before the first function just implement the view by writing :-> var window: UIWindow?
then run the project and see what is the next ..

App Created with ios4 is crashing in ios6 and not installing

My App, which is created for iOS4, is crashing in iOS6 and is not installing on simulator or device.
It just shows the splash screen and crashes.
Did finish Launching is not being called.
Can anybody please Help?
Finally i got the solution of my problem mentioned above.
In my ios4 App, in FirstViewController.xib "Use AutoLayout" was checked.
I just removed the checkmark and my App start working.
Amazing!!!
I would recommend creating a new project, and either carefully looking for the changes in delegate or any deprecated code, or just moving all of your code to the new project. Also, you should run a convert to modern syntax check.
There may be issue with Application Delegate. The obvious reason - your object is not set as an application delegate.
Looking at Apple documentation there is quite a few ways to accomplish it:
Remove application delegate binding in Interface Builder (.xib file
for the window) Set 4th parameter of UIApplicationMain in main.h to
something else than nil.
Check you nib file in Interface Builder and see if the App Delegate is setup.
Or Reference to documentation Core Application Design
Hope this will you out.
Look into the release notes of xcode, ios6
It is said that when working with IOS6, Auto Layout is turned on and that crashes the app if used on older versions. Check the link, which has other things to watch out for:
https://developer.apple.com/library/mac/#releasenotes/DeveloperTools/RN-Xcode/_index.html
https://developer.apple.com/library/ios/#releasenotes/General/RN-iOSSDK-6_0/_index.html

Weird three20 graphics bug in thumb viewer when running in release mode

I've just encountered the strangest problem with the three20 thumbs viewer.
When running in debug, my TTThumbsViewController works completely normally, however if I switch to release mode (ad-hoc and on the live app store version), I get some pretty weird graphical glitches.
For example, the loading view of the thumb controller:
http://img.skitch.com/20120125-kugx5diqbs8sttnxatrppf4rjg.jpg
And then all my thumbnails get squashed:
http://img.skitch.com/20120125-mi3mpkr1j1s9f79fdf9r3krjhs.jpg
I'm running the latest (master) version of three20, and have only made one slight modification to the source, to stop the header bar appearing at the top of the gallery view.
I added the following method to TTTableViewDelegate.m:
- (float)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 0; // disable headers in TTTableViews - prevents header on thumbs view in iOS 5
}
In conclusion:
Can anyone repro (with release)?
What can I do?
Would that modification I made be causing these issues (bear in mind it only happens with the release build)?
If anyone has any ideas that would be great as this is currently live on the app store (I know I'm an idiot for not testing with release - this should teach me).
The problem is with the LLVM compiler bundled with Xcode 4.2 when compiling for armv6 devices on iOS 4.2.1.
The problem and solution are described here:
Strange layout issue on 3GS device with iOS 4.2.1 - Compiled with iOS 5
You need to add the -mno-thumb flag to your compiler flags for armv6 i.e.
Method with setting -mno-thumb in MY PROJECT SETTINGS didn't worked for me, But this is exactly issue of the
LLVM compiler bundled with Xcode 4.2 when compiling for armv6 devices
Fast way to do this is to update little Three20's Library.xconfig, which is located in
Three20/src/Configurations/common folder
Find the line for linker flags configuration, and add line with -mno-thumb to it.
// Linker Flags
OTHER_LDFLAGS = $(OBJC_LIBRARY)
// We needed this to resolve horrible bug
// When your'e setting value on origin.x and it is applied to origin.y
OTHER_CFLAGS[arch=armv6] = -mno-thumb
Profit.

iphone Simulator crash?

I'm develop app for iPhone & iPod and during developing app i used simulator 3.2(iPad) it runs perfectly but when I want to my app on simulator 3.1.3 it generate one error I remove this error by comment this line //self.clearsSelectionOnViewWillAppear = NO;
and build project successfully but run app on simulator 3.1.3 when i clicking on button it goes on another screen on 3.2 simulator perfectly & crash on 3.1.3
what i do for come out from it.
The docs for UITableViewController clearly state that clearsSelectionOnViewWillAppear is available on iOS 3.2 and above. It crashes in 3.1.3 because this property does not exist in 3.1.3 (you can easily surmise this from reading the documentation for the property that you have already discovered is causing the issue, or from looking at the error message which will indicate that the object does not respond to a selector for setClearsSelectionOnViewWillAppear.
Before setting this, you can check for this property and then set it, otherwise your older code can just be supported as is, or you could do something more advanced and add the property in pre-3.2 environments.
To check for the code, you do something like this:
if( [UITableViewController instancesRespondToSelector:#selector(setClearsSelectionOnViewWillAppear:)] ) {
// This is 3.2+ so we can use this property
[self setClearsSelectionOnViewWillAppear:NO];
} else {
// This is something earlier than 3.2, so we ignore it
NSLog(#"will clear selection: pre-3.2");
}
Can you explain your question more clearly?
My dear friend,
You should read the Apple documentation more attentively,
It is clearly stated that
clearsSelectionOnViewWillAppear
is a method available from iPhone OS 3.2 and later,you are trying to use it in 3.1.3.
So the result is obvious.
clearsSelectionOnViewWillAppear
A Boolean value indicating if the controller clears the selection when the table appears.
#property(nonatomic) BOOL clearsSelectionOnViewWillAppear
Discussion
The default value of this property is YES. When YES, the table view controller clears the table’s current selection when it receives a viewWillAppear: message. Setting this property to NO preserves the selection.
Availability
Available in iPhone OS 3.2 and later.
Declared In
UITableViewController.h
Thanks

How to make iAds work on a 3.0 + iPhone-iPad app?

I created a universal app for the iPhone-iPad. I'm only working on the iPhone part at the moment. In the header file for the view controller for the iPhone one, I import the adbanner header and create an adbannerview variable with a matching property. I don't make it in the nib file but rather check at run time if the class exists, if it does, I create an adbanner programmily and then attach the adbannerview variable to it so I can refer to it inside other functions. Everything works on the 4.0 simulator. I also weak linked the iad class.
So if I take the same code to an earlier version of xcode and try to run using the 3.0 sim, it gives all these errors saying I can't import the header and make the adbannerview variable and the property, how do I get around this?
Thanks. If you need more details or my code, just ask.
The AdLib Framework and iAds are only available in iOS > 4.0. For example, see the docs for ADBannerView:
Availability Available in iOS 4.0 and
later.
If you are trying to build the app on an older version of the sdk (not just run the binary on a older device) and are getting errors when you try to import the headers like your question suggests, you could try wrapping the imports that fail in a #ifdef directive that tests for the availability macros from Availability.h, something like:
#ifdef __IPHONE_4_0
// iOS 4 specific imports here
#endif