gpt4 book ai didi

Android 自定义 URL 方案拒绝工作/如何在 OAuth 之后导航回 Android 应用程序

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:58:31 24 4
gpt4 key购买 nike

编辑,请查看我在这个问题下方的第二个答案,以获得更简洁、更简单的问题显示


我终于忍无可忍了。我正在使用 titanium 开发跨平台应用程序(IOS 和 Android),并通过 rest 调用连接到 salesforce api。我在这个问题上花了 3 天 20 个小时,但仍然卡住了。任何支持将不胜感激!因此,让我们开始吧。

我想要它做什么:该应用程序启动,检查用户是否已使用 oauth2 授权获得 token ,如果没有,则向用户提供 salesforce 登录屏幕。用户输入凭据并点击“允许”按钮,然后我们被重定向回应用

问题:从上面我想要它做的事情的描述来看,除了最后一行以粗体显示外,其他一切都有效。一旦用户点击“允许”按钮,我们就会收到这个未知的 url 方案错误:

error

代码:该代码几乎由 3 个不同的重要区域组成

  • 我的 index.js 文件,这是调用 salesforce 登录的地方
  • 我的 AuthService.js 文件,它是在 index.js 中调用 salesforce url 信息的地方
  • 我的 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: enter image description here

我尝试过的:我在这个问题上用谷歌搜索了自己。我的大部分修补工作是对我的“tiapp.xml”进行调整,以更改 android 标记中这些属性的属性和值,以及对“AuthService.js”文件和 salesforce 中的“redirect_rui”值进行许多调整“回调 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 -------------------------------------------------------

最佳答案

在为模式识别设置 list 方面,您最终应该得到类似于以下内容的内容

<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 中有一个方法可以检查您的模式是否在 Intent 中。类似于以下内容:

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 的一个怪癖是,对于更高版本,用户必须显示 Intent 。这实际上意味着在浏览器中输入 url 并按 go 是行不通的。它仅在用户单击链接或您触发 Intent 时触发。当您只想检测来自您自己的 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;
}

} );

关于Android 自定义 URL 方案拒绝工作/如何在 OAuth 之后导航回 Android 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35442592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com