Как установить nsextensionactivationrule предикаты?
даже люди намного умнее меня найти синтаксис NSExtensionActivationRule
arcane, но даже такой дурак, как я, должен уметь копировать/вставлять примеры, нет? К сожалению, я даже не могу получить примеры Apple на работу. Хост-приложение для расширения моего действия аварийно завершает работу при нажатии кнопки share sheet (трассировка стека ниже).
вы должны быть в состоянии просто установить 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
, а как этот человек найдено, он, похоже, не активируется для 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 ответов
вот как это должно выглядеть и отлично работает для меня, просто попробуйте:
<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>