7

我正在编写一个使用 JQM 和 Phonegap 部署在 iOS 上的应用程序,我需要它通过处理对象“window.location.search”来读取输入参数,就像一个常见网站的 url 参数在 javascript 中所做的那样

在我的情况下,该应用程序将从网站启动,如下所示:

<a href="myapp://?arg1=1&arg2=2"> My App </a>

这正在工作,我已经可以调用我的应用程序,我现在需要的是读取参数 arg1、arg2 等。我尝试读取 window.location.search 但没有运气。

我怎样才能做到这一点?我需要编写一些Objective C 代码吗?

任何建议,将不胜感激。

谢谢。

4

5 回答 5

6

使用此链接的内容解决了我的问题:https ://gist.github.com/859540

代码是:

Objective-c部分:

在 MainViewController.m 中:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // perform any custom startup stuff you need to ...
        // process your launch options
    NSArray *keyArray = [launchOptions allKeys];
    if ([launchOptions objectForKey:[keyArray objectAtIndex:0]]!=nil) 
    {
               // we store the string, so we can use it later, after the webView loads
        NSURL *url = [launchOptions objectForKey:[keyArray objectAtIndex:0]];
        self.invokeString = [url absoluteString];
        NSLog(@amp;" launchOptions = %@",url); // if you want to see what is happening
    }
    // call super, because it is super important ( 99% of phonegap functionality starts here )
    return [super application:application didFinishLaunchingWithOptions:launchOptions];
}


- (void) webViewDidFinishLoad:(UIWebView*) theWebView 
{
     // only valid if ___PROJECTNAME__-Info.plist specifies a protocol to handle
     if (self.invokeString)
     {
        // this is passed before the deviceready event is fired, so you can access it in js when you receive deviceready
        NSString* jsString = [NSString stringWithFormat:@"var invokeString = \"%@\";", self.invokeString];
        [theWebView stringByEvaluatingJavaScriptFromString:jsString];
     }

     // Black base color for background matches the native apps
     theWebView.backgroundColor = [UIColor blackColor];

    return [super webViewDidFinishLoad:theWebView];
}

在使用 cordova-1.7.0 的 index.html 文件中:

function onDeviceReady()
    {
        alert(invokeString);
    }

警报返回:myapp://?arg1=1&arg2=2

只是用来调用它的相同字符串...... :)

于 2012-09-16T01:29:59.910 回答
2

我遇到了同样的问题,这些答案中的所有内容都令人困惑和额外的信息。

通过 2 个简单的步骤了解和解决问题:

  1. 信息丰富(如果您不关心后台发生的情况,可以跳过):转到项目的 Clases 文件夹中的 AppDelegate.m 并搜索“handleOpenUrl”,您应该会注意到那里的一些代码,其中包含解释发生了什么的注释。我不知道objective-c,但直观地说,那里的代码会查找window.handleOpenURL 函数并将其称为给它调用的url 的参数(例如'myapp:///?parameter=value')

  2. 基本上你所要做的就是全局(在窗口对象中)定义函数handleOpenURL

    function handleOpenURL (url) {
        alert(url);
    }
    

请注意,这仅在您的应用程序打开时执行

<a href="myapp://">..</a>
于 2013-11-26T12:23:44.690 回答
0

window.location 将是您的 phonegap index.html 文件的位置,而不是用于启动您的应用程序的 URL。

一些网络搜索表明有一个函数称为:

function handleOpenUrl(url) {
   alert("opened from url " + url);
}

.. 可能会自动调用 . 不过,我这里没有我的开发机器来测试,对不起!

如果这在 Objective-C 中不起作用,请检查 AppDelegate.m 的 handleOpenUrl 方法,当您的应用程序使用 URL 方案打开时,该方法会被调用。

于 2012-09-14T21:17:59.773 回答
0

您应该在 obj-c 中执行此操作,然后使用插件将其传递给 javascript 代码:首先在 obj-c 中执行此操作,您应该实现

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    NSURL *urlToParse = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
        if (urlToParse) {
            [self application:application handleOpenURL:urlToParse];
        } 
        return YES;
}

然后你可以访问这样的参数:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    if ([[url scheme] isEqualToString:@"myapp"]) {
        //in here you do whatever you need the app to do
        // e.g decode JSON string from base64 to plain text & parse JSON string
    }
 return YES; //if everything went well
}
于 2012-09-15T07:20:16.423 回答
0
function getParameterByName(name)
{
  name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
  var regexS = "[\\?&]" + name + "=([^&#]*)";
  var regex = new RegExp(regexS);
  var results = regex.exec(window.location.href);
  if(results == null)
     return "";
  else
     return results[1];
  }
Call this function like var para1 = getParameterByName("para1"); 
on pageshow event in jquery mobile.
$('#page').on('pageshow',function(event){
   var para1 = getParameterByName("para1");
});
于 2013-09-30T13:41:38.010 回答