2

这几乎是一个概念验证应用程序。当我使用以下方法启动另一个应用程序时,我试图简单地传递一个 NSArray 值:

UIApplication *test = [ UIApplication sharedApplication ];
BOOL found =
[ test openURL:[ NSURL URLWithString:@"myCalculator://data" ] ];

我想用包含三个整数的 NSArray 替换“数据”。在 myCalculator 中,我在委托中实现了这些方法:

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation     {

    NSLog(@"Open application called in calculator");
    return [ self application:application handleOpenURL:url ] ;
}

// Depracted
- (BOOL)application:(UIApplication *)application
     handleOpenURL:(NSURL *)url {
    NSLog(@"%@",application.debugDescription);
    return YES;
}
@end

当我从另一个应用程序打开 URL 时,确实会调用它。所以,我不得不提问。如何对 NSArray 进行编码并在打开自定义 URL 时将其传入?而且,如何在上述 appDelegate 方法中对其进行解码?

任何帮助将不胜感激。我在文档中找不到任何关于如何对 NSArray 进行编码以传递到自定义 URL 方案或在接收端对其进行解码的内容。

另外,我是初学者,所以越详细越好。

4

2 回答 2

2

一种选择是构建查询字符串:

NSMutableString *query = [NSMutableString string];
for (id val in myArray) {
    if (query.length) {
        [query appendString:@"&"];
    [query appendFormat:@"v=%@", val];
}

NSString *urlStr = [@"myCalculator://data?" stringByAppendingString:query];
NSURL *url = [NSURL URLWithString:urlStr];

URL 将如下所示:

myCalculator://data?v=1&v=2&v=3

其中 1, 2, 3 将是数组中的实际值。

在该handleOpenURL方法中,您需要解析此 URL 以获取值。

NSString *query = [url query];
NSArray *parts = [query componentsSeparatedByString:@"&"];
NSMutableArray *values = [NSMutableArray array];
for (NSString *part in parts) {
    NSRange equal = [part rangeOfString:@"="];
    NSString *value = [part substringFromIndex:equal.location + equal.length];
    [values addObject:value]; // If you want the value as a string
    [values addObject:[NSNumber numberWithInt:[value intValue]]]; // If you want the value as a number
}

现在该values数组具有从其他应用程序传递的值。

于 2013-10-11T16:31:31.553 回答
1

您需要将 Array 转换为字符串,然后在另一个应用程序上执行相反的操作。

     NSString *Array2String = [myArray componentsJoinedByString:@"|"];
     NSArray *String2Array = [Array2String componentsSeparatedByString:@"|"];

当然,您需要仔细选择一个字符串,该字符串将用作您不会在现有数组中使用的标记(如果它包含字符串值)

于 2013-10-11T16:31:24.663 回答