2012-09-20 11 views
5

Używam handleOpenURL() dla niestandardowego schematu URL, aby uruchomić aplikację z linku w wiadomości e-mail. Działa doskonale i mogę robić rzeczy w mojej aplikacji na podstawie parametrów URL w linku.Jak mogę obsłużyć niestandardowy schemat URL w PhoneGap na zimny start?

Problem to handleOpenURL() nie wydaje się otrzymywać połączenia, gdy moja aplikacja ma zimny start (nie działa w tle). Czy istnieje inny program obsługi, którego można użyć do zimnego startu w stosunku do już działającej instancji?

LUB

Czy istnieje zmienna globalna, że ​​mogę przeczytać, że powie mi, co było URL invoke? Czytałem o invokeString, ale nigdy nie wydaje się, że został ustawiony?

Używam PhoneGap 2.0

+0

mając ten sam problem w cordova 3.5 (tak, minęły lata, przypuszczam, że zostało to naprawione w niektórych wersjach). Teraz iOS przestarzałe handleOpenUrl itp., Nadal jednak poprawna odpowiedź poniżej powinna działać. – mentat

Odpowiedz

3

jeśli uważnie przeczytać komentarz powyżej aplikacji: metodą handleOpenURL, prawdopodobnie będzie zrozumieć:

// this happens while we are running (in the background, or from within our own app) 
// only valid if Calinda-Info.plist specifies a protocol to handle 
- (BOOL) application:(UIApplication*)application handleOpenURL:(NSURL*)url 

Te metody nie zostanie wywołana, gdy wniosek nie jest bieganie. Moje rozwiązanie było dostosować projekt z następującymi zmianami:

MainViewController.h

@interface MainViewController : CDVViewController 
@property (nonatomic, retain) NSString *URLToHandle; 
@end 

MainViewController.m

- (void) webViewDidFinishLoad:(UIWebView*) theWebView 
{ 
    if (self.URLToHandle) 
    {   
     NSString* jsString = [NSString stringWithFormat:@"window.setTimeout(function() {handleOpenURL(\"%@\"); },1);", self.URLToHandle]; 
     [theWebView stringByEvaluatingJavaScriptFromString:jsString]; 
    } 
    [...] 
} 

- (void)dealloc 
{ 
    self.URLToHandle = nil; 
    [super dealloc]; 
} 

@synthesize URLToHandle; 

AppDelegate.m

- (BOOL) application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions 
{ 
    [...] 
    self.viewController = [[[MainViewController alloc] init] autorelease]; 
    self.viewController.useSplashScreen = YES; 
    self.viewController.wwwFolderName = @"www"; 
    self.viewController.startPage = @"index.html"; 
    self.viewController.view.frame = viewBounds; 

    // Patch for handleOpenURL 
    ((MainViewController *)self.viewController).URLToHandle = URLToHandle; 

    [...] 
} 

nadzieję, że pomoże.

Cyril

dodatkowe Uwaga: podczas testowania upewnij się zatrzymać Xcode. Gdy uruchomiono xcode, aplikacja wyrzuciłaby wyjątek. jeśli zatrzymam kod xcode to rozwiązanie działa dobrze.

+1

Otrzymuję błąd ("niezadeklarowany identyfikator: URLToHandle") w AppDelegate.m z tym rozwiązaniem. Każdy pomysł, dlaczego? – bearfriend

3

Przy okazji, czy ktoś prowadzi do tego, Brakuje tylko jest określenie URLToHandle w AppDelegate (.h i .m) taki sam sposób, w jaki został zdefiniowany w MainViewController.

A także trzeba odwrócić przypisanie w AppDelegate.m od:

((MainViewController *)self.viewController).URLToHandle = URLToHandle; 

do:

NSString* jsString = [NSString stringWithFormat:@"window.setTimeout(function() {handleOpenURL(\"%@\"); },1);", url]; 
((MainViewController *)self.viewController).URLToHandle = jsString; 

Państwo mają zasadniczo przenieść URL z AppDelegate do MainViewController.

setTimeout jest krytyczna, w przeciwnym razie nie działa.

+0

Nie jestem w stanie sprawić, żeby to zadziałało. Czy mógłbyś wstawić ostateczny fragment kodu do wstawienia w appdelegate i mvc. Dzięki.. – vigneshre

Powiązane problemy