2015-02-22 2 views
7

Даже people far smarter than I am найти синтаксис для NSExtensionActivationRule arcane, но даже дурак вроде меня должен иметь возможность копировать/вставлять примеры, нет? К сожалению, я даже не могу заставить Apple's examples работать. Приложение-хозяин для моего расширения действия падает, когда вы нажимаете кнопку общего доступа (трассировка стека ниже).Как установить предикаты NSExtensionActivationRule?

Вы должны просто установить NSExtensionActivationRule как строку, не так ли? Он отлично работает, когда я устанавливаю его в TRUEPREDICATE для целей отладки. Но если я возьму этот простой пример с Apple (слегка модифицированным для public.image) и вставить его, я получаю аварию:

{extensionItems = ({ 
    attachments = ({ 
     registeredTypeIdentifiers = (
      "public.image" 
     ); 
    }); 
})} 

Я пытался SUBQUERY вещи тоже:

SUBQUERY($extensionItem.attachments, $attachment, 
    ANY $attachment.registeredTypeIdentifiers 
    UTI-CONFORMS-TO "public.image")[email protected] >= 1 

В идеале I 'd хотел бы избежать этого вообще, просто используя NSExtensionActivationSupportsImageWithMaxCount, но как this person нашел, он, похоже, не активируется для jpg.

Во всяком случае, трассировка стека, как и обещал:

