iOS App Launch Option

本文详细解析了iOS应用启动时调用application:didFinishLaunchingWithOptions:方法的流程,阐述了不同启动原因(如直接启动、通过URL、本地通知、远程通知等)下launchOptions对象中可能包含的数据,并提供了在启动代码中进行合理验证和处理的示例。

 iOS 程序启动时总会调用application:didFinishLaunchingWithOptions:,其中第二个参数launchOptions为NSDictionary类型的对象,里面存储有此程序启动的原因。

launchOptions中的可能键值见UIApplication Class Reference的Launch Options Keys节 。

  • 若用户直接启动,lauchOptions内无数据;
  • 若由其他应用程序通过openURL:启动,则UIApplicationLaunchOptionsURLKey对应的对象为启动URL(NSURL),UIApplicationLaunchOptionsSourceApplicationKey对应启动的源应用程序的bundle ID (NSString);
  • 若由本地通知启动,则UIApplicationLaunchOptionsLocalNotificationKey对应的是为启动应用程序的的本地通知对象(UILocalNotification);
  • 若由远程通知启动,则UIApplicationLaunchOptionsRemoteNotificationKey对应的是启动应用程序的的远程通知信息userInfo(NSDictionary);
  • 其他key还有UIApplicationLaunchOptionsAnnotationKey,UIApplicationLaunchOptionsLocationKey,
    UIApplicationLaunchOptionsNewsstandDownloadsKey。
如果要在启动时,做出一些区分,那就需要在下面的代码做处理。
比如:您的应用可以被某个其它应用调起(作为该应用的子应用),要实现单点登录,那就需要在启动代码的地方做出合理的验证,并跳过登录。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSURL *url = [options objectForKey:UIApplicationLaunchOptionsURLKey];
    if(url)
    {
    }
    NSString *bundleId = [options objectForKey:UIApplicationLaunchOptionsSourceApplicationKey];
    if(bundleId)
    {
    }
    UILocalNotification * localNotify = [options objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    if(localNotify)
    {
    }
    NSDictionary * userInfo = [options objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    if(userInfo)
    {
    }

}
### 实现Unity iOS 应用关闭后重启 对于iOS平台上的Unity应用程序,在应用关闭之后重新启动的操作并非由应用程序本身直接控制,而是依赖于操作系统的处理机制。然而,可以间接通过某些方式来模拟这一行为。 当希望在特定条件下让应用退出并提示用户重新打开时,可以在Unity脚本中尝试发送通知给用户,告知其需要重启应用。这可以通过本地推送通知实现[^1]: ```csharp using UnityEngine; #if UNITY_IOS && !UNITY_EDITOR using UIKit; #endif public class AppRestartNotifier : MonoBehaviour { private void RestartAppNotification(){ #if UNITY_IOS && !UNITY_EDITOR var notification = new UILocalNotification(); notification.AlertBody = "为了获得最佳体验,请重启该应用"; notification.FireDate = Foundation.NSDateTime.Now.AddSeconds(5); UIKit.UIApplication.SharedApplication.ScheduleLocalNotification(notification); // 提交退出请求 UIKit.UIApplication.SharedApplication.PerformSelector(new ObjCRuntime.Selector("exit"), null, 0.0f); #endif } } ``` 需要注意的是,直接强制关闭应用并不被苹果官方推荐,并可能违反App Store审核指南。因此上述方法仅作为最后手段使用,通常应当尽量优化程序逻辑以避免进入必须重启的状态。 另外一种思路是在下次启动时检测到之前存在异常情况,则自动执行初始化或其他必要的恢复流程,从而达到类似的效果而不必真正终止进程。 #### 使用UIApplicationLaunchOptionsKey判断上次是否正常结束 如果想要了解上一次运行的应用是如何结束的(即是否为非正常退出),可以在`AppDelegate.cs`文件中的`FinishedLaunching`函数里检查启动选项字典参数: ```csharp // 在项目的iOS原生部分(AppDelegate.cs)添加如下代码片段 public override bool FinishedLaunching ( UIApplication application, NSDictionary launchOptions ) { if(launchOptions != null){ foreach(var key in launchOptions.Keys){ Console.WriteLine($"launch option: {key} -> {launchOptions[key]}"); // 如果发现有UIApplication.LaunchOptionsURLKey等特殊键值则说明可能是由于外部因素导致未正常关闭 } } return true; } ``` 以上方案提供了两种不同的策略用于应对Unity iOS项目中遇到的问题场景——要么优雅地引导玩家手动重启游戏;要么改进现有架构使得即使发生崩溃也能平滑过渡至下一轮会话而无需完全重开应用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值