首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOs -如何通过url将数据从Widget (Today Extension)传递到App?

iOs -如何通过url将数据从Widget (Today Extension)传递到App?
EN

Stack Overflow用户
提问于 2016-10-18 20:31:59
回答 2查看 2.1K关注 0票数 1

我正在尝试开发一个小部件(今天的扩展),它传递给主应用程序一堆数据。

我在info.plist中添加了这个

代码语言:javascript
复制
<key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>TodayWidget</string>
            </array>
            <key>CFBundleURLName</key>
            <string>xxx.xxx.xxx</string>
        </dict>
    </array>

我使用下面的代码从小部件(成功地)调用了应用程序

代码语言:javascript
复制
    let url = URL(string:"TodayWidget://?key=value")
    self.extensionContext?.open(url!, completionHandler: nil)

如何访问这些值?

我也看到了这一点,但xcode警告我代码已被弃用

Pass data between two Apps by url scheme in swift?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2016-10-27 10:39:33

首先,你的方案用法是错误的。CFBundleURLSchemes是从外部引用您的应用程序,而不是专门为您的扩展设计的。更好的用法是:

代码语言:javascript
复制
let url = URL(string:"yourAppName://TodayWidget?key=value")
let url = URL(string:"yourAppName://action?param1=value1&param2=value2")

然后,您可以确定源或操作...下面是从参数中获取字典的代码(url来自application:openURL)

根据您的需要调整验证。

代码语言:javascript
复制
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]);
票数 1
EN

Stack Overflow用户

发布于 2017-03-21 20:42:02

试试这个:

代码语言:javascript
复制
 let url = URL(string:"TodayWidget://value")
 self.extensionContext?.open(url!, completionHandler: nil)

Containing App中访问value

AppDelegate中,编写此方法:

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40108356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档