iOS共享扩展加载时控制台出现红色背景提示信息问题咨询
iOS共享扩展控制台红色提示问题解析
问题场景
在iOS中实现共享扩展时,运行以下代码虽能成功提取文本,但控制台会出现带红色背景的提示信息:
class ShareViewController: UIViewController{ override func viewDidLoad() { super.viewDidLoad() guard let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem, let itemProvider = extensionItem.attachments?.first else { close() return } if itemProvider.hasItemConformingToTypeIdentifier("public.plain-text"){ itemProvider.loadItem( forTypeIdentifier: "public.plain-text" as String, options: nil, completionHandler: { (data, error) in if let stringContent = data as? String{ DispatchQueue.main.async { print( "found string:\(stringContent)") } } }) } } @objc func close() { self.extensionContext?.completeRequest(returningItems: [], completionHandler: nil) } }
控制台提示内容:
-[_EXSinkLoadOperator loadItemForTypeIdentifier:completionHandler:expectedValueClass:options:] nil expectedValueClass allowing {( NSNumber, NSDictionary, NSArray, NSError, NSValue, NSDate, NSURL, _EXItemProviderSandboxedResource, UIImage, NSUUID, NSData, NSString )}
原因分析
这个红色提示属于系统兼容性警告,根源是你调用的loadItem(forTypeIdentifier:options:completionHandler:)是旧版API。在iOS 14及以上的共享扩展环境中,苹果更推荐使用带expectedValueClass参数的重载方法——loadItem(forTypeIdentifier:expectedValueClass:options:completionHandler:)。
旧版API没有明确指定期望的返回值类型,系统会打印允许的返回值类型列表(提示中的各类)来提醒开发者:当前调用存在模糊性,建议迁移到更明确的新API。
解决方法
修改loadItem的调用代码,使用带expectedValueClass参数的重载方法,明确指定期望的返回值类型为NSString.self(Swift中也可直接用String.self),即可消除该提示:
if itemProvider.hasItemConformingToTypeIdentifier("public.plain-text"){ itemProvider.loadItem(forTypeIdentifier: "public.plain-text", expectedValueClass: NSString.self, options: nil) { (data, error) in if let stringContent = data as? String{ DispatchQueue.main.async { print("found string:\(stringContent)") } } } }
明确指定类型后,系统不再需要输出模糊性警告,功能也能正常运行。
内容的提问来源于stack exchange,提问作者reza23
相关产品推荐
相关产品推荐

