如何设置NSExtensionActivationRule谓词?

即使是比我更聪明的人find了NSExtensionActivationRule奥术的语法,但即使是像我这样的傻瓜应该能够复制/粘贴的例子,没有? 不幸的是,我连苹果的例子都无法工作。 当您点击分享表button(下面的堆栈跟踪)时,我的操作扩展的主机应用程序崩溃。

你应该能够将NSExtensionActivationRule设置为一个string,对吗? 当我将其设置为TRUEPREDICATE以进行debugging时,它工作正常。 但是,如果我从苹果(稍微修改public.image )这个简单的例子,并将其粘贴,我得到一个崩溃:

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

我也尝试了SUBQUERY东西:

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

理想情况下,我想通过使用NSExtensionActivationSupportsImageWithMaxCount来完全避免这种情况,但是当这个人发现时,似乎并没有为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 

这就是它应该看起来像,并为我工作正常,只是尝试:

 <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> 

我用下面的子查询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" ).@count >= 1 ).@count > 0 </string> </dict> <key>NSExtensionMainStoryboard</key> <string>MainInterface</string> <key>NSExtensionPointIdentifier</key> <string>com.apple.ui-services</string> </dict>