react-native-vkontakte-login
react-native-vkontakte-login copied to clipboard
Share dialog doesn't open
Добрый день. Столкнулся с такой проблемой: не открывается диалог шаринга после нажатия на кнопку "поделиться в вк". То есть я нажимаю, открывается браузер с логином, логинюсь, браузер закрывается и диалог шаринга после этого не открывается. Ниже привел лог из Xcode и код приложения (инициализация->логин->шаринг). AuthContainer маунтится в самом начале, так что его ComponentDidMount происходит перед логином.
AuthContainer.js
componentDidMount() {
VKLogin.initialize(6056ххх);
}
Share.js
_onPress = () => {
try {
const params = await VKLogin.login(['wall','photos']);
console.log('PARAMS: ', params);
const response = await VKLogin.share({
linkText: 'Link visible text',
linkUrl: 'http://labravet.ru/',
description: 'Some description',
image: SHARE_VK,
});
console.log('====================================');
console.log('RESPONSE: ', response);
console.log('====================================');
} catch (error) {
console.log('====================================');
console.log('ERROR_share: ', error);
console.log('====================================');
}
}
2017-07-04 12:31:39.233 rayfund[29049:1123064] [VKLogin] -[VkontakteManager login:resolver:rejecter:] Login with scope (
wall,
photos
)
2017-07-04 12:31:39.235 rayfund[29049:1123064] [VKLogin] -[VkontakteManager login:resolver:rejecter:]_block_invoke Authorization required
2017-07-04 12:31:39.239 rayfund[29049:1123064] -canOpenURL: failed for URL: "vkauthorize://authorize" - error: "The operation couldn’t be completed. (OSStatus error -10814.)"
2017-07-04 12:31:39.251 rayfund[29049:1123064] [VKLogin] -[VkontakteManager vkSdkShouldPresentViewController:] Presenting view controller
2017-07-04 12:33:32.223 rayfund[29049:1123064] [VKLogin] -[VkontakteManager vkSdkAccessAuthorizationFinishedWithResult:] Authorization result is <VKMutableAuthorizationResult: 0x608000e5a460>
2017-07-04 12:33:32.229 [info][tid:com.facebook.react.JavaScript] 'PARAMS: ', { email: null,
secret: null,
user_id: '19712426',
expires_in: 0,
access_token: '0d2bd13f1ba343dc232ddd5a49166aa72d007d2da261cb1e3445403273555a1e1808e88f07391d38f8aff' }
2017-07-04 12:33:32.231 rayfund[29049:1123064] [VKSharing] -[VkontakteSharing share:resolver:rejecter:] Open Share Dialog
2017-07-04 12:33:32.279 rayfund[29049:1123924] Warning: Attempt to present <VKShareDialogController: 0x7fd81c7c9450> on <UIViewController: 0x7fd81c411940> whose view is not in the window hierarchy!
После того, как диалог шаринга не открылся, нажимаю снова на кнопку шаринга, после чего приложение падает и Xcode пишет следующее:
2017-07-04 13:31:27.621 rayfund[30103:1171588] [VKSharing] -[VkontakteSharing share:resolver:rejecter:] Open Share Dialog
2017-07-04 13:31:27.669 rayfund[30103:1173023] *** Assertion failure in void _UIPerformResizeOfTextViewForTextContainer(NSLayoutManager *, UIView<NSTextContainerView> *, NSTextContainer *, NSUInteger)(), /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIFoundation_Sim/UIFoundation-491.7/UIFoundation/TextSystem/NSLayoutManager_Private.m:1577
2017-07-04 13:31:27.689 rayfund[30103:1173023] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Only run on the main thread!'
*** First throw call stack:
(
0 CoreFoundation 0x000000010b7fdb0b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x000000010a31e141 objc_exception_throw + 48
2 CoreFoundation 0x000000010b801cf2 +[NSException raise:format:arguments:] + 98
3 Foundation 0x0000000109eed69b -[NSAssertionHandler handleFailureInFunction:file:lineNumber:description:] + 165
4 UIFoundation 0x00000001126d47d6 -[NSLayoutManager(NSPrivate) _resizeTextViewForTextContainer:] + 406
5 UIFoundation 0x00000001126d4500 -[NSLayoutManager(NSPrivate) _recalculateUsageForTextContainerAtIndex:] + 2229
6 UIFoundation 0x00000001126d4571 -[NSLayoutManager(NSPrivate) _validatedStoredUsageForTextContainerAtIndex:] + 82
7 UIFoundation 0x000000011270f268 -[NSLayoutManager usedRectForTextContainer:] + 122
8 UIKit 0x0000000108f828d0 -[_UITextContainerView textContainerOrigin] + 145
9 UIFoundation 0x000000011270ca3c -[NSLayoutManager _primitiveInvalidateDisplayForGlyphRange:] + 4396
10 UIFoundation 0x000000011270d3a1 -[NSLayoutManager invalidateDisplayForCharacterRange:] + 403
11 UIFoundation 0x00000001126d4609 -[NSLayoutManager(NSPrivate) _invalidateDisplayIfNeeded] + 68
12 UIFoundation 0x00000001126d6fd2 -[NSLayoutManager(NSPrivate) _rectArrayForRange:withinSelectionRange:rangeIsCharRange:singleRectOnly:fullLineRectsOnly:inTextContainer:rectCount:rangeWithinContainer:glyphsDrawOutsideLines:rectArray:rectArrayCapacity:] + 9335
13 UIFoundation 0x00000001126d7e6a -[NSLayoutManager(NSPrivate) _rectArrayForRange:withinSelectionRange:rangeIsCharRange:singleRectOnly:fullLineRectsOnly:inTextContainer:rectCount:rangeWithinContainer:glyphsDrawOutsideLines:] + 69
14 UIFoundation 0x0000000112711393 -[NSLayoutManager rectArrayForCharacterRange:withinSelectedCharacterRange:inTextContainer:rectCount:] + 35
15 UIKit 0x0000000108f83b4f -[_UITextContainerView updateInsertionPointStateAndRestartTimer:] + 276
16 UIFoundation 0x00000001126dcd1d -[NSLayoutManager(NSPrivate) _invalidateLayoutForExtendedCharacterRange:isSoft:invalidateUsage:] + 2225
17 UIFoundation 0x000000011270ad4c -[NSLayoutManager textContainerChangedGeometry:] + 256
18 UIFoundation 0x0000000112730b5e -[NSTextContainer setAttributesForExtraLineFragment:] + 288
19 UIKit 0x0000000108f72643 -[UITextView setFont:] + 282
20 VKSdkFramework 0x0000000109d3e02d -[VKShareDialogView initWithFrame:] + 5821
21 VKSdkFramework 0x0000000109d4089b -[VKShareDialogControllerInternal loadView] + 155
22 UIKit 0x0000000108647c0a -[UIViewController loadViewIfRequired] + 195
23 UIKit 0x000000010864845a -[UIViewController view] + 27
24 rayfund 0x0000000104fa50cc -[UIViewController(FIRAScreenClassName) fira_viewDidAppear:] + 292
25 UIKit 0x000000010868169b -[UINavigationController viewDidAppear:] + 85
26 UIKit 0x000000010864dcae -[UIViewController _setViewAppearState:isAnimating:] + 704
27 UIKit 0x000000010864e6d4 -[UIViewController _endAppearanceTransition:] + 197
28 VKSdkFramework 0x0000000109d38037 -[VKShareDialogController loadView] + 1399
29 UIKit 0x0000000108647c0a -[UIViewController loadViewIfRequired] + 195
30 UIKit 0x000000010864845a -[UIViewController view] + 27
31 UIKit 0x000000010866191f -[UIViewController _setPresentationController:] + 100
32 UIKit 0x000000010865940c -[UIViewController _presentViewController:modalSourceViewController:presentationController:animationController:interactionController:completion:] + 1320
33 UIKit 0x000000010865afae -[UIViewController _presentViewController:withAnimationController:completion:] + 4660
34 UIKit 0x000000010865de8a -[UIViewController _performCoordinatedPresentOrDismiss:animated:] + 532
35 UIKit 0x000000010865d962 -[UIViewController presentViewController:animated:completion:] + 181
36 rayfund 0x0000000104d9230e -[VkontakteSharing openShareDlg:resolver:rejecter:] + 446
37 rayfund 0x0000000104d93246 __44-[VkontakteSharing share:resolver:rejecter:]_block_invoke + 358
38 rayfund 0x00000001053a7d13 __119-[RCTImageLoader loadImageWithURLRequest:size:scale:clipped:resizeMode:progressBlock:partialLoadBlock:completionBlock:]_block_invoke_2 + 371
39 rayfund 0x00000001053a891a __80-[RCTImageLoader decodeImageData:size:scale:clipped:resizeMode:completionBlock:]_block_invoke_2 + 666
40 rayfund 0x00000001053a929e __80-[RCTImageLoader decodeImageData:size:scale:clipped:resizeMode:completionBlock:]_block_invoke_3.313 + 478
41 libdispatch.dylib 0x000000010c5fb4a6 _dispatch_call_block_and_release + 12
42 libdispatch.dylib 0x000000010c62405c _dispatch_client_callout + 8
43 libdispatch.dylib 0x000000010c606198 _dispatch_root_queue_drain + 1358
44 libdispatch.dylib 0x000000010c605bef _dispatch_worker_thread3 + 123
45 libsystem_pthread.dylib 0x000000010c9bb5a2 _pthread_wqthread + 1299
46 libsystem_pthread.dylib 0x000000010c9bb07d start_wqthread + 13
)
Заранее благодарен.
Правильно ли я понимаю, что логин и шеринг происходят от одного клика юзера? Я нахожу какие-то подобные issues (древние) в vk-ios.sdk, но сейчас нет возможности посмотреть в xcode. Возможно, поможет воткнуть таймаут между логином и шерингом.
Спасибо большое за столь скорый ответ, да, правильно, я тоже сейчас нахожу нечто подобное (это касательно таймаута). Версия vk-ios-sdk 1.4.6. Забыл сказать, ошибка, само собой, только на iOS. setTimeout и всякого рода другие задержки (пустотельный цикл, промисы) пробовал, не помогло. Нашел вот тут https://github.com/VKCOM/vk-ios-sdk/issues/119#issuecomment-53154551 нечто подобное, где в итоге решили проблему, насколько я понимаю, тоже задержкой, но только в ObjC. Не подскажете, где именно я могу попробовать нечто подобное?
Возможно стоит посмотреть на vkSdkDidDismissViewController и добавить его в VkontakteManager. Как его связать с js - надо подумать
Согласен, это надо, однако, пока что решил проблему немного топорно: добавил задержку в node_modules/react-native-vkontakte-login/ios/VkontakteSharing.m в самом конце файла
if (imagePath.length && _bridge.imageLoader) {
RCTImageSource *source = [RCTConvert RCTImageSource:data[@"image"]];
[_bridge.imageLoader loadImageWithURLRequest:source.request callback:^(NSError *error, UIImage *image) {
if (image == nil) {
NSLog(@"Failed to load image");
} else {
VKUploadImage *VKImage = [[VKUploadImage alloc] init];
VKImage.sourceImage = image;
shareDialog.uploadImages = @[VKImage];
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(500 * NSEC_PER_MSEC)), dispatch_get_main_queue(), ^{ // ДОБАВИЛ
[self openShareDlg:shareDialog resolver:resolve rejecter:reject];
}); // ДОБАВИЛ
}];
} else {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(500 * NSEC_PER_MSEC)), dispatch_get_main_queue(), ^{ // ДОБАВИЛ
[self openShareDlg:shareDialog resolver:resolve rejecter:reject];
}); // ДОБАВИЛ
}
Стоит ли закрывать issue? С одной стороны - вроде бы костылем подпер так, чтоб работало, с другой - это, наверное, все же не решение проблемы.
Пусть висит, в коде модуля же проблема не решена
Окей, спасибо за помощь :)