Android 自定义 URL 方案拒绝工作/OAuth 后如何导航回 Android 应用程序
Android Custom URL Scheme Refuses To Work / How to Navigate Back to Android App After OAuth
编辑,请看我在这个问题下面的第二个答案,以获得更简洁、更简单的问题显示
我终于无计可施了。我正在使用 titanium 开发跨平台应用程序(IOS 和 Android),并通过休息电话连接到 salesforce api。我在这个问题上花了 3 天 20 个小时,但仍然卡住了。任何支持将不胜感激!那么让我们开始吧。
我想要它做什么:
该应用程序启动,检查用户是否已使用 oauth2 授权获得令牌,如果没有,则向用户提供 salesforce 登录屏幕。用户输入凭据并点击 "allow" 按钮和 然后我们被重定向回应用程序 .
问题:
从上面我想要它做的事情的描述来看,除了最后一行以粗体显示外,其他一切都有效。一旦用户点击 "allow" 按钮,我们就会收到这个未知的 url 方案错误:
代码:
该代码几乎由 3 个不同的重要区域组成
- 我的 index.js 文件,这是进行 salesforce 登录调用的地方
- 我的 AuthService.js 文件,这是在 index.js
中调用 salesforce url 信息的地方
- my tiapp.xml 为 android 自定义 url 方案保存配置内容
index.js
var Auth = require('AuthService');
Auth.openLogin();
AuthService.js 只有"openLogin"函数在这里很重要。
var loginWindow;
module.exports = {
get: function () {
console.log("made it into the auth.get function");
return Ti.App.Properties.getObject('auth');
},
set: function (data) {
Ti.App.Properties.setObject('auth', data);
console.log("auth set function was executed!!!");
},
erase: function () {
Ti.App.Properties.removeProperty('auth');
},
openLogin: function () {
console.log("made it into openLogin!!");
var webview = Titanium.UI.createWebView({url:'https://login.salesforce.com/services/oauth2/authorize' +
'?response_type=token&display=touch' +
'&redirect_uri=testapp://app.open' +
'&client_id=' + Ti.App.Properties.getString('salesforce_client_id')});
//console.log("Webview URL: " + webview.getUrl());
loginWindow = Titanium.UI.createWindow();
loginWindow.add(webview);
loginWindow.open({modal:true});
// attempt to log url to console here
//console.log("this is the webview URL during callback: " + webview.getUrl());
},
closeLogin: function () {
loginWindow.close();
}
};
tiapp.xml 为了简洁起见,我只包括我的 android 部分
<android xmlns:android="http://schemas.android.com/apk/res/android">
<manifest android:versionCode="1" android:versionName="1.00">
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
</manifest>
<activity
android:name=".TesterActivity"
android:exported="true"
android:label="@string/app_name" >
<intent-filter>
<data android:host="app.open" android:scheme="testapp" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</android>
向 Salesforce 注册的回调 Url:
我试过的:
我在这个问题上用谷歌搜索了自己。我的大部分修补工作都是对我的 "tiapp.xml" 进行调整,以更改 android 标签中这些属性的属性和值,以及对 [=90] 中的 "redirect_rui" 值进行许多调整=] 文件和 salesforce "callback url" 字段(因为这些值必须匹配,否则会出现 uri 不匹配错误)。
为了解决我的问题,我查看并尝试了一些解决方案:
https://gist.github.com/jasonkneen/5736738
android custom url scheme..?
How to implement my very own URI scheme on Android
仅举几例。
控制台登录应用程序执行:
[INFO] : Emulator is booted
[INFO] : SD card not required, skipping mount check
[INFO] : Emulator ready!
[INFO] : Creating unsigned apk
[INFO] : Processing /Users/michael.kellogg/Documents/Appcelerator_Studio_Workspace/tester/build/android/src
[INFO] : Writing unsigned apk: /Users/michael.kellogg/Documents/Appcelerator_Studio_Workspace/tester/build/android/bin/app-unsigned.apk
[INFO] : Using MD5withRSA signature algorithm
[INFO] : Signing apk: /Library/Java/JavaVirtualMachines/jdk1.8.0_72.jdk/Contents/Home/bin/jarsigner "-sigalg" "MD5withRSA" "-digestalg" "SHA1" "-keystore" "/Users/michael.kellogg/Library/Application Support/Titanium/mobilesdk/osx/5.1.2.GA/android/dev_keystore" "-storepass" "*******" "-signedjar" "/Users/michael.kellogg/Documents/Appcelerator_Studio_Workspace/tester/build/android/bin/tester.apk" "/Users/michael.kellogg/Documents/Appcelerator_Studio_Workspace/tester/build/android/bin/app-unsigned.apk" "tidev"
[INFO] : Aligning zip file: /Users/michael.kellogg/android-sdk/build-tools/23.0.2/zipalign "-v" "4" "/Users/michael.kellogg/Documents/Appcelerator_Studio_Workspace/tester/build/android/bin/tester.apk" "/Users/michael.kellogg/Documents/Appcelerator_Studio_Workspace/tester/build/android/bin/tester.apkz"
[INFO] : Writing build manifest: /Users/michael.kellogg/Documents/Appcelerator_Studio_Workspace/tester/build/android/build-manifest.json
[INFO] : Making sure the adb server is running
[INFO] : Installing apk: /Users/michael.kellogg/Documents/Appcelerator_Studio_Workspace/tester/build/android/bin/tester.apk
[INFO] : App successfully installed
[INFO] : Starting app: com.test.test/.TesterActivity
[INFO] : Application pid: 1160
[INFO] : Project built successfully in 3m 8s 295ms
[INFO] : art: Late-enabling JIT
[INFO] : art: JIT created with code_cache_capacity=2MB compile_threshold=1000
[INFO] : TiApplication: (main) [2,2] checkpoint, app created.
[INFO] : TiApplication: (main) [1067,1069] Titanium 5.1.2 (2015/12/16 19:00 ca822b2)
[INFO] : art: Background sticky concurrent mark sweep GC freed 15623(973KB) AllocSpace objects, 11(384KB) LOS objects, 41% free, 2MB/3MB, paused 2.142ms total 105.631ms
[INFO] : TiApplication: (main) [383,1452] Titanium Javascript runtime: v8
[INFO] : TiRootActivity: (main) [0,0] checkpoint, on root activity create, savedInstanceState: null
[WARN] : TiTempFileHelper: (main) [189,189] The external temp directory doesn't exist, skipping cleanup
[INFO] : TiRootActivity: (main) [0,0] checkpoint, on root activity resume. activity = com.test.test.TesterActivity@a298e02
[WARN] : V8Object: (KrollRuntimeThread) [1039,1228] Runtime disposed, cannot set property 'userAgent'
[INFO] : made it into openLogin!!
[INFO] : OpenGLRenderer: Initialized EGL, version 1.4
[WARN] : EGL_emulation: eglSurfaceAttrib not implemented
[WARN] : OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xb4d32b20, error=EGL_SUCCESS
[INFO] : WebViewFactory: Loading com.android.webview version 44.0.2403.119 (code 246011900)
[WARN] : System: ClassLoader referenced unknown path: /system/app/webview/lib/arm
[INFO] : LibraryLoader: Time to load native libraries: 36 ms (timestamps 588-624)
[INFO] : LibraryLoader: Expected native library version number "",actual native library version number ""
[INFO] : LibraryLoader: Expected native library version number "",actual native library version number ""
[INFO] : chromium: [INFO:library_loader_hooks.cc(120)] Chromium logging enabled: level = 0, default verbosity = 0
[INFO] : BrowserStartupController: Initializing chromium process, singleProcess=true
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[ERROR] : SysUtils: ApplicationContext is null in ApplicationStatus
[WARN] : chromium: [WARNING:resource_bundle.cc(285)] locale_file_path.empty()
[ERROR] : libEGL: validate_display:255 error 3008 (EGL_BAD_DISPLAY)
[ERROR] : libEGL: validate_display:255 error 3008 (EGL_BAD_DISPLAY)
[ERROR] : eglCodecCommon: glUtilsParamSize: unknow param 0x00008d57
[WARN] : AudioManagerAndroid: Requires BLUETOOTH permission
[ERROR] : DataReductionProxySettingListener: No DRP key due to exception:java.lang.ClassNotFoundException: com.android.webview.chromium.Drp
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : AwContents: onDetachedFromWindow called when already detached. Ignoring
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : chromium: [WARNING:data_reduction_proxy_config.cc(423)] SPDY proxy OFF at startup
[WARN] : EGL_emulation: eglSurfaceAttrib not implemented
[WARN] : OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xb4d32b40, error=EGL_SUCCESS
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background sticky concurrent mark sweep GC freed 7564(860KB) AllocSpace objects, 25(988KB) LOS objects, 0% free, 11MB/11MB, paused 1.603ms total 308.766ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 1948(144KB) AllocSpace objects, 3(8MB) LOS objects, 22% free, 13MB/17MB, paused 1.658ms total 271.298ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 148(6KB) AllocSpace objects, 13(36MB) LOS objects, 17% free, 19MB/23MB, paused 1.205ms total 327.978ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 91(3KB) AllocSpace objects, 5(14MB) LOS objects, 22% free, 13MB/17MB, paused 1.228ms total 201.595ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Suspending all threads took: 15.737ms
[INFO] : art: Background sticky concurrent mark sweep GC freed 261(13KB) AllocSpace objects, 2(5MB) LOS objects, 0% free, 25MB/25MB, paused 18.832ms total 174.330ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 98(20KB) AllocSpace objects, 7(19MB) LOS objects, 26% free, 11MB/15MB, paused 3.244ms total 302.681ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 1160
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background sticky concurrent mark sweep GC freed 11512(602KB) AllocSpace objects, 0(0B) LOS objects, 4% free, 14MB/15MB, paused 1.739ms total 174.806ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 301(32KB) AllocSpace objects, 2(5MB) LOS objects, 25% free, 11MB/15MB, paused 2.370ms total 274.103ms
[WARN] : EGL_emulation: eglSurfaceAttrib not implemented
[WARN] : OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x9d719f80, error=EGL_SUCCESS
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background sticky concurrent mark sweep GC freed 358(19KB) AllocSpace objects, 0(0B) LOS objects, 0% free, 17MB/17MB, paused 6.593ms total 277.832ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 148(5KB) AllocSpace objects, 3(8MB) LOS objects, 18% free, 17MB/21MB, paused 7.547ms total 414.524ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background sticky concurrent mark sweep GC freed 30(608B) AllocSpace objects, 1(2MB) LOS objects, 0% free, 23MB/23MB, paused 2.321ms total 159.615ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 36(1168B) AllocSpace objects, 5(14MB) LOS objects, 21% free, 14MB/18MB, paused 1.626ms total 197.175ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background sticky concurrent mark sweep GC freed 21(448B) AllocSpace objects, 0(0B) LOS objects, 0% free, 20MB/20MB, paused 37.280ms total 96.680ms
[INFO] : art: Background partial concurrent mark sweep GC freed 34(960B) AllocSpace objects, 4(11MB) LOS objects, 30% free, 8MB/12MB, paused 1.475ms total 106.381ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 56(3KB) AllocSpace objects, 3(8MB) LOS objects, 21% free, 14MB/18MB, paused 3.001ms total 243.577ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 1160
[WARN] : BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 1160
[WARN] : BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 1160
[INFO] : I/TiWebChromeClient.console: (main) [21796,21796] Not allowed to load local resource: file:///android_asset/webkit/android-weberror.png (0:data:text/html,chromewebdata)
[INFO] : art: Background sticky concurrent mark sweep GC freed 337(53KB) AllocSpace objects, 1(2MB) LOS objects, 6% free, 17MB/18MB, paused 43.249ms total 82.260ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 82(11KB) AllocSpace objects, 3(8MB) LOS objects, 21% free, 14MB/18MB, paused 1.613ms total 159.713ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background sticky concurrent mark sweep GC freed 27(544B) AllocSpace objects, 1(2MB) LOS objects, 6% free, 17MB/18MB, paused 21.912ms total 68.965ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 39(1056B) AllocSpace objects, 3(8MB) LOS objects, 21% free, 14MB/18MB, paused 1.523ms total 136.698ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[ERROR] : Surface: getSlotFromBufferLocked: unknown buffer: 0xaad48dc0
[INFO] : art: Background partial concurrent mark sweep GC freed 40(1104B) AllocSpace objects, 5(14MB) LOS objects, 25% free, 11MB/15MB, paused 3.871ms total 157.623ms
[INFO] : APSAnalyticsService: Analytics Service Started
[INFO] : APSAnalyticsService: Stopping Analytics Service
-- End application log -------------------------------------------------------
无法将其放入评论中,因此创建一个答案。请您尝试一下,看看是否有帮助。
<android xmlns:android="http://schemas.android.com/apk/res/android">
<manifest>
<application android:icon="@drawable/appicon" android:label="MyApp" android:name="MyApplication">
<activity android:label="MyApp" android:name=".MyApplicationActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="mytestapplication" />
</intent-filter>
</activity>
</application>
</manifest>
你能不能试一试,看看是否可行。您还可以查看此 Git Post.
中提到的 TiApp.xml 条目
请求您尝试并告诉我们,如果这不起作用,那么我们可以尝试其他方法。
经过大约 64 小时的互联网搜索和无数次尝试,我终于找到了解决此问题的方法。耶我!我必须承认我对这个问题花了多长时间才解决感到有点羞愧。
问题: 在 salesforce 授权后无法找到导航回 android 应用程序的方法(自定义 url 方案非常痛苦 android).
解决方案:四处搜索后,我发现了一个来自 salesforce 的代码示例,它完成了我在这里尝试做的事情:
这是上面文章中提供的 github link,其中包含非常需要的代码:
https://github.com/appcelerator-developer-relations/Force
TLDR: 这里真正的关键是不要使用带有 android 和钛的自定义 url 方案。相反,上面列出的 github 代码在 web 视图中打开 auth 页面,然后使用侦听器在 auth 完成后关闭该 webview 并打开您需要的任何视图。
说明: 要在 IOS 上导航回我的应用程序,我所要做的就是按顺序在我的 tiapp.xml 文件中添加几行使用自定义 url 方案。它工作得非常迅速和简单,没有任何头痛。自然地,我假设自定义 url 方案是 android 的方式,简单吧?错误的。我花了很多时间如上所述尝试在 android 上制作自定义 url 方案但无济于事。网上似乎有很多关于 android 自定义 url 方案的信息,但其中 none 对我有用,相信我,我尝试了很多东西(毕竟它大约需要 64 小时) .最后我只是试图在网上找到一个代码示例来完成我想要的。这是我找到的那个。
在为模式识别设置清单方面,您最终应该得到类似于以下内容的内容
<manifest ...>
...
<application ...>
...
<activity ...
android:exported="true"> <!-- Make it exported -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter android:label="...">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="testapp" />
<data android:host="app" /> <!-- cover all your bases -->
<data android:host="app.open" />
</intent-filter>
</activity>
</application>
</manifest>
然后我会在那个 activity 中有一个方法可以检查您的架构是否在意图中。类似于以下内容:
protected void onCreate(final Bundle savedInstanceState) {
...
checkIntent( getIntent() );
}
protected void onNewIntent(final Intent intent) {
...
checkIntent( intent );
}
private void checkIntent(Intent intent) {
if ( intent.getDataString() != null && Intent.ACTION_VIEW.equals(intent.getAction()) ) {
//If we reached here we have some kind of deep link or custom schema
//so lets identify which schema
if ( "testapp".equals(data.getScheme().toLowerCase()) ) {
//my tests were able to reach here
}
}
}
Android 的一个 怪癖 是,对于更高版本,用户必须 显示意图 。这实际上意味着在浏览器中输入 url 并按 go 将不起作用。它仅在用户单击 link 或您触发意图时触发。当您只想检测来自您自己的 WebView(而不是外部浏览器)的重定向时,您可以解决这个问题:
myWebView.setWebViewClient( new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("testapp://")) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData( Uri.parse(url) );
view.getContext().startActivity( intent );
return true; //with return true, the webview wont try rendering the url
}
return false;
}
} );
有一些在我看来合法的解决方法。
因此,与 shouldOverrideUrlLoading()
一起,WebViewClient
允许覆盖 onErrorRecieved()
并且实际上它将 failingUrl
作为参数传递。
private val webViewClient = object : WebViewClient() {
@Suppress("OverridingDeprecatedMember")
override fun onReceivedError(view: WebView?, errorCode: Int, description: String?, failingUrl: String?) {
if (failingUrl != null) {
handleCallbackUrl(Uri.parse(failingUrl))
}
}
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?) = when {
handleCallbackUrl(request?.url) -> true
else -> super.shouldOverrideUrlLoading(view, request)
}
}
编辑,请看我在这个问题下面的第二个答案,以获得更简洁、更简单的问题显示
我终于无计可施了。我正在使用 titanium 开发跨平台应用程序(IOS 和 Android),并通过休息电话连接到 salesforce api。我在这个问题上花了 3 天 20 个小时,但仍然卡住了。任何支持将不胜感激!那么让我们开始吧。
我想要它做什么: 该应用程序启动,检查用户是否已使用 oauth2 授权获得令牌,如果没有,则向用户提供 salesforce 登录屏幕。用户输入凭据并点击 "allow" 按钮和 然后我们被重定向回应用程序 .
问题: 从上面我想要它做的事情的描述来看,除了最后一行以粗体显示外,其他一切都有效。一旦用户点击 "allow" 按钮,我们就会收到这个未知的 url 方案错误:
代码: 该代码几乎由 3 个不同的重要区域组成
- 我的 index.js 文件,这是进行 salesforce 登录调用的地方
- 我的 AuthService.js 文件,这是在 index.js 中调用 salesforce url 信息的地方
- my tiapp.xml 为 android 自定义 url 方案保存配置内容
index.js
var Auth = require('AuthService');
Auth.openLogin();
AuthService.js 只有"openLogin"函数在这里很重要。
var loginWindow;
module.exports = {
get: function () {
console.log("made it into the auth.get function");
return Ti.App.Properties.getObject('auth');
},
set: function (data) {
Ti.App.Properties.setObject('auth', data);
console.log("auth set function was executed!!!");
},
erase: function () {
Ti.App.Properties.removeProperty('auth');
},
openLogin: function () {
console.log("made it into openLogin!!");
var webview = Titanium.UI.createWebView({url:'https://login.salesforce.com/services/oauth2/authorize' +
'?response_type=token&display=touch' +
'&redirect_uri=testapp://app.open' +
'&client_id=' + Ti.App.Properties.getString('salesforce_client_id')});
//console.log("Webview URL: " + webview.getUrl());
loginWindow = Titanium.UI.createWindow();
loginWindow.add(webview);
loginWindow.open({modal:true});
// attempt to log url to console here
//console.log("this is the webview URL during callback: " + webview.getUrl());
},
closeLogin: function () {
loginWindow.close();
}
};
tiapp.xml 为了简洁起见,我只包括我的 android 部分
<android xmlns:android="http://schemas.android.com/apk/res/android">
<manifest android:versionCode="1" android:versionName="1.00">
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
</manifest>
<activity
android:name=".TesterActivity"
android:exported="true"
android:label="@string/app_name" >
<intent-filter>
<data android:host="app.open" android:scheme="testapp" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</android>
向 Salesforce 注册的回调 Url:
我试过的: 我在这个问题上用谷歌搜索了自己。我的大部分修补工作都是对我的 "tiapp.xml" 进行调整,以更改 android 标签中这些属性的属性和值,以及对 [=90] 中的 "redirect_rui" 值进行许多调整=] 文件和 salesforce "callback url" 字段(因为这些值必须匹配,否则会出现 uri 不匹配错误)。
为了解决我的问题,我查看并尝试了一些解决方案: https://gist.github.com/jasonkneen/5736738
android custom url scheme..?
How to implement my very own URI scheme on Android
仅举几例。
控制台登录应用程序执行:
[INFO] : Emulator is booted
[INFO] : SD card not required, skipping mount check
[INFO] : Emulator ready!
[INFO] : Creating unsigned apk
[INFO] : Processing /Users/michael.kellogg/Documents/Appcelerator_Studio_Workspace/tester/build/android/src
[INFO] : Writing unsigned apk: /Users/michael.kellogg/Documents/Appcelerator_Studio_Workspace/tester/build/android/bin/app-unsigned.apk
[INFO] : Using MD5withRSA signature algorithm
[INFO] : Signing apk: /Library/Java/JavaVirtualMachines/jdk1.8.0_72.jdk/Contents/Home/bin/jarsigner "-sigalg" "MD5withRSA" "-digestalg" "SHA1" "-keystore" "/Users/michael.kellogg/Library/Application Support/Titanium/mobilesdk/osx/5.1.2.GA/android/dev_keystore" "-storepass" "*******" "-signedjar" "/Users/michael.kellogg/Documents/Appcelerator_Studio_Workspace/tester/build/android/bin/tester.apk" "/Users/michael.kellogg/Documents/Appcelerator_Studio_Workspace/tester/build/android/bin/app-unsigned.apk" "tidev"
[INFO] : Aligning zip file: /Users/michael.kellogg/android-sdk/build-tools/23.0.2/zipalign "-v" "4" "/Users/michael.kellogg/Documents/Appcelerator_Studio_Workspace/tester/build/android/bin/tester.apk" "/Users/michael.kellogg/Documents/Appcelerator_Studio_Workspace/tester/build/android/bin/tester.apkz"
[INFO] : Writing build manifest: /Users/michael.kellogg/Documents/Appcelerator_Studio_Workspace/tester/build/android/build-manifest.json
[INFO] : Making sure the adb server is running
[INFO] : Installing apk: /Users/michael.kellogg/Documents/Appcelerator_Studio_Workspace/tester/build/android/bin/tester.apk
[INFO] : App successfully installed
[INFO] : Starting app: com.test.test/.TesterActivity
[INFO] : Application pid: 1160
[INFO] : Project built successfully in 3m 8s 295ms
[INFO] : art: Late-enabling JIT
[INFO] : art: JIT created with code_cache_capacity=2MB compile_threshold=1000
[INFO] : TiApplication: (main) [2,2] checkpoint, app created.
[INFO] : TiApplication: (main) [1067,1069] Titanium 5.1.2 (2015/12/16 19:00 ca822b2)
[INFO] : art: Background sticky concurrent mark sweep GC freed 15623(973KB) AllocSpace objects, 11(384KB) LOS objects, 41% free, 2MB/3MB, paused 2.142ms total 105.631ms
[INFO] : TiApplication: (main) [383,1452] Titanium Javascript runtime: v8
[INFO] : TiRootActivity: (main) [0,0] checkpoint, on root activity create, savedInstanceState: null
[WARN] : TiTempFileHelper: (main) [189,189] The external temp directory doesn't exist, skipping cleanup
[INFO] : TiRootActivity: (main) [0,0] checkpoint, on root activity resume. activity = com.test.test.TesterActivity@a298e02
[WARN] : V8Object: (KrollRuntimeThread) [1039,1228] Runtime disposed, cannot set property 'userAgent'
[INFO] : made it into openLogin!!
[INFO] : OpenGLRenderer: Initialized EGL, version 1.4
[WARN] : EGL_emulation: eglSurfaceAttrib not implemented
[WARN] : OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xb4d32b20, error=EGL_SUCCESS
[INFO] : WebViewFactory: Loading com.android.webview version 44.0.2403.119 (code 246011900)
[WARN] : System: ClassLoader referenced unknown path: /system/app/webview/lib/arm
[INFO] : LibraryLoader: Time to load native libraries: 36 ms (timestamps 588-624)
[INFO] : LibraryLoader: Expected native library version number "",actual native library version number ""
[INFO] : LibraryLoader: Expected native library version number "",actual native library version number ""
[INFO] : chromium: [INFO:library_loader_hooks.cc(120)] Chromium logging enabled: level = 0, default verbosity = 0
[INFO] : BrowserStartupController: Initializing chromium process, singleProcess=true
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[ERROR] : SysUtils: ApplicationContext is null in ApplicationStatus
[WARN] : chromium: [WARNING:resource_bundle.cc(285)] locale_file_path.empty()
[ERROR] : libEGL: validate_display:255 error 3008 (EGL_BAD_DISPLAY)
[ERROR] : libEGL: validate_display:255 error 3008 (EGL_BAD_DISPLAY)
[ERROR] : eglCodecCommon: glUtilsParamSize: unknow param 0x00008d57
[WARN] : AudioManagerAndroid: Requires BLUETOOTH permission
[ERROR] : DataReductionProxySettingListener: No DRP key due to exception:java.lang.ClassNotFoundException: com.android.webview.chromium.Drp
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : AwContents: onDetachedFromWindow called when already detached. Ignoring
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : chromium: [WARNING:data_reduction_proxy_config.cc(423)] SPDY proxy OFF at startup
[WARN] : EGL_emulation: eglSurfaceAttrib not implemented
[WARN] : OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xb4d32b40, error=EGL_SUCCESS
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background sticky concurrent mark sweep GC freed 7564(860KB) AllocSpace objects, 25(988KB) LOS objects, 0% free, 11MB/11MB, paused 1.603ms total 308.766ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 1948(144KB) AllocSpace objects, 3(8MB) LOS objects, 22% free, 13MB/17MB, paused 1.658ms total 271.298ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 148(6KB) AllocSpace objects, 13(36MB) LOS objects, 17% free, 19MB/23MB, paused 1.205ms total 327.978ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 91(3KB) AllocSpace objects, 5(14MB) LOS objects, 22% free, 13MB/17MB, paused 1.228ms total 201.595ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Suspending all threads took: 15.737ms
[INFO] : art: Background sticky concurrent mark sweep GC freed 261(13KB) AllocSpace objects, 2(5MB) LOS objects, 0% free, 25MB/25MB, paused 18.832ms total 174.330ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 98(20KB) AllocSpace objects, 7(19MB) LOS objects, 26% free, 11MB/15MB, paused 3.244ms total 302.681ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 1160
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background sticky concurrent mark sweep GC freed 11512(602KB) AllocSpace objects, 0(0B) LOS objects, 4% free, 14MB/15MB, paused 1.739ms total 174.806ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 301(32KB) AllocSpace objects, 2(5MB) LOS objects, 25% free, 11MB/15MB, paused 2.370ms total 274.103ms
[WARN] : EGL_emulation: eglSurfaceAttrib not implemented
[WARN] : OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x9d719f80, error=EGL_SUCCESS
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background sticky concurrent mark sweep GC freed 358(19KB) AllocSpace objects, 0(0B) LOS objects, 0% free, 17MB/17MB, paused 6.593ms total 277.832ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 148(5KB) AllocSpace objects, 3(8MB) LOS objects, 18% free, 17MB/21MB, paused 7.547ms total 414.524ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background sticky concurrent mark sweep GC freed 30(608B) AllocSpace objects, 1(2MB) LOS objects, 0% free, 23MB/23MB, paused 2.321ms total 159.615ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 36(1168B) AllocSpace objects, 5(14MB) LOS objects, 21% free, 14MB/18MB, paused 1.626ms total 197.175ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background sticky concurrent mark sweep GC freed 21(448B) AllocSpace objects, 0(0B) LOS objects, 0% free, 20MB/20MB, paused 37.280ms total 96.680ms
[INFO] : art: Background partial concurrent mark sweep GC freed 34(960B) AllocSpace objects, 4(11MB) LOS objects, 30% free, 8MB/12MB, paused 1.475ms total 106.381ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 56(3KB) AllocSpace objects, 3(8MB) LOS objects, 21% free, 14MB/18MB, paused 3.001ms total 243.577ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 1160
[WARN] : BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 1160
[WARN] : BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 1160
[INFO] : I/TiWebChromeClient.console: (main) [21796,21796] Not allowed to load local resource: file:///android_asset/webkit/android-weberror.png (0:data:text/html,chromewebdata)
[INFO] : art: Background sticky concurrent mark sweep GC freed 337(53KB) AllocSpace objects, 1(2MB) LOS objects, 6% free, 17MB/18MB, paused 43.249ms total 82.260ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 82(11KB) AllocSpace objects, 3(8MB) LOS objects, 21% free, 14MB/18MB, paused 1.613ms total 159.713ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background sticky concurrent mark sweep GC freed 27(544B) AllocSpace objects, 1(2MB) LOS objects, 6% free, 17MB/18MB, paused 21.912ms total 68.965ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[INFO] : art: Background partial concurrent mark sweep GC freed 39(1056B) AllocSpace objects, 3(8MB) LOS objects, 21% free, 14MB/18MB, paused 1.523ms total 136.698ms
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[WARN] : art: Attempt to remove non-JNI local reference, dumping thread
[ERROR] : Surface: getSlotFromBufferLocked: unknown buffer: 0xaad48dc0
[INFO] : art: Background partial concurrent mark sweep GC freed 40(1104B) AllocSpace objects, 5(14MB) LOS objects, 25% free, 11MB/15MB, paused 3.871ms total 157.623ms
[INFO] : APSAnalyticsService: Analytics Service Started
[INFO] : APSAnalyticsService: Stopping Analytics Service
-- End application log -------------------------------------------------------
无法将其放入评论中,因此创建一个答案。请您尝试一下,看看是否有帮助。
<android xmlns:android="http://schemas.android.com/apk/res/android">
<manifest>
<application android:icon="@drawable/appicon" android:label="MyApp" android:name="MyApplication">
<activity android:label="MyApp" android:name=".MyApplicationActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="mytestapplication" />
</intent-filter>
</activity>
</application>
</manifest>
你能不能试一试,看看是否可行。您还可以查看此 Git Post.
中提到的 TiApp.xml 条目请求您尝试并告诉我们,如果这不起作用,那么我们可以尝试其他方法。
经过大约 64 小时的互联网搜索和无数次尝试,我终于找到了解决此问题的方法。耶我!我必须承认我对这个问题花了多长时间才解决感到有点羞愧。
问题: 在 salesforce 授权后无法找到导航回 android 应用程序的方法(自定义 url 方案非常痛苦 android).
解决方案:四处搜索后,我发现了一个来自 salesforce 的代码示例,它完成了我在这里尝试做的事情:
这是上面文章中提供的 github link,其中包含非常需要的代码:
https://github.com/appcelerator-developer-relations/Force
TLDR: 这里真正的关键是不要使用带有 android 和钛的自定义 url 方案。相反,上面列出的 github 代码在 web 视图中打开 auth 页面,然后使用侦听器在 auth 完成后关闭该 webview 并打开您需要的任何视图。
说明: 要在 IOS 上导航回我的应用程序,我所要做的就是按顺序在我的 tiapp.xml 文件中添加几行使用自定义 url 方案。它工作得非常迅速和简单,没有任何头痛。自然地,我假设自定义 url 方案是 android 的方式,简单吧?错误的。我花了很多时间如上所述尝试在 android 上制作自定义 url 方案但无济于事。网上似乎有很多关于 android 自定义 url 方案的信息,但其中 none 对我有用,相信我,我尝试了很多东西(毕竟它大约需要 64 小时) .最后我只是试图在网上找到一个代码示例来完成我想要的。这是我找到的那个。
在为模式识别设置清单方面,您最终应该得到类似于以下内容的内容
<manifest ...>
...
<application ...>
...
<activity ...
android:exported="true"> <!-- Make it exported -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter android:label="...">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="testapp" />
<data android:host="app" /> <!-- cover all your bases -->
<data android:host="app.open" />
</intent-filter>
</activity>
</application>
</manifest>
然后我会在那个 activity 中有一个方法可以检查您的架构是否在意图中。类似于以下内容:
protected void onCreate(final Bundle savedInstanceState) {
...
checkIntent( getIntent() );
}
protected void onNewIntent(final Intent intent) {
...
checkIntent( intent );
}
private void checkIntent(Intent intent) {
if ( intent.getDataString() != null && Intent.ACTION_VIEW.equals(intent.getAction()) ) {
//If we reached here we have some kind of deep link or custom schema
//so lets identify which schema
if ( "testapp".equals(data.getScheme().toLowerCase()) ) {
//my tests were able to reach here
}
}
}
Android 的一个 怪癖 是,对于更高版本,用户必须 显示意图 。这实际上意味着在浏览器中输入 url 并按 go 将不起作用。它仅在用户单击 link 或您触发意图时触发。当您只想检测来自您自己的 WebView(而不是外部浏览器)的重定向时,您可以解决这个问题:
myWebView.setWebViewClient( new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("testapp://")) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData( Uri.parse(url) );
view.getContext().startActivity( intent );
return true; //with return true, the webview wont try rendering the url
}
return false;
}
} );
有一些在我看来合法的解决方法。
因此,与 shouldOverrideUrlLoading()
一起,WebViewClient
允许覆盖 onErrorRecieved()
并且实际上它将 failingUrl
作为参数传递。
private val webViewClient = object : WebViewClient() {
@Suppress("OverridingDeprecatedMember")
override fun onReceivedError(view: WebView?, errorCode: Int, description: String?, failingUrl: String?) {
if (failingUrl != null) {
handleCallbackUrl(Uri.parse(failingUrl))
}
}
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?) = when {
handleCallbackUrl(request?.url) -> true
else -> super.shouldOverrideUrlLoading(view, request)
}
}