Mik*_*ogg 11 rest android salesforce titanium appcelerator
编辑,请在这个问题下面看到我的第二个答案,以便更简洁,更简单地显示问题
我终于打败了我的智慧.我正在使用钛的跨平台应用程序(IOS和Android),并通过休息呼叫连接到salesforce api.我在这个问题上花了3天20个小时,但仍然陷入困境.任何支持将非常感谢!所以让我们潜入.
我想要它做什么: 应用程序启动,检查用户是否已使用oauth2授权给予令牌,如果没有,则为用户提供salesforce登录屏幕.用户输入凭据并点击"允许"按钮,然后我们被重定向回应用程序.
问题: 从上面我想要它做的描述一切都有效,除了粗体的最后一行.一旦用户点击"允许"按钮,我们就会收到此未知的网址方案错误:

代码: 代码几乎由3个不同的重要区域组成
index.js
var Auth = require('AuthService');
Auth.openLogin();
Run Code Online (Sandbox Code Playgroud)
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();
}
};
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
What I have tried: I have googled myself blue on this issue. Most of my tinkering has been making adjustments to my "tiapp.xml" in changing the properties and values of those properties within the android tag as well as many adjustments to the "redirect_rui" value in my "AuthService.js" file and in salesforce "callback url" field (since these values have to match or you get a uri mismatch error).
Here are some solutions I have looked at and attempted in order to fix my problem: https://gist.github.com/jasonkneen/5736738
How to implement my very own URI scheme on Android
Just to name a few.
console log on app execution:
[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 -------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
在为架构识别设置清单方面,您应该得到类似于以下内容的内容
<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>
Run Code Online (Sandbox Code Playgroud)
然后我会在该活动中有一个方法,可以检查您的架构是否在意图中.类似于以下内容:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
机器人的一个怪癖是用户必须在以后的版本中显示意图.这实际上意味着在浏览器中键入URL并按下go将无法正常工作.它仅在用户单击链接或触发意图时触发.当您只想从自己的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;
}
} );
Run Code Online (Sandbox Code Playgroud)
经过64小时的互联网搜索和无数次的尝试,我终于找到了解决这个问题的方法.我也好!我必须承认,我对这个问题需要多长时间才能解决感到有点遗憾.
问题:在salesforce授权后无法找到导航回Android应用程序的方法(自定义网址方案对于Android非常痛苦).
解决方案:在搜索之后,我发现了一个来自salesforce的代码示例,它执行了我在此处尝试执行的操作:
这是上面文章中提供的github链接,它具有非常需要的代码:
https://github.com/appcelerator-developer-relations/Force
TLDR:这里真正的关键是不使用Android和钛的自定义url方案.相反,上面列出的github代码在Web视图中打开auth页面,然后使用侦听器在auth完成后关闭该webview并打开您需要的任何视图.
说明:要在IOS上导航回我的应用程序,我所要做的就是在我的tiapp.xml文件中添加几行以便使用自定义URL方案.它工作得非常快,简直没有任何头痛.当然我假设一个自定义网址方案是与Android的方式,简单对吧?假.我花了很多时间如上所列,尝试在Android上制作自定义网址方案无济于事.似乎有很多关于Android自定义网址方案的在线信息,但它们都没有为我工作,相信我,我尝试了很多东西(毕竟它是大约64小时).最后,我只是试图在网上找到一个代码,它做了我想要的.这是我找到的那个.
| 归档时间: |
|
| 查看次数: |
11128 次 |
| 最近记录: |