如何在后台测试Application Launch的场景以处理Background NSURLSession的事件?
流:
所以问题是如何让操作系统退出应用程序,就像通常在一段时间后一样.目的是测试此方案的代码.我尝试使用UIApplicationExitsOnSuspend但它不起作用,因为那时App无法在后台启动.
我有以下代码块:
struct StackOverflow: View {
var body: some View {
Text("Hello, World!")
.padding(.bottom,UIApplication.shared.windows.first?.safeAreaInsets.bottom ?? 15)
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这会返回以下错误:
iOS 15.0 中已弃用“windows”:在相关窗口场景上使用 UIWindowScene.windows
我尝试利用 UIWindowScene.windows 但它无法正常工作。有什么想法如何将其转换为新语法吗?
我想在出现特定视图时更改 isIdleTimerDisabled 。在 SwiftUI 中我使用
.onAppear {
UIApplication.shared.isIdleTimerDisabled = true
}
.onDisappear {
UIApplication.shared.isIdleTimerDisabled = false
}
Run Code Online (Sandbox Code Playgroud)
但即使import UIKit我收到警告
在范围内找不到“UIApplication”
我该如何解决这个问题?找了一个多小时没有找到解决办法。
在iOS 6.0中,由于默认情况下AppDelegate扩展了UIRepsonder而不是UIApplication,因此没有全局的sharedApplication对象.我错过了什么吗?我正在尝试使用以下设置状态栏方向,它似乎不再起作用.我在iOS 6.0模拟器上测试过它.我知道您可以从plist设置中设置状态栏色调颜色,但有人可以告诉我如何在iOS 6.0中以编程方式设置状态栏方向吗?
[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationPortrait animated:NO]
Run Code Online (Sandbox Code Playgroud) 我正在尝试检测iPhone的UIStatusBar的隐藏和显示但是失败了.是否有任何解决方案可以帮助我,比如KVO或其他什么?
我正在开发示例应用程序,其中我是子类UIApplication和重写sendEvent函数.一切正常但但有时我在函数中得到异常,是他们的任何可能性,[UIApplication SendEvent]可能通过异常?? ..以下是我的代码..
(void)sendEvent:(UIEvent *)event
{
[super sendEvent:event];
//Some other things just checking for type of event..etc...
}
Run Code Online (Sandbox Code Playgroud)
我打电话后就碰到了SIGSEGV [super sendEvent:event];.
我已经看到了类似的问题:OpenUrl冻结应用程序超过10秒但它没有处理我更改第二个应用程序的安装状态的具体用例,并且那里列出的解决方案都没有解决我的问题,所以我是打开这个问题.
简化情况的简短摘要:
我们有两个应用程序,我们称之为appA和appB.在appA中,我们有一个按钮,允许您打开应用商店以在未安装appB的情况下下载appB,或者如果安装了appB则打开appB.每次打开/恢复appA时,它会通过执行a检查是否安装了appB [[UIApplication sharedApplication] canOpenURL: <<appB's URL scheme>>],如果结果为true,则appA的按钮显示"Open AppB",否则显示"Get AppB".
当点击appA的按钮时,它会canOpenURL:再次进行检查,并将App Store打开到appB,或通过深层链接打开appB.非常简单的东西.从字面上看,代码是:
if ( [[UIApplication sharedApplication] canOpenURL:appBDeepLink] ) {
[[UIApplication sharedApplication] openURL: appBDeepLink];
} else {
[[UIApplication sharedApplication] openURL: appBAppStoreLink];
}
Run Code Online (Sandbox Code Playgroud)
这一切都按预期工作,但是,如果您更改appB的安装状态并返回到appA,则在最后打开URL之前,对下次点击时,对openURL的调用会冻结5-10秒.
例如,以下是导致冻结的两种情况:
用户没有安装appB
用户打开appA
用户点击"获取AppB"
用户被带到App Store并安装appB
用户重新打开appA(将其带到前台,它从未关闭)
appA看到appB现已安装,并将其按钮更改为"Open AppB"
用户点击"打开AppB"
8.应用程序冻结5-10秒
用户安装了appB
用户打开appA
用户点击"打开AppB"
appB已打开
用户关闭appB
用户卸载appB
用户重新打开appA(将其带到前台,它从未关闭)
appA看到appB现已卸载,并将其按钮更改为"Get AppB"
用户点击"获取AppB"
10.应用程序冻结5-10秒
看起来似乎某个UIApplication实例没有更新它的内部列表,可以通过openURL打开哪些应用程序,直到应用程序被终止/重新打开,或再次调用openURL,并且调用openURL会导致冻结,因为它重新配置它是可以打开哪些应用程序的内部列表(我在这里完全猜测,我不知道它是如何工作的).无论如何,冻结是存在的,我已经尝试了很多方法来绕过它而没有任何成功,包括:
使用GCD调度到主线程
使用GCD调度到后台线程
在短暂的0.1秒延迟后执行openURL调用
使用NSThread的detachNewThreadSelector:toTarget:withObject在不同的线程上执行调用
似乎没有什么工作,延迟始终存在,直到我关闭appB并重新打开它.在线搜索,有一些Stackoverflow帖子从iOS 7开始注意到这种行为,但他们的解决方案(我上面尝试过的解决方案)似乎是针对从你不应该的地方调用openURL的整体延迟(在application:didFinishLaunchingWithOptions:,例如),我一直没能明确找到任何有关应用程序已经被安装/卸载后打开一个URL.
我可以在iOS 8.4上100%复制这个.
还有其他人遇到过这个吗?有什么解决方案吗?
所以我开始学习iOS的核心数据并编写了这部分代码:
- (void) viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
id delegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *objectContext = [delegate managedObjectContext];
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Album"];
//An array of our sorted Album objects by date in ascending order
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:YES]];
NSError *error = nil;
NSArray *fetchedAlbums = [objectContext executeFetchRequest:fetchRequest error:&error];
self.albums = [fetchedAlbums mutableCopy];
[self.tableView reloadData];
}
Run Code Online (Sandbox Code Playgroud)
我的问题是这一行的目的是什么:
id delegate = [UIApplication sharedApplication].delegate;
Run Code Online (Sandbox Code Playgroud)
我知道,对于委托,您需要将特定对象的当前实例传递给delegate属性,该属性将该对象设置为另一个对象的委托.我的问题是你做的时候:
id delegate = [UIApplication sharedApplication].delegate;
Run Code Online (Sandbox Code Playgroud)
哪个对象被传递到该delegate属性?该sharedApplication方法返回我假设的应用程序的单例实例,然后您将获得delegate该应用程序的单个实例的属性.该委托是指在AppDelegate.h/ AppDelegate.mfiles中使用的那个委托吗?
如果该委托属性与AppDelegate.h …
delegates objective-c uiapplication uiapplicationdelegate ios
我正在一个项目中,我想在IOS上手动运行主事件循环。也就是说,我想自己从源中出队列UIEvent,然后将它们发送到UIApplication。
我已经找到了有关如何在OS X上执行此操作的示例,并且它可以工作。在这种情况下,只需在NSApplication对象上调用“ nextEventMatchingMask”,然后调用“ sendEvent”即可。
但是,我找不到用UIApplication对象在IOS上收集事件的等效方法。我一直在阅读有关“事件队列”的信息,但是我还没有看到如何获得对该队列对象的引用。有谁知道我如何从源代码中获取UIEvent,以便将它们发送到UIApplication?
嗨,据我所知whatsapp支持abid和text参数如下:
NSURL *whatsappURL = [NSURL URLWithString:@"whatsapp://send?text=Hello%2C%20World!"];
if ([[UIApplication sharedApplication] canOpenURL: whatsappURL]) {
[[UIApplication sharedApplication] openURL: whatsappURL];
}
Run Code Online (Sandbox Code Playgroud)
但我想发送一个新号码的消息.例如,如果我的电话号码是+123456
NSURL *whatsappURL = [NSURL URLWithString:@"whatsapp://send?abid=+123456"];
Run Code Online (Sandbox Code Playgroud)
这不起作用.
因为如果用户插入客户的whatsapp号码,应用程序应弹出whatsapp带有此号码的消息框.
我注意到在某些情况下我可以发送消息到联系人列表中未列出的号码.我想知道它是如何工作的.
uiapplication ×10
ios ×7
objective-c ×2
swiftui ×2
delegates ×1
freeze ×1
ios6 ×1
ipad ×1
iphone ×1
nsurlsession ×1
openurl ×1
swift ×1
uievent ×1
uikit ×1
uistatusbar ×1
whatsapp ×1