0

The easiest way for me to explain this is to upload a test app, so I've stripped out everything that is unecessary and uploaded a bare bones project to SendSpace.

http://www.sendspace.com/file/z86g0z

I'm writing an app that will receive custom URL's from Mobile safari like "plasma://hello-world". These are then processed by my app and it displays a notification on screen.

In the test app the main class is a singleton and there is a "test" button this demonstrates what should happen when you open it via a URL. You get the custom link shown in a label on the screen and a green notification label at the top which then fades away. During this process the Xcode console shows this .....

2012-09-05 21:53:29.719 PlasmaLinker[2866:f803] Link: plasma:Test+Link
2012-09-05 21:53:29.778 PlasmaLinker[2866:f803] Show Alert: Success - Link Received
2012-09-05 21:53:35.779 PlasmaLinker[2866:f803] Remove Alert

All works fine.

Now I launch it from Mobile Safari by entering "plasma://hello-world" I hit enter and Safari switches to my app, the console shows EXACTLY the same output (with what ever URL you launch it with), however I get nothing in the UI at all. The link isn't placed in the text box, the notification is never shown.

What am I doing wrong? After its been launched with the URL you can again click the test button and see the UI elements change as desired. Its driving me nuts but I don't know enough to be able to get it to work when launched by a URL. Can someone please shed some light on this?

Kind Regards

Plasma

Plasma
  • 2,622
  • 2
  • 20
  • 35

1 Answers1

1

Your singleton method that gets the PlasmaLinker_ViewController is returning a different instance to the one that is created by the storyboard and added to the main window.

One example that works, (in your app delegate)

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {

    NSString *link = [NSString stringWithFormat:@"%@",url];
    vc = (PlasmaLinker_ViewController*) self.window.rootViewController;
    [vc processLink:link];

    return YES;

}

Another option is to override the view controller's -(id)initWithCoder:(NSCoder *)decoder and set your shared instance to self in that method.

+ (PlasmaLinker_ViewController *) sharedInstance
{
    return _sharedInstance;
}

-(id)initWithCoder:(NSCoder *)decoder {

    NSLog(@"In initWithCoder!");
    if (!_sharedInstance) {
        if (self = [super initWithCoder:decoder]) {
            _sharedInstance = self;
        }
    }
    return _sharedInstance;
}
danielbeard
  • 9,120
  • 3
  • 44
  • 58
  • Daniel, thanks very much for this, I'm still confused as I thought the whole point of a singleton was that you only got a single instance. But anyway its working as desired now, thanks very much! :) – Plasma Sep 10 '12 at 08:49
  • Your singleton was only returning one instance, but when you use storyboards, there is some automatic initialisation behind the scenes. The automatically allocated instance was different to the single instance that you were getting with your singleton. – danielbeard Sep 10 '12 at 23:48