【问题标题】:iOs - How to pass data from Widget (Today Extension) to App with url?iOs - 如何通过 url 将数据从小部件(今日扩展)传递到应用程序?
【发布时间】:2016-10-18 12:31:59
【问题描述】:

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

我在 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?

谢谢!

【问题讨论】:

    标签: ios iphone swift widget today-extension


    【解决方案1】:

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

    let url = URL(string:"yourAppName://TodayWidget?key=value")
    let url = URL(string:"yourAppName://action?param1=value1&param2=value2")
    

    然后您可以确定来源或操作... 这是从您的参数中获取字典的代码(网址来自应用程序: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]);
    

    【讨论】:

      【解决方案2】:

      试试这个:

       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
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-19
        • 2012-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        相关资源
        最近更新 更多