我需要在我的应用程序的共享扩展中访问 keyWindow
- 添加一些指示器视图
- 访问窗口的宽度和高度
我在共享扩展类中编写了以下行:
UIWindow *mainWindow = [[UIApplication sharedApplication] keyWindow];
Run Code Online (Sandbox Code Playgroud)
但是,它说“sharedApplication”不可用。
如何访问共享扩展中的 keyWindow?
需要您的宝贵建议。
提前致谢
ios ios8 ios-app-extension ios8-share-extension ios8-extension
我想访问主应用程序资源文件夹,以便共享资产而不是复制它们并增加应用程序包的大小。
默认情况下,扩展进程也没有访问主资源文件夹的权限。
可以将它们从主应用程序复制到组容器中,但如果扩展程序在主应用程序之前运行,则它将无法工作。
是否可以向扩展进程添加访问主应用程序捆绑文件的权限?
我注意到有关为 iOS 10 创建消息应用程序的不同之处。
如果您使用iMessage Application新项目模板上的选择创建一个新项目,Xcode 将创建两个目标,一个应用程序和一个扩展。
但该项目无法运行。
(通过第二张图片,底部的目标选择器上只有一个选择,该目标是扩展名)。
当你创建一个普通的应用程序,比如一个单一视图的应用程序,然后添加一个 iMessage 类型的应用程序扩展的目标时,你将在那里有两个目标,应用程序和扩展程序。
我的问题是:
Xcode iMessage 的模板实际上只是创建了一个扩展,对吗?不是应用程序加上扩展程序,对吗?
如果这是真的,那么为什么 Xcode 会创建应用程序目标呢?如果应用程序目标.app实际上不是应用程序并且永远不会运行,那么让应用程序目标编译并显示在带有扩展名的产品部分的目的是什么?
或者实际上扩展就像运行应用程序上的代码的“遥控器”?这是令人困惑的,因为我错误地将很多内容拖到项目中并标记了两个目标以使其大小增加一倍,因为资产被复制到两个目标。
最后一个问题是:什么将提交给 Apple,只是扩展程序还是两者都有?
我在 iOS 中创建了一个 Spotlight 扩展并想要对其进行调试。但是,由于 Spotlight 索引由 iOS 控制,我不知道哪个应用程序会触发索引运行。我尝试过 Safari 但没有成功。
我的自定义键盘应用程序扩展在我的真实设备上表现不同,但在我的 iOS 模拟器上表现良好。
我在真实设备上收到以下错误
2017-02-17 16:30:01.369868 Custom Keyboard[8472:570942] [default] error registring notify port: (1000000)
2017-02-17 16:30:01.371652 Custom Keyboard[8472:570889] [Common] BKSAccelerometer unable to create notifyd token for device orientation
2017-02-17 16:30:01.702241 Custom Keyboard[8472:570940] [] __nwlog_err_simulate_crash_libsystem libsystem simulate crash failed "libsystem_network.dylib: networkd_settings_setup_notify_watch :: notify_register_dispatch(com.apple.system.networkd.settings) [status 1000000] failed"
2017-02-17 16:30:01.706023 Custom Keyboard[8472:570940] [] networkd_settings_setup_notify_watch notify_register_dispatch(com.apple.system.networkd.settings) [status 1000000] failed, dumping backtrace:
Run Code Online (Sandbox Code Playgroud)
我正在使用标准 Alamofire 代码:
Alamofire.request("https://httpbin.org/get").response { response in
print("Request: \(response.request)")
print("Response: \(response.response)")
print("Error: \(response.error)")
if let data = response.data, let utf8Text = String(data: data, …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的应用程序扩展中获取最大 1080x1080 像素的调整大小图像:
NSExtensionItem *item = self.extensionContext.inputItems.firstObject;
NSItemProvider *provider = item.attachments.firstObject;
id imageOptions = @{
NSItemProviderPreferredImageSizeKey: [NSValue valueWithCGSize:CGSizeMake(1080, 1080)]
};
if([provider hasItemConformingToTypeIdentifier:(NSString*)kUTTypeImage]){
[provider loadItemForTypeIdentifier:(NSString*)kUTTypeImage options:imageOptions completionHandler:^(id<NSSecureCoding> _Nullable item, NSError * _Null_unspecified error) {
if(error){
NSLog(@"An error occured.");
[self.extensionContext completeRequestReturningItems:nil completionHandler:nil];
}else{
NSURL *url = (NSURL*)item;
UIImage *result = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
//RESULT IS FULL SIZE HERE: 3024x4032
}
}];
}
Run Code Online (Sandbox Code Playgroud)
然而,结果图像是3024x4032。我究竟做错了什么?
ios-app-extension ios8-share-extension share-extension ios11
我正在尝试在应用程序扩展中获取图像。问题是当类型为“public.image”时我无法获取图像,但是当类型为“public.png”时它会成功。我想做的只是获取图像并将其上传到服务器。
这是我正在使用的代码。
if let extensionContext = self.extensionContext,
let item = extensionContext.inputItems.first as? NSExtensionItem,
let attachment = item.attachments?.first as? NSItemProvider {
guard let type: String = attachment.registeredTypeIdentifiers.first else { return }
// -> "public.png" or "public.image"
attachment.loadFileRepresentation(forTypeIdentifier: type, completionHandler: { (url, error) in
guard let url = url else { return }
do {
let imageData = try Data(contentsOf: url)
if let image = UIImage(data: imageData) {
// some task with image
} else {
// reach here!!!!!
}
} catch …Run Code Online (Sandbox Code Playgroud) 将内容扩展添加到我的应用程序的通知处理中。我可以正常工作,但我想在不直接指定故事板的情况下完成它。原因是我希望能够将其传递给第三方框架(我正在开发)来处理呈现通知和管理用户响应。
我尝试删除该NSExtensionMainStoryboard条目并添加一个NSExtensionPrincipalClass条目,以便可以在代码中加载视图。但是,我的课程没有被实例化。这是类定义:
class NotificationViewController: NSObject, UNNotificationContentExtension {
override init() {
super.init()
print("extension instantiated")
}
func didReceive(_ notification: UNNotification) {
print("notification received")
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的 NSExtension 条目:
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>UNNotificationExtensionDefaultContentHidden</key>
<true/>
<key>UNNotificationExtensionCategory</key>
<string>Messaging</string>
<key>UNNotificationExtensionInitialContentSizeRatio</key>
<real>1</real>
</dict>
<key>NSExtensionPrincipalClass</key>
<string>NotificationViewController</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.usernotifications.content-extension</string>
</dict>
Run Code Online (Sandbox Code Playgroud)
有人为内容扩展做过这个吗?
我的 iOS 应用程序遵循“照片扩展”模板: - 独立的“容器”应用程序 - 照片编辑扩展,通过将其嵌入到上面的应用程序中来部署。
正如 Apple 所建议的,应用程序和扩展程序共享的代码被收集在嵌入应用程序中的“核心” cocoa 框架中,并且应用程序和扩展程序都链接到该框架。
所以我的 Xcode 项目包含三个目标:
到目前为止,一切都很好。
此外,框架、应用程序和扩展依赖于我在 Github 上的两个库MyLibraryA和MyLibraryB(反过来,MyLibraryA又依赖于MyLibraryB)。
我最初使用 Carthage设置对MyLibraryA和MyLibraryB的依赖,一切正常。
然后,我决定将我的库 A 和 B 迁移到 Swift Packages。
我删除了项目和目标、框架搜索路径等中所有与 Carthage 相关的设置,以确保引用我的库的 Swift Package 版本,而不是缓存的 Carthage 版本。我还删除了 Carthage 目录(签出和构建)。
当我构建共享/嵌入式框架目标时,没有任何问题。
但是,当我尝试构建应用程序或应用程序扩展目标时,我收到一条指向共享框架 Swift 标头 (MyFramewor-Swift.h) …
升级到 Xcode 12 和 iOS 14 后,似乎开始发生一些奇怪的事情。
应用程序以前在共享菜单选项中显示正常,但突然间它表现得很奇怪并且只在第二次尝试之后才显示。
我的目标是获取网页网址。这是我的共享激活规则。
我什至尝试过新项目并添加了上面带有激活规则的共享扩展。它也做同样的事情,并且应用程序仅从第二次开始显示在共享选项中。此问题主要发生在 Safari 中。
它曾经在 iOS 14 之前运行良好,我也没有在 iOS 14 更改日志中找到任何可能导致问题的共享扩展。谁能帮我指出可能出错的地方或某些可能的原因。
提前致谢!!!