react-native-vkontakte-login icon indicating copy to clipboard operation
react-native-vkontakte-login copied to clipboard

Share dialog doesn't open

Open kshestakov opened this issue 7 years ago • 7 comments

Добрый день. Столкнулся с такой проблемой: не открывается диалог шаринга после нажатия на кнопку "поделиться в вк". То есть я нажимаю, открывается браузер с логином, логинюсь, браузер закрывается и диалог шаринга после этого не открывается. Ниже привел лог из 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
)

image

Заранее благодарен.

kshestakov avatar Jul 04 '17 09:07 kshestakov

Правильно ли я понимаю, что логин и шеринг происходят от одного клика юзера? Я нахожу какие-то подобные issues (древние) в vk-ios.sdk, но сейчас нет возможности посмотреть в xcode. Возможно, поможет воткнуть таймаут между логином и шерингом.

doomsower avatar Jul 04 '17 12:07 doomsower

Спасибо большое за столь скорый ответ, да, правильно, я тоже сейчас нахожу нечто подобное (это касательно таймаута). Версия vk-ios-sdk 1.4.6. Забыл сказать, ошибка, само собой, только на iOS. setTimeout и всякого рода другие задержки (пустотельный цикл, промисы) пробовал, не помогло. Нашел вот тут https://github.com/VKCOM/vk-ios-sdk/issues/119#issuecomment-53154551 нечто подобное, где в итоге решили проблему, насколько я понимаю, тоже задержкой, но только в ObjC. Не подскажете, где именно я могу попробовать нечто подобное?

kshestakov avatar Jul 04 '17 12:07 kshestakov

Возможно стоит посмотреть на vkSdkDidDismissViewController и добавить его в VkontakteManager. Как его связать с js - надо подумать

doomsower avatar Jul 04 '17 13:07 doomsower

Согласен, это надо, однако, пока что решил проблему немного топорно: добавил задержку в 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];
    }); // ДОБАВИЛ
  }

kshestakov avatar Jul 05 '17 10:07 kshestakov

Стоит ли закрывать issue? С одной стороны - вроде бы костылем подпер так, чтоб работало, с другой - это, наверное, все же не решение проблемы.

kshestakov avatar Jul 05 '17 10:07 kshestakov

Пусть висит, в коде модуля же проблема не решена

doomsower avatar Jul 05 '17 13:07 doomsower

Окей, спасибо за помощь :)

kshestakov avatar Jul 05 '17 13:07 kshestakov