2016-10-18 1 views
1

저는 메인 앱에 많은 데이터를 전달하는 위젯 (오늘 확장 기능)을 개발하려고합니다.iOs - 위젯 (오늘 확장 프로그램)의 데이터를 URL과 함께 앱에 전달하는 방법은 무엇입니까?

나는이의 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) 

과 (성공적으로) 위젯에서 응용 프로그램을 호출? 그 코드는

Pass data between two Apps by url scheme in swift?

감사를 을

를 더 이상 사용되지 않습니다

은 또한 이것을보고 있지만, 엑스 코드 나 경고!

답변

0

첫 번째 구성표 사용법이 잘못되었습니다 ... CFBundleURLSchemes는 외부에서 응용 프로그램을 참조하기위한 것이고 특별히 확장 프로그램을위한 것이 아닙니다. 더 나은 사용은 다음과 같습니다

에 대한 검증을 적용 :

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

는 다음 소스 또는 조치를 식별 할 수 ... 여기에 PARAMS (의 OpenURL URL이 응용 프로그램입니다)에서 사전을 얻을 코드입니다 너의 요구.

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]); 
0

이 시도 :

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 
} 
: AppDelegate에서

는이 방법을 쓰기 :

let url = URL(string:"TodayWidget://value") 
self.extensionContext?.open(url!, completionHandler: nil) 

valueContaining App에 액세스하려면

관련 문제