我正在尝试开发一个小部件(今天的扩展),它传递给主应用程序一堆数据。
我在info.plist中添加了这个
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>TodayWidget</string>
</array>
<key>CFBundleURLName</key>
<string>xxx.xxx.xxx</string>
</dict>
</array>我使用下面的代码从小部件(成功地)调用了应用程序
let url = URL(string:"TodayWidget://?key=value")
self.extensionContext?.open(url!, completionHandler: nil)如何访问这些值?
我也看到了这一点,但xcode警告我代码已被弃用
Pass data between two Apps by url scheme in swift?
谢谢!
发布于 2016-10-27 10:39:33
首先,你的方案用法是错误的。CFBundleURLSchemes是从外部引用您的应用程序,而不是专门为您的扩展设计的。更好的用法是:
let url = URL(string:"yourAppName://TodayWidget?key=value")
let url = URL(string:"yourAppName://action?param1=value1¶m2=value2")然后,您可以确定源或操作...下面是从参数中获取字典的代码(url来自application:openURL)
根据您的需要调整验证。
if (!url) return NO;
if ([url.absoluteString rangeOfString:@"://"].location == NSNotFound) return NO;
if ([url.absoluteString rangeOfString:@"?"].location == NSNotFound) return NO;
NSMutableDictionary* queryString = [NSMutableDictionary dictionaryWithCapacity:1];
__block NSMutableDictionary* paramDict = [[NSMutableDictionary alloc]init];
[paramDict setValue:[url scheme] forKey:@"protocol"];
[paramDict setValue:[url absoluteString] forKey:@"url"];
[paramDict setValue:[[url.absoluteString componentsSeparatedByString:@"://"][1] componentsSeparatedByString:@"?"].firstObject forKey:@"path"];
[paramDict setValue:queryString forKey:@"parameters"];
NSString* urlString = [url.absoluteString stringByRemovingPercentEncoding];
NSString* paramString = [urlString componentsSeparatedByString:@"?"][1];
NSArray* params = [paramString componentsSeparatedByString:@"&"];
for (NSString* param in params)
{
NSArray* paramArray = [param componentsSeparatedByString:@"="];
if (paramArray.count != 2) {
NSLog(@"Malformated url:%@", urlString);
continue;
}
NSString* key = paramArray[0];
NSString* value = paramArray[1];
if (!key.length | !value.length) {
NSLog(@"Malformated key %@ value %@ in url:%@", key, value, urlString);
continue;
}
[queryString setValue:value forKey:key];
}
NSLog(@"%@", [paramDict toJSONString]);发布于 2017-03-21 20:42:02
试试这个:
let url = URL(string:"TodayWidget://value")
self.extensionContext?.open(url!, completionHandler: nil)在Containing App中访问value
在AppDelegate中,编写此方法:
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool
{
if url.scheme == "NearbyRestaurantsTodayExtension"
{
if let value = url.host
{
//TODO: Write your code here
}
}
return true
}https://stackoverflow.com/questions/40108356
复制相似问题