使用自定义URL方案将NSArray传递给其他应用程序的语法

时间:2013-10-11 16:20:25

标签: ios objective-c

这几乎是概念应用的证明。当我使用以下命令启动其他应用程序时,我试图简单地传递NSArray值:

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

我想用包含三个整数的NSArray替换“data”。在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时,确实会调用它。所以,我有问题。当我打开自定义URL时,如何编码NSArray并将其传入?而且,我如何在上面的appDelegate方法中解码它?

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

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

2 个答案:

答案 0 :(得分: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];

网址如下:

  

myCalculator://数据V = 1&安培; V = 2及V = 3

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

handleOpenURL方法中,您需要解析此网址以获取值。

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数组已经从另一个应用程序传递了您的值。

答案 1 :(得分:1)

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

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

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