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的文档吧。

-以上-