我将 handleOpenURL() 用于自定义 URL 方案,以从电子邮件中的链接启动我的应用程序。完美运行,我可以根据链接中的 URL 参数在我的应用程序中做一些事情。
问题是当我的应用程序冷启动(不在后台运行)时,handleOpenURL() 似乎没有被调用。是否有另一个处理程序可用于冷启动与已经运行的实例?
或者
是否有一个我可以读取的全局变量来告诉我调用 URL 是什么?我读过关于invokeString,但似乎从未设置过?
我正在使用 PhoneGap 2.0
我将 handleOpenURL() 用于自定义 URL 方案,以从电子邮件中的链接启动我的应用程序。完美运行,我可以根据链接中的 URL 参数在我的应用程序中做一些事情。
问题是当我的应用程序冷启动(不在后台运行)时,handleOpenURL() 似乎没有被调用。是否有另一个处理程序可用于冷启动与已经运行的实例?
或者
是否有一个我可以读取的全局变量来告诉我调用 URL 是什么?我读过关于invokeString,但似乎从未设置过?
我正在使用 PhoneGap 2.0
如果你仔细阅读 application:handleOpenURL 方法上面的注释,你可能会明白:
// 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
如果应用程序未运行,则不会调用此方法。我的解决方案是通过以下更改调整项目:
主视图控制器.h
@interface MainViewController : CDVViewController
@property (nonatomic, retain) NSString *URLToHandle;
@end
主视图控制器.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;
[...]
}
希望有帮助。
西里尔
附加说明:测试时请确保停止 xcode。当 xcode 运行时,应用程序会抛出异常。如果我停止 xcode,这个解决方案可以正常工作。
顺便说一句,如果有人遇到这种情况,唯一缺少的是URLToHandle
在AppDelegate
(.h 和 .m) 中定义的方式与在 .h 中定义的方式相同MainViewController
。
而且您还必须AppDelegate.m
从以下位置撤消分配:
((MainViewController *)self.viewController).URLToHandle = URLToHandle;
至:
NSString* jsString = [NSString stringWithFormat:@"window.setTimeout(function() {handleOpenURL(\"%@\"); },1);", url];
((MainViewController *)self.viewController).URLToHandle = jsString;
您基本上必须将 url 从转移AppDelegate
到MainViewController
.
setTimeout
很关键,否则它不起作用。