在Appdelgate中判断程序入口
需求:
1、用户正常启动程序。
1、程序在后台时,接收到远程消息推送,用户点击推送消息跳转到相应界面。
2、用户点击苹果左侧的widget功能时,跳转到相应界面。
需要在app delegate中判断程序是从哪个入口进入的。
摘抄部分:
当应用程序启动时执行,应用程序启动入口。只在应用程序启动时执行一次。application参数用来获取应用程序的状态、变量等,值得注意的是字典参数:(NSDictionary *)launchOptions,该参数存储程序启动的原因。
1、若用户直接启动,lauchOptions内无数据;
2、若由其他应用程序通过openURL:启动,则UIApplicationLaunchOptionsURLKey对应的对象为启动URL(NSURL),UIApplicationLaunchOptionsSourceApplicationKey对应启动的源应用程序的bundle ID (NSString);
3、若由本地通知启动,则UIApplicationLaunchOptionsLocalNotificationKey对应的是为启动应用程序的的本地通知对象(UILocalNotification);
4、若由远程通知启动,则UIApplicationLaunchOptionsRemoteNotificationKey对应的是启动应用程序的的远程通知信息userInfo(NSDictionary);
5、其他key还有UIApplicationLaunchOptionsAnnotationKey,UIApplicationLaunchOptionsLocationKey, UIApplicationLaunchOptionsNewsstandDownloadsKey。
如果要在启动时,做出一些区分,那就需要在下面的代码做处理。
比如:应用可以被某个其它应用调起(作为该应用的子应用),要实现单点登录,那就需要在启动代码的地方做出合理的验证,并跳过登录。
实现:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//判断程序是从哪个入口进入的
if ([[launchOptions allKeys] containsObject:UIApplicationLaunchOptionsRemoteNotificationKey]) {//用户是点击通知栏推送启动的
// apn 内容获取:
NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];
NSDictionary *apsDic = [remoteNotification objectForKey:@"aps"];
NSString *message = [apsDic objectForKey:@"alert"];
//NSString *badge = [apsDic objectForKey:@"badge"];//红点数量
//NSString *sound = [apsDic objectForKey:@"sound"];//声音
NSString *voaUrl = [remoteNotification objectForKey:@"url"];
NSString *voaId = [remoteNotification objectForKey:@"id"];
if (voaId && ([voaId integerValue] > 0)) {
[self pushNewsDetailVC:voaId];//推送到新闻详情页
}else if (voaUrl && ![@""isEqualToString:voaUrl]){//http://www.iyuba.com
NSString *url = [NSString stringWithFormat:@"http://%@", voaUrl];
//用手机浏览器打开
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:url]]) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
}
}
NSUserDefaults *notificationDic = [NSUserDefaults standardUserDefaults];
[notificationDic setObject:remoteNotification forKey:@"notification"];
}else if ([[launchOptions allKeys] containsObject:UIApplicationLaunchOptionsURLKey]){
NSLog(@"通过openURL打开,即点击widget进来的");
NSURL *openUrl = [launchOptions objectForKey: UIApplicationLaunchOptionsURLKey];
NSString *urlStr = openUrl.absoluteString;
urlStr = [urlStr substringFromIndex:27];//WidgetOpenViewController://1035
[self pushNewsDetailVC:urlStr];//推送到新闻详情页
// UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"通过openURL打开" message:[NSString stringWithFormat:@"%@",urlStr] delegate:self cancelButtonTitle:@"我知道了" otherButtonTitles:nil];
// [alertView show];
}else{
NSLog(@"用户是正常启动的程序");
}
}
在此记录,以便以后查看,也可让更多需要此需求的人得到解答。
——凡几多