2015-02-21 23:28:08.644 MobileSlideShow[56997:2414043] Communications error: <OS_xpc_error: <error: 0x4c985f4> { count = 1, contents = 
    "XPCErrorDescription" => <string: 0x4c9883c> { length = 22, contents = "Connection interrupted" } 
}> 
2015-02-21 23:28:08.651 MobileSlideShow[56997:2413473] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSMutableArray removeObjectsAtIndexes:]: index set cannot be nil' 
*** First throw call stack: 
(
    0 CoreFoundation      0x04060686 __exceptionPreprocess + 182 
    1 libobjc.A.dylib      0x03b35a97 objc_exception_throw + 44 
    2 CoreFoundation      0x03f84ffe -[NSMutableArray removeObjectsAtIndexes:] + 654 
    3 UIKit        0x01d71d78 _UIApplicationExtensionDiscoveryGetPostprocessedExtensions + 350 
    4 UIKit        0x01d718e3 -[_UIActivityApplicationExtensionDiscovery activitiesMatchingInputItems:error:updateBlock:] + 1237 
    5 UIKit        0x01c342f2 -[UIActivityViewController _availableActivitiesForItems:applicationExtensionActivities:] + 594 
    6 UIKit        0x01c3409b -[UIActivityViewController _availableActivitiesForItems:] + 48 
    7 UIKit        0x01c3519a -[UIActivityViewController _availableActivities] + 57 
    8 UIKit        0x01c39552 -[UIActivityViewController activityGroupViewController:availableActivitiesInCategory:] + 65 
    9 UIKit        0x0195c47f -[UIActivityGroupViewController collectionView:didSelectItemAtIndexPath:] + 251 
    10 UIKit        0x01b8d94d -[UICollectionView _selectItemAtIndexPath:animated:scrollPosition:notifyDelegate:] + 591 
    11 UIKit        0x01baced4 -[UICollectionView _userSelectItemAtIndexPath:] + 191 
    12 UIKit        0x01bad0c8 -[UICollectionView touchesEnded:withEvent:] + 492 
    13 libobjc.A.dylib      0x03b4b7cd -[NSObject performSelector:withObject:withObject:] + 84 
    14 UIKit        0x0164f714 forwardTouchMethod + 270 
    15 UIKit        0x0164f784 -[UIResponder touchesEnded:withEvent:] + 31 
    16 libobjc.A.dylib      0x03b4b7cd -[NSObject performSelector:withObject:withObject:] + 84 
    17 UIKit        0x0164f714 forwardTouchMethod + 270 
    18 UIKit        0x0164f784 -[UIResponder touchesEnded:withEvent:] + 31 
    19 UIKit        0x014e714a -[UIWindow _sendTouchesForEvent:] + 874 
    20 UIKit        0x014e7c24 -[UIWindow sendEvent:] + 790 
    21 UIKit        0x014a5d81 -[UIApplication sendEvent:] + 242 
    22 UIKit        0x014b613b _UIApplicationHandleEventFromQueueEvent + 21263 
    23 UIKit        0x01489599 _UIApplicationHandleEventQueue + 2206 
    24 CoreFoundation      0x03f820ff __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15 
    25 CoreFoundation      0x03f77c0d __CFRunLoopDoSources0 + 253 
    26 CoreFoundation      0x03f77168 __CFRunLoopRun + 952 
    27 CoreFoundation      0x03f76aeb CFRunLoopRunSpecific + 443 
    28 CoreFoundation      0x03f7691b CFRunLoopRunInMode + 123 
    29 GraphicsServices     0x0089e2c9 GSEventRunModal + 192 
    30 GraphicsServices     0x0089e106 GSEventRun + 104 
    31 UIKit        0x0148d366 UIApplicationMain + 1526 
    32 MobileSlideShow      0x00092724 MobileSlideShow + 63268 
    33 libdyld.dylib      0x049dcac9 start + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
+1

«Вы должны просто установить« NSExtensionActivationRule »как строку, не так ли?» Нет, согласно многочисленным упоминаниям в документации, 'NSExtensionActivationRule' должен быть словарем. И пример, который вы вставляете, касается свойства «вложений» расширения приложения, а не «NSExtensionActivationRule» в вашем info.plist. –

+0

ОК, спасибо. Я был смущен этим, я думаю: «Если вам нужно сделать более сложную или более конкретную фильтрацию, например, различать public.url и public.image, вы можете создать предикат. Затем используйте голую строку, которая представляет предикат как значение ключа NSExtensionActivationRule, «отсутствует или недоразумение». – Duc

+1

Да, похоже, что вы можете использовать предикатную строку (те, которые начинаются с 'SUBQUERY') в качестве значения для' NSExtensionActivationRule'. (Мне никогда не приходилось так поступать.) Но строка, которую вы сейчас используете, определенно неверна. –

ответ

12

Вот как это должно выглядеть и отлично работает для меня, просто попробуйте:

<key>NSExtension</key> 
<dict> 
    <key>NSExtensionAttributes</key> 
    <dict> 
     <key>NSExtensionActivationRule</key> 
     <string>SUBQUERY (
      extensionItems, 
      $extensionItem, 
      SUBQUERY (
      $extensionItem.attachments, 
      $attachment, 
      (
      ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf" 
      || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.image" 
      || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.plain-text" 
      || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.png" 
      || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.jpeg" 
      || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.jpeg-2000" 
      || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.compuserve.gif" 
      || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.microsoft.bmp" 
      ) 
      )[email protected] == 1 
      )[email protected] == 1 
     </string> 
    </dict> 
    <key>NSExtensionMainStoryboard</key> 
    <string>MainInterface</string> 
    <key>NSExtensionPointIdentifier</key> 
    <string>com.apple.ui-services</string> 
</dict> 
+0

Удивительный, спасибо, это было в основном ТОЧНО, что мне нужно. Мне просто нужно было изменить два @counts таким образом, потому что мои обрабатывают несколько: '). @ Count == $ extensionItem.attachments. @ Count ). @ Count> 0' – xaphod

+0

Добро пожаловать! :) – Artiom

+0

Это отлично поработало для меня спасибо! Мне просто пришлось сменить « com.apple.ui-services' to ' com.apple.share-services' –

0

Я использовал ниже подзапроса для NSExtensionActivationRule, чтобы получить публичный url, vcard, обычный текст из моего расширения действия.

<dict> 
    <key>NSExtensionAttributes</key> 
    <dict> 
     <key>NSExtensionActivationRule</key> 
     <string> 
      SUBQUERY (
      extensionItems, $extensionItem, 
      SUBQUERY (
      $extensionItem.attachments, $attachment, 
      ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.vcard" || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.plain-text" || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url" 
      )[email protected] >= 1 
      )[email protected] > 0 
     </string> 
    </dict> 
    <key>NSExtensionMainStoryboard</key> 
    <string>MainInterface</string> 
    <key>NSExtensionPointIdentifier</key> 
    <string>com.apple.ui-services</string> 
</dict> 
Смежные вопросы