如何设置NSExtensionActivationRule谓词?

时间:2015-02-22 04:32:50

标签: ios ios8 ios-extensions

即使people far smarter than I am找到NSExtensionActivationRule奥术的语法,但即使像我这样的傻瓜也应该能够复制/粘贴示例,不是吗?不幸的是,我甚至无法让Apple's examples工作。点击共享表按钮(下面的堆栈跟踪)时,我的操作扩展程序的主机应用程序崩溃。

您应该可以将NSExtensionActivationRule设置为字符串,对吗?当我将其设置为TRUEPREDICATE以进行调试时,它工作正常。但是,如果我从Apple(稍微修改为public.image)中获取这个简单示例并粘贴它,我就会崩溃:

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

我也试过SUBQUERY这件事:

SUBQUERY($extensionItem.attachments, $attachment, 
    ANY $attachment.registeredTypeIdentifiers 
    UTI-CONFORMS-TO "public.image").@count >= 1

理想情况下,我想通过使用NSExtensionActivationSupportsImageWithMaxCount完全避免这种情况,但发现this person时,似乎没有为jpgs激活它。

无论如何,堆栈跟踪承诺:

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

2 个答案:

答案 0 :(得分:13)

它应该是这样的,并且对我来说很好,只需尝试:

<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"
            )
            ).@count == 1
            ).@count == 1
        </string>
    </dict>
    <key>NSExtensionMainStoryboard</key>
    <string>MainInterface</string>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.ui-services</string>
</dict>

答案 1 :(得分:1)

我在NSExtensionActivationRule的下面的子查询中使用了我的Action Extension中的公共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"
            ).@count >= 1
            ).@count > 0
        </string>
    </dict>
    <key>NSExtensionMainStoryboard</key>
    <string>MainInterface</string>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.ui-services</string>
</dict>