在ShareKit中,代码需要确定rootViewController的位置,以便它可以显示模态视图.出于某种原因,iOS 5中的代码失败了:
// Try to find the root view controller programmically
// Find the top window (that is not an alert view or other window)
UIWindow *topWindow = [[UIApplication sharedApplication] keyWindow];
if (topWindow.windowLevel != UIWindowLevelNormal)
{
NSArray *windows = [[UIApplication sharedApplication] windows];
for(topWindow in windows)
{
if (topWindow.windowLevel == UIWindowLevelNormal)
break;
}
}
UIView *rootView = [[topWindow subviews] objectAtIndex:0];
id nextResponder = [rootView nextResponder];
if ([nextResponder isKindOfClass:[UIViewController class]])
self.rootViewController = nextResponder;
else
NSAssert(NO, @"ShareKit: Could not find a root view …Run Code Online (Sandbox Code Playgroud) 我正在创建一个内部应用程序来提供我们的业务客户可以无线安装的更新应用程序.
最终,我启动安装的方式是:
NSURL *otaURL = [NSURL URLWithString:@"itms-services://?action=download-manifest&url=<<my-url.plist>>"];
[[UIApplication sharedApplication] openURL:otaURL];
Run Code Online (Sandbox Code Playgroud)
这工作正常但我们注意到它有时会保留plist或ipa文件的缓存并安装旧版本.我们已经排除它在服务器上没有更新,因为我们甚至可以从服务器删除ipa文件,它仍然会安装旧版本.
更改.plist和.ipa文件名将起作用,但实际上不是所需的最终状态,所以我的问题是:有没有办法强制设备出去从服务器获取文件而不是依赖它的缓存?
我决定以编程方式加载我的视图,所以放:
int ret = UIApplicationMain(argc, argv, nil, nil);
Run Code Online (Sandbox Code Playgroud)
不行.不过,我确实有一个ViewController和一个AppDelegate.UIApplicationMain使用ViewController和AppDelegate的正确用途是什么?
PS我没有使用XCode或Interface Builder,我正在开发工具链.
重新安装时不会删除UIApplication徽章编号.
如果我在徽章具有非零值时卸载应用程序,然后重新安装它,则徽章仍会显示在新安装中.
我按以下方式更新徽章编号:
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:badgeNumber];
Run Code Online (Sandbox Code Playgroud)
试图找到一个解决方案 - 当应用程序终止时发出一些通知,这样我就可以删除徽章......无法使用applicationWillTerminate.有什么建议?
是否有可能做到这一点?UIApplication's scheduledLocalNotifications似乎没有返回已经发送到用户通知中心的通知,所以我认为这可能是设计的,但我找不到任何记录在案的证据.
谁知道?
谢谢!
编辑:发现这个:
您可以通过在应用程序对象上调用cancelLocalNotification:取消特定的预定通知,并且可以通过调用cancelAllLocalNotifications来取消所有预定的通知.这两种方法也以编程方式解除了当前的问题
这里:http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/IPhoneOSClientImp/IPhoneOSClientImp.html
但是,如果scheduledLocalNotifications未向我发送已经发送的通知,如何获取已发送通知的引用?
编辑2:
在我注册了一些通知之后,这就是我正在尝试做的事情:
UIApplication *app = [UIApplication sharedApplication];
for (UILocalNotification *localNotification in app.scheduledLocalNotifications)
{
if (someCondition) {
[app cancelLocalNotification:localNotification];
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,一旦他们被交付,他们就不再是'scheduledLocalNotifications'.
我正在创建一个带有密码重置功能的iOS应用程序,该功能可以向用户发送电子邮件.发送电子邮件后,我想向UIAlertController用户询问是否要打开邮件应用程序.
我在这里看到了各种各样的帖子:
let url = NSURL(string: "mailto:")
UIApplication.sharedApplication().openURL(url!)
Run Code Online (Sandbox Code Playgroud)
这可行,但不幸的是它启动了一条不是我想要的新消息.我只想启动应用程序,以便用户可以看到他们的收件箱.
我试图在我的应用程序中打开一个网站,但由于某种原因,一行继续返回nil,继承我的代码:
let url = URL(string: "http://en.wikipedia.org/wiki/\(element.Name)")!
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(url)
}
}
Run Code Online (Sandbox Code Playgroud)
这let url = URL...是继续返回此错误的第一行():
致命错误:在展开Optional值时意外发现nil.
我该怎么做才能解决这个问题?
有人可以解释如何控制iOS应用程序中的执行流程吗?我知道UIApplicationMain首先从main调用.那又怎样?我定义的方法和主要方法之间有什么关系?这一切都是事件驱动的还是有一些结构化的序列?
我不是故意这么模糊,我只需要知道从哪里开始.也许我是以错误的方式看待这个.
例如,在C++中我会做类似的事情:
#include "myMethods.h"
int main (int argc, char * const argv[]) {
Method1(); // Initialization
Method2(); // Opening views and options
Method3(); // Meat of the program
return 0;
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我有一个在后台播放音频的应用程序.我正试图beginBackgroundTaskWithExpirationHandler在当前曲目结束时跳到下一首曲目.
以下是播放状态更改时调用的代码.它永远不会记录"beginBG called",即使同一方法中的其他代码在后台成功实现.
UIApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[self ffwButtonPressed:ffwButton];
NSLog(@"beginBG called");
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
Run Code Online (Sandbox Code Playgroud)
ffwButtonPressed调用一些不同的方法来改变轨道.什么时候完成......
UIApplication *app = [UIApplication sharedApplication];
if (bgTask != UIBackgroundTaskInvalid) {
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
NSLog(@"end bgTask");
Run Code Online (Sandbox Code Playgroud)
编辑:声明
UIBackgroundTaskIdentifier bgTask;
Run Code Online (Sandbox Code Playgroud)
编辑:在ViewDidLoad中
bgTask = 0;
Run Code Online (Sandbox Code Playgroud) 我一直在尝试处理在我的应用程序中接收通知,但它并没有真正解决.
我用的时候didReceiveLocalNotification:(UILocalNotification *)notification.我可以接收并使用用于进入应用程序的通知,没有任何问题
但是,只有在应用程序已经运行时才激活此功能(活动,非活动,后台,并且可能已暂停,但我还没有尝试过).
现在,didFinishLaunchingWithOptions:(NSDictionary *)launchOptions您可以使用此函数[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]返回UILocalNotification.
但是,从非运行状态启动应用程序时,不会触发此事件.然后LocalNotification打开应用程序,但我无法以任何方式使用它.
现在,我的问题是:如何让它工作,所以当应用程序处于未运行状态时,我可以在启动应用程序时从通知中接收和处理通知?或许我在这里做错了吗?
以下是我的应用程序中的一些示例代码:
首先,didFinishLaunchingWithOptions功能,不幸的是,它不起作用.该功能[sharedLocalNotificationsInstance processNotification:notification]永远不会启动......
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
LocalNotificationsController *sharedLocalNotificationsInstance = [LocalNotificationsController sharedLocalNotificationsInstance];
[sharedLocalNotificationsInstance checkNotifications];
UILocalNotification *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if ( notification != nil ) {
// Process the received notification
[sharedLocalNotificationsInstance processNotification:notification];
application.applicationIconBadgeNumber = 0;
}
return YES;
}
Run Code Online (Sandbox Code Playgroud)
第二段代码:didReceiveLocalNotification函数,完美运行:我收到通知,[sharedLocalNotificationsInstance processNotification:notification]完美运行.
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
// Used when the application launches from …Run Code Online (Sandbox Code Playgroud) uiapplication ×10
ios ×7
objective-c ×4
iphone ×2
swift ×2
badge ×1
control-flow ×1
execution ×1
fatal-error ×1
main-method ×1
sequence ×1
uninstall ×1
url ×1