Xummer

获取 iOS 打开 App 的方式

iOS 中打开 App 的方法并不是只有点击 App 图标这一种,所以下面来看下具体有哪些方法,先上官方文档 LaunchOptionsKeys

###打开方式分类

如何在程序中获取到打开方式

// main.m
#import "AppDelegate.h"

int main(int argc, char * argv[])
{
	@autoreleasepool {
		return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
	}
}

首先得先说下程序的 iOS 程序的启动流程,每个 c 程序都是以 main 作为程序的程序的入口,objective-c 也不例外。在 main 函数中调用了 UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 将程序的控制权交给 AppDelegate,iOS 生命周期交给 AppDelegate 来控制。

具体看下图(有图有真相)。

几乎每次启动都会调用 application: didFinishLaunchingWithOptions:(PS: 有例外,比如App已经在后台,此时再启动App时是不会调用的。)

可以通过 launchOptions 来判断具体是哪种方式启动

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

点击桌面图标打开

launchOptions 返回为空。

Sep  9 10:58:12 Xummers-iPhone HandleOpenUrlDemo[50430] <Warning>: launchOptions (null) 

通过 openurl 打开

UIApplicationLaunchOptionsSourceApplicationKey 为调用 openurl 打开的源程序的 bundle id。
UIApplicationLaunchOptionsURLKeyopenurl 所传的参数,如果 app 有多个url schema 时可以在这里做判断。

launchOptions {
		UIApplicationLaunchOptionsSourceApplicationKey = "com.apple.mobilesafari";
		UIApplicationLaunchOptionsURLKey = "openapptest://";
}

点击远程推送(remotenotification)打开

UIApplicationLaunchOptionsRemoteNotificationKey 直接是一个推送的 json 内容。

Sep  9 10:49:51 Xummers-iPhone HandleOpenUrlDemo[50363] <Warning>: launchOptions {
	UIApplicationLaunchOptionsRemoteNotificationKey =     {
		 aps =         {
				alert = test;
				badge = 1;
				sound = default;
             };
        };
     }

通过本地推送(localnotification)打开

UIApplicationLaunchOptionsLocalNotificationKey 为本地推送的内容。

launchOptions {
         UIApplicationLaunchOptionsLocalNotificationKey = "<UIConcreteLocalNotification: 0x1e5c8b60>{fire date = 2013\U5e749\U67089\U65e5\U661f\U671f\U4e00 \U4e2d\U56fd\U6807\U51c6\U65f6\U95f411\U65f613\U520655\U79d2, time zone = Asia/Shanghai (GMT+0800) offset 28800, repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = (null), user info = (null)}";
     }

通过其他程序的 UIDocumenInteractionController 点击后打开

UIApplicationLaunchOptionsSourceApplicationKey 为打开的源程序的 bundle id。 UIApplicationLaunchOptionsURLKey 需要被打开具体文件路径

launchOptions {
         UIApplicationLaunchOptionsSourceApplicationKey = "Xummer.X-SSH";
         UIApplicationLaunchOptionsURLKey = "file://localhost/private/var/mobile/Applications/BEEA17E6-0EAA-4F52-A3A0-E7E0693BC586/Documents/Inbox/gintama.jpeg";
     }

其他方式

其他 key 还有UIApplicationLaunchOptionsAnnotationKey,UIApplicationLaunchOptionsLocationKey, UIApplicationLaunchOptionsNewsstandDownloadsKey
因为没有用到过,所以想知道这些key的内容还是看 Apple的文档吧。

-以上-