最终我尝试通过以下方式从小部件启动主应用程序
UIApplication.SharedApplication.OpenUrl(new NSUrl("MyURLScheme//"));
所以我有一个带有 Today 扩展的 iOS 应用程序。我想访问我的主应用程序的 URL 方案。那可能吗?我的 URL 方案位于主应用程序的 Plist 文件内,而不是我的 Today 扩展。我可以只引用主应用程序中的那个吗?我尝试从 CFBundleURLTypes 和 CFBundleURLSchemes 获取它,但它们都显示为“null”。 可能是因为它正在查找小部件的 Plist,而不是主应用程序的 Plist。
var asdf2 = NSBundle.MainBundle.InfoDictionary["CFBundleURLTypes"];
var asdf3 = NSBundle.MainBundle.InfoDictionary["CFBundleURLSchemes"];
这是主应用程序 Plist 文件中 URL 方案所在位置的屏幕截图。我不想在今天的扩展的 Plist 文件中存储重复的信息。而且我也不想将 URL 方案硬编码到今天的扩展代码中。
您可以参考以下网址 堆栈溢出
extension Bundle {
static let externalURLSchemes: [String] = {
guard let urlTypes = main.infoDictionary?["CFBundleURLTypes"] as? [[String: Any]] else {
return []
}
var result: [String] = []
for urlTypeDictionary in urlTypes {
guard let urlSchemes = urlTypeDictionary["CFBundleURLSchemes"] as? [String] else { continue }
guard let externalURLScheme = urlSchemes.first else { continue }
result.append(externalURLScheme)
}
return result
}()
}
会是这样的(丑陋的):
var arr = (NSBundle.MainBundle.InfoDictionary["CFBundleURLTypes"] as NSMutableArray);
var urlTypes = arr.GetItem<NSDictionary>(0);
var schemes = urlTypes.ObjectForKey(new NSString("CFBundleURLSchemes")) as NSMutableArray;
var scheme = schemes.GetItem<NSString>(0).ToString();
您可能需要为您的应用程序和扩展程序创建一个
App Group
,这将允许您将要在两者之间共享的 plist 或任何其他文件放入磁盘上的共享位置。
这里有一篇文章解释了这是如何完成的: https://learn.microsoft.com/en-us/xamarin/ios/app-fundamentals/file-system#configure-an-app-group
extension Bundle {
static let externalURLSchemes: [String] = {
guard let urlTypes = main.infoDictionary?["CFBundleURLTypes"] as? [[String: Any]],
let urlSchemesDictionary = urlTypes.first(where: { $0["CFBundleURLSchemes"] != nil }),
let urlSchemes = urlSchemesDictionary["CFBundleURLSchemes"] as? [String]
else {
return []
}
return urlSchemes
}()
}