VKCOM / vk-ios-sdk

iOS library for working with VK API, authorization through VK app, using VK functions
MIT License
296 stars 167 forks source link

Авторизация без установленного приложения #464

Closed pocheshire closed 7 years ago

pocheshire commented 7 years ago

Здравствуйте.

На устройствах с версией iOS 10.1 и 10.1.1 без установленного приложения VK не работает авторизация через VkSdk.

Output:

-canOpenURL: failed for URL: "vkauthorize://authorize" - error: "Не удалось завершить операцию. (OSStatus, ошибка -10814)"
+[VKSdk instance] VKSdk should be initialized. Use [VKSdk initialize:delegate] method

Читать умею, подобные Issues находил, поэтому сразу полез проверять UiDelegate. Однако следующий код вызывается и в дебаге видно, что все ок:

_lpVKSdkDelegate = new LPVKSdkDelegate();
_lpVkUiDelegate = new LPVKSdkUiDelegate();

var sdkInstance = VKSdk.Initialize(VK_APP_ID);
sdkInstance.RegisterDelegate(_lpVKSdkDelegate);
sdkInstance.UiDelegate = _lpVkUiDelegate;

Это обертка над вашим SDK для Xamarin, там все 1 в 1 только можно использовать с Xamarin, поэтому код на C#, но, думаю, он понятен.

Баг наблюдается только на устройствах, на симуляторе отрабатывает SafariViewController.

ApiVersion – 5.40

suzhaev commented 7 years ago

Здравствуйте. url-схемы тоже прописали?

suzhaev commented 7 years ago

По идее нужно использовать метод initializeWithAppId, а не initialize

pocheshire commented 7 years ago

Конечно.

</array>
    <key>CFBundleURLTypes</key>
    <array>

            <key>CFBundleURLSchemes</key>
            <array>
                <string>vk{App_ID}</string>
            </array>
        </dict>

    </array>

    <key>LSApplicationQueriesSchemes</key>
    <array>

        <string>vk</string>
        <string>vk-share</string>
        <string>vkauthorize</string>

    </array>
    <key>NSAppTransportSecurity</key>
    <dict>

И в AppDelegate в OpenUrl вызываю соответствующий метод из SDK.

На 9+ версиях iOS все отрабатывало.

pocheshire commented 7 years ago

Он и используется. При сборке обёртки метод initializeWithAppId мапится в Initialize(string appId)

suzhaev commented 7 years ago

Просто такая ошибка

VKSdk should be initialized.

может появится только если vkSdkInstance == nil

Собственно вот код

+ (instancetype)instance {
    ZAssert(vkSdkInstance, @"VKSdk should be initialized. Use [VKSdk initialize:delegate] method");
    return vkSdkInstance;
}

На iOS 10.0 все ок? Могу предположить, что проблема в Xamarin. Есть возможность проверить такой же кейс на objective-c?

pocheshire commented 7 years ago

В 10-ке поменялся принцип работы с CanOpenUrl. Теперь при вызове OpenUrl можно задать callback, а не вызывать сначала CanOpenUrl, проверять на успех и вызывать OpenUrl. Причём CanOpenUrl сейчас работает у нас не корректно – например, при попытке кинуть в карты, он говорит, что не может их открыть (хотя карты установлены), а через callback в OpenUrl все отрабатывает

pocheshire commented 7 years ago

Предположение, извините, отклоняется :-)

Проверял vkSdkInstance перед вызовом WakeUpSession. Был не nil. К тому же при установленном приложении Вк все отрабатывает отлично, не может же от установки приложения зависеть инициализациях instance при вызове одного и того же кода. Ну и перед выводом сообщения, что instance == nil пишется ещё одна строка. Про невозможность открыть URL

suzhaev commented 7 years ago

Колбэки для iOS 10 мы поддерживаем https://github.com/VKCOM/vk-ios-sdk/commit/1d472a0a7f759ef3dd6be1027fb734a7ee774f30

У вас последняя версия sdk?

pocheshire commented 7 years ago

Версию перепроверю

pocheshire commented 7 years ago

Да, к сожалению версия старая, хотя автор недавно выкатывал обновление. Текущая 1.3.16. Завтра проверю на новой версии и отпишусь о результатах. Ссылка на текущую версию, если интересно: https://github.com/mattleibow/vkontakte-bindings/tree/master/source Будет здорово, если сделаете официальную поддержку, хотя бы и через такую обертку

pocheshire commented 7 years ago

На версии 1.4.4 все заработало.

Сделал форк и обновил iOS версию SDK