摘要:參數(shù)格式為,其中為,僅支持一層字典否調(diào)用成功的回調(diào)函數(shù)否調(diào)用失敗的回調(diào)函數(shù)否調(diào)用結(jié)束的回調(diào)函數(shù)調(diào)用成功失敗都會(huì)執(zhí)行警告框。
概述
OpenApp+ 一個(gè)小程序容器,配置簡(jiǎn)單、功能完善、界面流暢、開(kāi)箱即用!使用OpenApp+可以快速擴(kuò)展你的APP,使其擁有與微信一樣的功能擴(kuò)展可能,讓App的所有的功能都通過(guò)小程序來(lái)實(shí)現(xiàn),動(dòng)態(tài)更新,更快的響應(yīng)用戶需求。其擁有的管理具備版本管理功能,讓功能發(fā)布更加隨心。
集成SDK 獲得 AppKey在平臺(tái)上注冊(cè)帳號(hào),可以任意添加新 App,每一個(gè) App 都有一個(gè)唯一的 AppKey 作為標(biāo)識(shí),平臺(tái)提供客戶端的AppKey、Appsecret和服務(wù)端的AppKey、Appsecret以便接入
iOS集成 Cocoapods 安裝推薦使用 CocoaPods 的方式安裝使用。
CocoaPods 是一個(gè)廣泛適用于Objective-C依賴管理工具,能夠自動(dòng)配置項(xiàng)目,簡(jiǎn)化你配置Openapp+的過(guò)程,使用以下命令行安裝
$ gem install cocoapods
OpenApplus 安裝使用CocosPods集成Openapp+到Xcode,需要編寫(xiě)/podspec/OpenApplus.podspec文件
Pod::Spec.new do |s| s.name = "OpenApplus" s.version = "1.0.0" s.summary = "OpenApplus framework" s.homepage = "http://github.com/linwaiwai/openapplus" s.license = { :type => "OpenApplus License, Version 1.0.0", :text => <<-LICENSE Licensed under the OpenApplus License, Version 1.0.0 (the "License"); you may not use this file except in compliance with the License. LICENSE } s.author = "linwaiwai" s.platform = :ios, "6.0.0" s.source = { :git => "https://github.com/linwaiwai/openapplus.git", :branch => "master"} s.frameworks = "UIKit" s.requires_arc = true s.dependency "SDWebImage", "3.7.5" s.dependency "SSZipArchive", "1.6.2" s.dependency "SVProgressHUD", "2.1.2" s.dependency "Masonry", "1.0.2" s.dependency "UMengUShare/Social/WeChat", "6.3.0" s.dependency "MJRefresh", "3.1.12" s.dependency "libextobjc", "~> 0.4.1" s.dependency "AFNetworking" s.dependency "OpenUDID" s.subspec "OpenApplus" do |ss| ss.vendored_frameworks = "*.framework" ss.vendored_libraries = "*.a" ss.source_files = "*.h" ss.resource = "*.bundle" end end在Podfile文件加入
source "https://github.com/CocoaPods/Specs.git" platform :ios, "8.0" #忽略引入庫(kù)的警告 inhibit_all_warnings! target "openapplus-ios-demo" do pod "OpenApplus", :podspec => "./podspec/OpenApplus.podspec" end在工程中Info.plist文件中添加如下項(xiàng)
運(yùn)行NSAppTransportSecurity NSAllowsArbitraryLoads
在 AppDelegate.m 里按順序調(diào)用三個(gè)方法:
1、調(diào)用 +startWithAppKey: ,參數(shù)為第一步獲得的 AppKey。
2、調(diào)用 +sync 方法檢查包更新。
在AppDelegate.m或ViewController.m中調(diào)用 navigateToMiniProgram: 加載小程序項(xiàng)目,參數(shù)為在平臺(tái)中創(chuàng)建的項(xiàng)目的名稱。
#import <"openapplus/openapplus.h"> @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:testViewController]; self.window.rootViewController = navigationController; [self.window makeKeyAndVisible]; [OpenApplus startWithAppKey:@"test"]; [OpenApplus sync]; [OpenApplus setNavigationController:navigationController]; // JS_APPID 為小程序的APP_ID [OpenApplus navigateToMiniProgram:@"openapplus://jsApp/#JS_APPID#" completion:^{ }]; ... } @end
上述例子是把 Openapplus 同步放在 -application:didFinishLaunchingWithOptions: 里,若希望包能及時(shí)推送,可以把 [OpenApplus sync] 放在 -applicationDidBecomeActive: 里,每次喚醒都能同步更新 OpenApplus 包,不需要等用戶下次啟動(dòng)。
Android集成 Android Studio集成下載SDK功能組件,解壓.zip文件得到相應(yīng)組件包(openapplus-release.aar),在Android Studio的項(xiàng)目工程libs目錄中拷入相關(guān)組件jar包。
右鍵Android Studio的項(xiàng)目工程—>選擇Open Module Settings —>在 Project Structure彈出框中 —>選擇 Dependencies選項(xiàng)卡 —>點(diǎn)擊左下“+”—>選擇組件包類型—>引入相應(yīng)的組件包。
運(yùn)行在項(xiàng)目工程的自定義application中的onCreate方法中添加以下兩個(gè)方法:
注意:一定要在主進(jìn)程進(jìn)行該項(xiàng)操作
OpenApplus.registerApp(this, SampleContants.APPID, SampleContants.APP_SECRET); OpenApplus.sync(); OpenApplus.setCallback(new OpenApplusCallback() { @Override public void invoke(OACallbackType type, JSONObject data, OpenApplusNotify notify) { if (type == OACallbackType.OACallbackTypeAuthUser){ // 該接口僅供測(cè)試使用,請(qǐng)使用服務(wù)端發(fā)送給授權(quán)請(qǐng)求 OARequestWrapper requestWrapper = OpenApplus.makeRequestWrapper(SampleContants.SERVER_APPID, SampleContants.SERVER_APP_SECRET); OAAuthDtoWrapper dto = new OAAuthDtoWrapper(); dto.setUid("1"); try { dto.setCode(data.getString("code")); } catch (JSONException e) { e.printStackTrace(); } String deviceID = Settings.Secure.getString(WXEnvironment.sApplication.getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID); dto.setDeviceid(deviceID); requestWrapper.sendObject(dto, notify); } } });
注意:
參數(shù)1:上下文,必須的參數(shù),不能為空
參數(shù)2:OpenApplus app key,必須參數(shù)。
參數(shù)3:OpenApplus app secret,必須參數(shù)。
添加相關(guān)權(quán)限代碼混淆
如果您的應(yīng)用使用了混淆, 請(qǐng)?zhí)砑?/p>
-keep class com.openapplus.** {*;}添加Activty入口
在AndroidManifest.xml中添加
啟動(dòng)小程序容器
Intent intent = new Intent(SplashActivity.this, OATinyProgramActivity.class); intent.putExtra("tiny","openapplus://jsApp/xxxxx"); startActivity(intent); finish();小程序 API 授權(quán)登錄流程 一、App接入 第一步:獲取服務(wù)端的AppKey、AppSecret、AppKey、JsAppsecret
在進(jìn)行OpenApp+ OAuth2授權(quán)登錄接入之前,在開(kāi)放平臺(tái)注冊(cè)【http://www.openapplus.com/】開(kāi)發(fā)者帳號(hào),并擁有一個(gè)已審核通過(guò)的網(wǎng)站應(yīng)用, 獲取應(yīng)用的AppKey、AppSecret,并獲得相應(yīng)的服務(wù)端的JsAppKey、JsAppsecret,申請(qǐng)OpenApp+登錄且通過(guò)審核后,可開(kāi)始接入流程。
第二步:配置App的授權(quán)接口[OpenApplus startWithAppKey:@"AppKey" andSecret:@"AppSecret"]; NSString *uid = @"111"; [OAConfiguration setUserIdentify:uid]; [OpenApplus setupCallback:^(OACallbackType type, id data, OpenApplusNotify notify, NSError *error) { switch (type) { case OACallbackTypeAuthUser: { // http://www.openapplus.com/auth/auth,請(qǐng)求該接口獲取token和超時(shí)時(shí)間 OAContainerAuthObject *containerAuthObject = [[OAContainerAuthObject alloc] init]; containerAuthObject.token = @""; containerAuthObject.expired = @""; notify(containerAuthObject, nil); // 使用App服務(wù)端的AppKey和AppSecret,以下注釋代碼因?yàn)槭褂煤?jiǎn)易方式,沒(méi)有經(jīng)過(guò)服務(wù)端的驗(yàn)證,并且將AppServerKey,AppServerSecret暴露在客戶端,屬于不安全的簡(jiǎn)易方式,僅供測(cè)試或者沒(méi)有服務(wù)器的app的使用,再次申請(qǐng),該方式不安全。 // OARequestWrapper *requestWrapper = [OpenApplus requestWithAppKey:@"AppServerKey" andSecret:@"AppServerSecret"]; // OAAuthDtoWrapper *dto = [[OAAuthDtoWrapper alloc] init]; // dto.code = [data performSelector:@selector(code)]; // dto.deviceid = [OpenUDID value]; // dto.uid = uid; // [requestWrapper sendObject:dto thenNotify:notify]; } }]第三步:用戶認(rèn)證
用戶認(rèn)證接口
http://www.openapplus.com/auth/auth
請(qǐng)求方式:
POST, ContentType:x-www-form-urlencode
參數(shù)說(shuō)明:
參數(shù) | 類型 | 必填 | 說(shuō)明 |
---|---|---|---|
appKey | String | 是 | 應(yīng)用appServerKey |
code | String | 是 | 授權(quán)code |
deviceid | String | 是 | 設(shè)備deviceid |
uid | String | 是 | 用戶標(biāo)識(shí) |
timestamp | String | 是 | 當(dāng)前時(shí)間戳 |
signature | String | 是 | 使用簽名規(guī)則生成的簽名sha1(toquery(sort(params))) , 參數(shù)中密鑰為:appSecret=appSecret |
返回說(shuō)明:
參數(shù) | 類型 | 必填 | 說(shuō)明 |
---|---|---|---|
code | String | 是 | 狀態(tài)編碼 |
data | String | 是 | 返回?cái)?shù)據(jù) |
message | String | 是 | 錯(cuò)誤信息 |
data參數(shù)說(shuō)明:
參數(shù) | 類型 | 必填 | 說(shuō)明 |
---|---|---|---|
token | String | 是 | 授權(quán)token |
expired | String | 是 | 為session的過(guò)期時(shí)間 |
在進(jìn)行OpenApp+ OAuth2授權(quán)登錄接入之前,在開(kāi)放平臺(tái)注冊(cè)【http://www.openapplus.com/】開(kāi)發(fā)者帳號(hào),并擁有一個(gè)已審核通過(guò)的小程序項(xiàng)目,并獲得相應(yīng)的服務(wù)端的JsAppKey、JsAppsecret,將其授權(quán)到應(yīng)用后,可開(kāi)始接入流程。
第二步:前端調(diào)用登錄APImy.getAuthCode({ jsAppKey: "jsAppKey", success: (loginResponse) => { if (!loginResponse.error){ let sessionData = { token: loginResponse.authCode, jsAppKey: that.config.jsAppKey } let qs = require("qs") my.httpRequest({ url: "http://httpbin.org/post", method: "POST", data: sessionData, success: function(res) { if (parseInt(respData.data.code) === 1) { console.debug("獲取jsToken成功!jsToken為:" + respData.data.jsToken); } }, fail: function(res) { console.debug("獲取authCode失敗!"); }, complete: function(res) { } }); } else { console.debug("獲取jsToken失敗!"); } } });第三步:通過(guò)jsToken獲取獲取后臺(tái)session
http://www.openapplus.com/auth/jsapp/code2session
請(qǐng)求方式:
POST, ContentType:x-www-form-urlencode
參數(shù)說(shuō)明:
參數(shù) | 類型 | 必填 | 說(shuō)明 |
---|---|---|---|
jsAppKey | String | 是 | 該應(yīng)用的jsAppKey |
token | String | 是 | 前端獲取的jsToken |
timestamp | String | 是 | 當(dāng)前時(shí)間戳 |
signature | String | 是 | 使用簽名規(guī)則生成的簽名sha1(toquery(sort(params))) , 參數(shù)中密鑰為:appSecret=jsAppSecret |
返回說(shuō)明:
參數(shù) | 類型 | 必填 | 說(shuō)明 |
---|---|---|---|
code | String | 是 | 狀態(tài)編碼 |
data | String | 是 | 響應(yīng)數(shù)據(jù) |
message | String | 是 | 錯(cuò)誤信息 |
data參數(shù)說(shuō)明:
參數(shù) | 類型 | 必填 | 說(shuō)明 |
---|---|---|---|
session | String | 是 | 授權(quán)會(huì)話 |
expired | String | 是 | 為session的過(guò)期時(shí)間 |
能調(diào)用的接口有以下:
| 接口|接口URL|接口說(shuō)明|
| :------| ------: | ------: |
| /auth/jsapp/getUser| http://www.openapplus.com/aut... | 獲取用戶個(gè)人信息 |
調(diào)用接口獲取登錄憑證(jsAppToken)進(jìn)而換取用戶登錄態(tài)信息,包括用戶的唯一標(biāo)識(shí)(openid) 及本次登錄的 會(huì)話密鑰(session_key)。用戶數(shù)據(jù)的加解密通訊需要依賴會(huì)話密鑰完成。
OBJECT參數(shù)說(shuō)明:
參數(shù) | 類型 | 必填 | 說(shuō)明 |
---|---|---|---|
jsAppKey | String | 是 | 小程序應(yīng)用AppKey |
success | function | 否 | 調(diào)用成功的回調(diào)函數(shù) |
fail | function | 否 | 調(diào)用失敗的回調(diào)函數(shù) |
complete | function | 否 | 調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行) |
CALLBACK返回參數(shù)說(shuō)明:
參數(shù) | 類型 | 必填 | 說(shuō)明 |
---|---|---|---|
authCode | String | 是 | 授權(quán)碼,用戶允許登錄后,回調(diào)內(nèi)容會(huì)帶上 authCode(有效期五分鐘),開(kāi)發(fā)者需要將 authCode 發(fā)送到開(kāi)發(fā)者服務(wù)器后臺(tái),使用code 換取 session_key api,將 authCode 換成 openid 和 session_key |
expired | Timestamp | 是 | 過(guò)期時(shí)間 |
示例代碼:
my.getAuthCode({ jsAppKey: "jsAppKey", success: (res) => { my.alert({ content: res.authCode, }); }, });my. navigateToMiniProgram(OBJECT)
開(kāi)放小程序容器操作API,打開(kāi)同一App下關(guān)聯(lián)的另一個(gè)小程序。
OBJECT參數(shù)說(shuō)明:
參數(shù) | 類型 | 必填 | 說(shuō)明 |
---|---|---|---|
appId | String | 是 | 要打開(kāi)的小程序 jsAppKey |
path | String | 否 | 打開(kāi)的頁(yè)面路徑,如果為空則打開(kāi)首頁(yè) |
extraData | String | 否 | 需要傳遞給目標(biāo)小程序的數(shù)據(jù),目標(biāo)小程序可在 App.onLaunch(e),App.onShow(e) 中獲取到這份數(shù)據(jù)。參數(shù)e格式為:{path: "", query: query},其中query 為extraData,僅支持一層字典 |
url | String | 是 | 和appId二者選擇一個(gè),打開(kāi)小程序的URL,格式為:openapplus://jsApp/e03f37ba425a47e6aafd8170eee6be52/param1=value1¶m2=value2, 如果參數(shù)中提供了instancId,會(huì)嘗試打開(kāi)已有頁(yè)面 |
success | function | 否 | 調(diào)用成功的回調(diào)函數(shù) |
fail | function | 否 | 調(diào)用失敗的回調(diào)函數(shù) |
complete | function | 否 | 調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行) |
示例代碼:
my.navigateToMiniProgram({ appId: "", path: "pages/index/index", extraData: { foo: "bar" }, envVersion: "develop", success(res) { // 打開(kāi)成功 } })wx.navigateBackMiniProgram(OBJECT)
返回到上一個(gè)小程序,只有在當(dāng)前小程序是被其他小程序打開(kāi)時(shí)可以調(diào)用成功
OBJECT參數(shù)說(shuō)明:
參數(shù) | 類型 | 必填 | 說(shuō)明 |
---|---|---|---|
extraData | String | 否 | 需要返回給上一個(gè)小程序的數(shù)據(jù),上一個(gè)小程序可在 App.onShow(e) 中獲取到這份數(shù)據(jù)。參數(shù)e格式為:{path: "", query: query},其中query 為extraData,僅支持一層字典 |
success | function | 否 | 調(diào)用成功的回調(diào)函數(shù) |
fail | function | 否 | 調(diào)用失敗的回調(diào)函數(shù) |
complete | function | 否 | 調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行) |
alert 警告框。
OBJECT參數(shù)說(shuō)明:
參數(shù) | 類型 | 必填 | 說(shuō)明 |
---|---|---|---|
title | String | 否 | alert框的標(biāo)題 |
content | function | 否 | alert框的內(nèi)容 |
buttonText | function | 否 | 按鈕文字,默認(rèn)確定 |
success | function | 否 | 調(diào)用成功的回調(diào)函數(shù) |
fail | function | 否 | 調(diào)用失敗的回調(diào)函數(shù) |
complete | function | 否 | 調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行) |
confirm 確認(rèn)框。
OBJECT參數(shù)說(shuō)明:
參數(shù) | 類型 | 必填 | 說(shuō)明 |
---|---|---|---|
title | String | 否 | alert框的標(biāo)題 |
content | function | 否 | alert框的內(nèi)容 |
confirmButtonText | function | 否 | 確認(rèn)按鈕文字,默認(rèn)‘確定’ |
cancelButtonText | function | 否 | 確認(rèn)按鈕文字,默認(rèn)‘取消’ |
success | function | 否 | 調(diào)用成功的回調(diào)函數(shù) |
fail | function | 否 | 調(diào)用失敗的回調(diào)函數(shù) |
complete | function | 否 | 調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行) |
confirm 確認(rèn)框。
OBJECT參數(shù)說(shuō)明:
參數(shù) | 類型 | 必填 | 說(shuō)明 |
---|---|---|---|
content | String | 否 | alert框的標(biāo)題 |
type | function | 否 | alert框的內(nèi)容 |
success | function | 否 | 調(diào)用成功的回調(diào)函數(shù) |
fail | function | 否 | 調(diào)用失敗的回調(diào)函數(shù) |
complete | function | 否 | 調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行) |
示例代碼:
my.showToast({ type: "success", content: "操作成功", duration: 3000, success: () => { my.alert({ title: "toast 消失了", }); }, });my. hideToast()
隱藏弱提示。
示例代碼:
my.hideToast()my. showLoading()
顯示加載提示。
OBJECT參數(shù)說(shuō)明:
參數(shù) | 類型 | 必填 | 說(shuō)明 |
---|---|---|---|
content | String | 否 | alert框的標(biāo)題 |
delay | Integer | 否 | 延遲顯示,單位 ms,默認(rèn) 0。如果在此時(shí)間之前調(diào)用了 my.hideLoading 則不會(huì)顯示 |
success | function | 否 | 調(diào)用成功的回調(diào)函數(shù) |
fail | function | 否 | 調(diào)用失敗的回調(diào)函數(shù) |
complete | function | 否 | 調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行) |
示例代碼:
my.showLoading({ content: "加載中...", delay: 1000, });my. hideLoading()
隱藏加載提示。
示例代碼:
my.hideLoading();my. datePicker(OBJECT)
打開(kāi)日期選擇列表。
OBJECT參數(shù)說(shuō)明:
參數(shù) | 類型 | 必填 | 說(shuō)明 |
---|---|---|---|
format | String | 否 | 返回的日期格式,yyyy-MM-dd(默認(rèn))HH:mm yyyy-MM-dd HH:mm yyyy-MM yyyy |
currentDate | String | 否 | 初始選擇的日期時(shí)間,默認(rèn)當(dāng)前時(shí)間 |
startDate | String | 否 | 最小日期時(shí)間 |
endDate | String | 否 | 最大日期時(shí)間 |
success | function | 否 | 調(diào)用成功的回調(diào)函數(shù) |
fail | function | 否 | 調(diào)用失敗的回調(diào)函數(shù) |
complete | function | 否 | 調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行) |
success返回參數(shù)說(shuō)明:
參數(shù) | 類型 | 必填 | 說(shuō)明 |
---|---|---|---|
date | String | 是 | 選擇的日期 |
示例代碼:
my.datePicker({ format: "yyyy-MM-dd", currentDate: "2012-12-12", startDate: "2012-12-10", endDate: "2012-12-15", success: (res) => { my.alert({ content: res.date, }); }, });my. hideKeyboard()
隱藏鍵盤(pán)。
示例代碼:
my. hideKeyboard();SDK API +startWithAppKey:
傳入在平臺(tái)申請(qǐng)的 appKey,啟動(dòng) JSPatch SDK。同時(shí)會(huì)自動(dòng)執(zhí)行已下載到本地的 patch 腳本。建議在 -application:didFinishLaunchingWithOptions: 開(kāi)頭處調(diào)用。
+sync與 OpenApplus 平臺(tái)后臺(tái)同步,詢問(wèn)是否有包更新,如果有更新會(huì)自動(dòng)下載并執(zhí)行。
!!注意 +startWithAppKey: 并不會(huì)詢問(wèn)后臺(tái)包更新,必須調(diào)用 +sync 方法。
每調(diào)用一次 +sync 就會(huì)請(qǐng)求一次后臺(tái),對(duì)于實(shí)時(shí)性要求不高的 APP,只需在 -application:didFinishLaunchingWithOptions: 處調(diào)用一次,這樣用戶會(huì)在啟動(dòng)時(shí)去同步 patch 信息。對(duì)于實(shí)時(shí)性要求高的 APP,可以在 -applicationDidBecomeActive: 處調(diào)用這個(gè)接口,這樣會(huì)在每次用戶喚醒 APP 時(shí)去同步一次后臺(tái),請(qǐng)求次數(shù)會(huì)增多,但有包更新時(shí)用戶會(huì)及時(shí)收到。
后臺(tái)使用 發(fā)布指南 應(yīng)用指南 收銀臺(tái)文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/68335.html
摘要:不過(guò)在小程序中,這就不是我們需要考慮的了,微信已經(jīng)幫我們處理好了。而在新手階段,暫時(shí)只需要關(guān)注兩個(gè)參數(shù)指定一個(gè)塊級(jí)布局,它其內(nèi)的元素,總是起一個(gè)新行來(lái)顯示,而微信小程序的很多視圖容器組件,默認(rèn)的就是,例如等。 showImg(https://segmentfault.com/img/remote/1460000015285633?w=750&h=562); 一、序 Hi,大家好,我是承...
摘要:所以為了在小程序開(kāi)發(fā)中更方便地布局,有必要來(lái)詳細(xì)了解下布局在小程序的使用。本文將針對(duì)布局的各個(gè)屬性進(jìn)行介紹,并直接使用來(lái)編寫(xiě)例子,運(yùn)行環(huán)境是小程序的開(kāi)發(fā)者工具。在容器使用會(huì)導(dǎo)致布局失效。 一篇舊文,上手小程序時(shí)做的一些探索 Flex布局是一種十分靈活方便的布局方式,目前主流的現(xiàn)代瀏覽器基本都實(shí)現(xiàn)了對(duì)Flex布局的完全支持。而在微信小程序中,IOS端使用的渲染引擎WKWebView和安卓...
摘要:正在學(xué)習(xí),留著看看轉(zhuǎn)自的大坑小洼成為云計(jì)算領(lǐng)域的新寵兒已經(jīng)是不爭(zhēng)的事實(shí),作為高速發(fā)展的開(kāi)源項(xiàng)目,難免存在這樣或那樣的瑕疵。話不多說(shuō),一起來(lái)領(lǐng)略的大坑小洼。原因回歸至上文的第一個(gè)坑。如此一來(lái),只要內(nèi)部涉及到域名解析,則立即受到影響。 正在學(xué)習(xí)Docker,留著看看 轉(zhuǎn)自Docker的大坑小洼 Docker成為云計(jì)算領(lǐng)域的新寵兒已經(jīng)是不爭(zhēng)的事實(shí),作為高速發(fā)展的開(kāi)源項(xiàng)目,難免存在這樣或那樣...
摘要:報(bào)告劃重點(diǎn)和領(lǐng)跑企業(yè)容器云市場(chǎng)在此次發(fā)布的企業(yè)級(jí)容器平臺(tái)的類似的魔力象限中,和是企業(yè)級(jí)容器管理平臺(tái)市場(chǎng)的卓越領(lǐng)導(dǎo)者。 showImg(https://segmentfault.com/img/remote/1460000016766848?w=1268&h=365); 全球著名的調(diào)研機(jī)構(gòu)Forrester Research近日發(fā)布了《The Forrester New Wave: En...
閱讀 1867·2021-11-25 09:43
閱讀 3694·2021-11-24 10:32
閱讀 1088·2021-10-13 09:39
閱讀 2341·2021-09-10 11:24
閱讀 3354·2021-07-25 21:37
閱讀 3476·2019-08-30 15:56
閱讀 870·2019-08-30 15:44
閱讀 1460·2019-08-30 13:18