2016-01-21 8 views
2

Я создал shortcutItem в приложении, и когда я запустил ios 9.2, он отлично работает. Но когда я открываю приложение с ios 8.1, он падает.Создание ярлыка для приложения сбой в предыдущей версии

Тема 1: EXC_BAD_ACCESS (код = 1, адрес = 0x0)

Как это shortcutItem создаются говорят, что если я создаю shortcutItem значок и название динамически после (launchOption == nil) return YES показывает ли телефон shortcutItems то (? потому что createShortcutItem не называется, он не должен показывать то, что я думаю.) Смогу ли я открыть shortcutItem после того, как я открыл приложение, открывается и сведено к минимуму, хотя shortcutItems и значки не вызывают в didFinishLaunchingwithoptions.

Am получать сбои в ИО 8.1 на этой линии

shortcutItem = [launchOptions objectForKeyedSubscript:UIApplicationLaunchOptionsShortcutItemKey]; 

Так я возвращаюсь if launchOptions == nil, чтобы зафиксировать аварию.

Ниже приведен код, который используется в моем приложении для использования ярлыка. Он создан в моем основном приложении, поэтому я немного изменил имена в качестве примера.

Как обрабатывать ярлык, который не поддерживается на ранней версии iOS (от 8.0) или устройств. Я хочу, чтобы мое приложение поддерживало как ios8, так и более большие версии.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 
    BOOL shouldPerformAdditionalDelegateHandling = YES; 

    // Shortcut creation and methods 
    [[MyAppShortcuts instance] createShortcutItem]; 

    if (launchOptions == nil) { 
    return shouldPerformAdditionalDelegateHandling; 
    } 

    UIApplicationShortcutItem *shortcutItem; 
    shortcutItem = [launchOptions objectForKeyedSubscript:UIApplicationLaunchOptionsShortcutItemKey]; 

    if (shortcutItem != nil){ 
    // Open app from shortcut 
    self.rootViewCtrl_.shortcutItem_ = shortcutItem; 

    [[MyAppShortcuts instance] setMyAppShortcutIs:shortcutItem.type]; 
    [[MyAppShortcuts instance] setAppLaunchedWithShortcut:YES]; 

    // This will block "performActionForShortcutItem:completionHandler" from being called. 
    shouldPerformAdditionalDelegateHandling = NO; 
    } 
    return shouldPerformAdditionalDelegateHandling; 
} 


- (void) createShortcutItem { 
    UIApplicationShortcutIcon* firstIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"shortcutFirstItem"]; 
    UIApplicationShortcutItem* firstItem; 
    firstItem = [[UIApplicationShortcutItem alloc]initWithType: firstItemType 
               localizedTitle: NSLocalizedString(@"First Item", nil) 
               localizedSubtitle: nil 
                  icon: firstIcon 
                 userInfo: nil]; 
    //..... creating 2nd 3rd 4th item 
    [UIApplication sharedApplication].shortcutItems = @[firstItem, secondItem, thirdItem, fourthItem]; 
} 

application:performActionForShortcutItem: метод вызывается каждый раз, когда приложение открывается с помощью ярлыка. Если я создаю shortcutItems(icon, title and type) внутри метода, который он вызывает каждый раз, это влияет на открытие ярлыка каким-либо образом, потому что создание элементов снова и снова?

- (void) application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler 
{ 
    // Shortcut creation and methods 
    [ [ MyAppShortcuts instance ] createShortcutItem ]; 
    [[FinAppShortcuts instance] handleShortCut:shortcutItem ];  
} 
+0

Что именно представляет собой сообщение при его сбое? И почему вы вызываете 'objectForKeyedSubscript:' и не обычный 'objectForKey:'? –

+0

Crash is «Thread 1: EXC_BAD_ACCESS (code = 1, address = 0x0)» выделено красным цветом – Jaff

ответ

2

Вы должны поместить всю логику относительно ярлыков после проверки, доступна ли она (iOS 9.1 и далее). Я не думаю, что startOptions является нулевым для экземпляров, где он не вызывается, нажимая ярлык.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 
    BOOL shouldPerformAdditionalDelegateHandling = YES; 

    //checks if you could user shortcut items. only available in iOS 9.1 onwards 
    if ([UIApplicationShortcutItem class]){ 

     // Shortcut creation and methods 
     [[MyAppShortcuts instance] createShortcutItem]; 

     if (launchOptions[UIApplicationLaunchOptionsShortcutItemKey]){ 
      // Open app from shortcut 
      self.rootViewCtrl_.shortcutItem_ = shortcutItem; 
      [[MyAppShortcuts instance] setMyAppShortcutIs:shortcutItem.type]; 
      [[MyAppShortcuts instance] setAppLaunchedWithShortcut:YES]; 
      // This will block "performActionForShortcutItem:completionHandler" from being called. 
      shouldPerformAdditionalDelegateHandling = NO; 
     } 

    } 
    return shouldPerformAdditionalDelegateHandling; 
} 
+0

Спасибо за ответ. Вопрос: я могу увидеть ярлыки при установке приложения в первый раз и открыть непосредственно из быстрого запуска? – Jaff

+0

yep, я не думал, что вам нужен метод 'createShortcutItem'. также вместо использования' [MyAppShortcuts instance] 'вы можете использовать' self' вместо –

+0

Да, я создал [экземпляр MyAppShortcuts], чтобы уменьшить списание кода в AppDelegate. Это просто класс для всех методов быстрого доступа. У этого есть только некоторые методы, как создание ярлыков и handleShortcuts – Jaff

 Смежные вопросы

  • Нет связанных вопросов^_^