摘要:参数格式为,其中为,仅支持一层字典否调用成功的回调函数否调用失败的回调函数否调用结束的回调函数调用成功失败都会执行警告框。
概述
OpenApp+ 一个小程序容器,配置简单、功能完善、界面流畅、开箱即用!使用OpenApp+可以快速扩展你的APP,使其拥有与微信一样的功能扩展可能,让App的所有的功能都通过小程序来实现,动态更新,更快的响应用户需求。其拥有的管理具备版本管理功能,让功能发布更加随心。
集成SDK 获得 AppKey在平台上注册帐号,可以任意添加新 App,每一个 App 都有一个唯一的 AppKey 作为标识,平台提供客户端的AppKey、Appsecret和服务端的AppKey、Appsecret以便接入
iOS集成 Cocoapods 安装推荐使用 CocoaPods 的方式安装使用。
CocoaPods 是一个广泛适用于Objective-C依赖管理工具,能够自动配置项目,简化你配置Openapp+的过程,使用以下命令行安装
$ gem install cocoapods
OpenApplus 安装使用CocosPods集成Openapp+到Xcode,需要编写/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" #忽略引入库的警告 inhibit_all_warnings! target "openapplus-ios-demo" do pod "OpenApplus", :podspec => "./podspec/OpenApplus.podspec" end在工程中Info.plist文件中添加如下项
运行NSAppTransportSecurity NSAllowsArbitraryLoads
在 AppDelegate.m 里按顺序调用三个方法:
1、调用 +startWithAppKey: ,参数为第一步获得的 AppKey。
2、调用 +sync 方法检查包更新。
在AppDelegate.m或ViewController.m中调用 navigateToMiniProgram: 加载小程序项目,参数为在平台中创建的项目的名称。
#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: 里,若希望包能及时推送,可以把 [OpenApplus sync] 放在 -applicationDidBecomeActive: 里,每次唤醒都能同步更新 OpenApplus 包,不需要等用户下次启动。
Android集成 Android Studio集成下载SDK功能组件,解压.zip文件得到相应组件包(openapplus-release.aar),在Android Studio的项目工程libs目录中拷入相关组件jar包。
右键Android Studio的项目工程—>选择Open Module Settings —>在 Project Structure弹出框中 —>选择 Dependencies选项卡 —>点击左下“+”—>选择组件包类型—>引入相应的组件包。
运行在项目工程的自定义application中的onCreate方法中添加以下两个方法:
注意:一定要在主进程进行该项操作
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){ // 该接口仅供测试使用,请使用服务端发送给授权请求 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); } } });
注意:
参数1:上下文,必须的参数,不能为空
参数2:OpenApplus app key,必须参数。
参数3:OpenApplus app secret,必须参数。
添加相关权限代码混淆
如果您的应用使用了混淆, 请添加
-keep class com.openapplus.** {*;}添加Activty入口
在AndroidManifest.xml中添加
启动小程序容器
Intent intent = new Intent(SplashActivity.this, OATinyProgramActivity.class); intent.putExtra("tiny","openapplus://jsApp/xxxxx"); startActivity(intent); finish();小程序 API 授权登录流程 一、App接入 第一步:获取服务端的AppKey、AppSecret、AppKey、JsAppsecret
在进行OpenApp+ OAuth2授权登录接入之前,在开放平台注册【http://www.openapplus.com/】开发者帐号,并拥有一个已审核通过的网站应用, 获取应用的AppKey、AppSecret,并获得相应的服务端的JsAppKey、JsAppsecret,申请OpenApp+登录且通过审核后,可开始接入流程。
第二步:配置App的授权接口[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,请求该接口获取token和超时时间 OAContainerAuthObject *containerAuthObject = [[OAContainerAuthObject alloc] init]; containerAuthObject.token = @""; containerAuthObject.expired = @""; notify(containerAuthObject, nil); // 使用App服务端的AppKey和AppSecret,以下注释代码因为使用简易方式,没有经过服务端的验证,并且将AppServerKey,AppServerSecret暴露在客户端,属于不安全的简易方式,仅供测试或者没有服务器的app的使用,再次申请,该方式不安全。 // 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]; } }]第三步:用户认证
用户认证接口
http://www.openapplus.com/auth/auth
请求方式:
POST, ContentType:x-www-form-urlencode
参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
appKey | String | 是 | 应用appServerKey |
code | String | 是 | 授权code |
deviceid | String | 是 | 设备deviceid |
uid | String | 是 | 用户标识 |
timestamp | String | 是 | 当前时间戳 |
signature | String | 是 | 使用签名规则生成的签名sha1(toquery(sort(params))) , 参数中密钥为:appSecret=appSecret |
返回说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
code | String | 是 | 状态编码 |
data | String | 是 | 返回数据 |
message | String | 是 | 错误信息 |
data参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
token | String | 是 | 授权token |
expired | String | 是 | 为session的过期时间 |
在进行OpenApp+ OAuth2授权登录接入之前,在开放平台注册【http://www.openapplus.com/】开发者帐号,并拥有一个已审核通过的小程序项目,并获得相应的服务端的JsAppKey、JsAppsecret,将其授权到应用后,可开始接入流程。
第二步:前端调用登录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失败!"); } } });第三步:通过jsToken获取获取后台session
http://www.openapplus.com/auth/jsapp/code2session
请求方式:
POST, ContentType:x-www-form-urlencode
参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
jsAppKey | String | 是 | 该应用的jsAppKey |
token | String | 是 | 前端获取的jsToken |
timestamp | String | 是 | 当前时间戳 |
signature | String | 是 | 使用签名规则生成的签名sha1(toquery(sort(params))) , 参数中密钥为:appSecret=jsAppSecret |
返回说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
code | String | 是 | 状态编码 |
data | String | 是 | 响应数据 |
message | String | 是 | 错误信息 |
data参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
session | String | 是 | 授权会话 |
expired | String | 是 | 为session的过期时间 |
能调用的接口有以下:
| 接口|接口URL|接口说明|
| :------| ------: | ------: |
| /auth/jsapp/getUser| http://www.openapplus.com/aut... | 获取用户个人信息 |
调用接口获取登录凭证(jsAppToken)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)。用户数据的加解密通讯需要依赖会话密钥完成。
OBJECT参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
jsAppKey | String | 是 | 小程序应用AppKey |
success | function | 否 | 调用成功的回调函数 |
fail | function | 否 | 调用失败的回调函数 |
complete | function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
CALLBACK返回参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
authCode | String | 是 | 授权码,用户允许登录后,回调内容会带上 authCode(有效期五分钟),开发者需要将 authCode 发送到开发者服务器后台,使用code 换取 session_key api,将 authCode 换成 openid 和 session_key |
expired | Timestamp | 是 | 过期时间 |
示例代码:
my.getAuthCode({ jsAppKey: "jsAppKey", success: (res) => { my.alert({ content: res.authCode, }); }, });my. navigateToMiniProgram(OBJECT)
开放小程序容器操作API,打开同一App下关联的另一个小程序。
OBJECT参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
appId | String | 是 | 要打开的小程序 jsAppKey |
path | String | 否 | 打开的页面路径,如果为空则打开首页 |
extraData | String | 否 | 需要传递给目标小程序的数据,目标小程序可在 App.onLaunch(e),App.onShow(e) 中获取到这份数据。参数e格式为:{path: "", query: query},其中query 为extraData,仅支持一层字典 |
url | String | 是 | 和appId二者选择一个,打开小程序的URL,格式为:openapplus://jsApp/e03f37ba425a47e6aafd8170eee6be52/param1=value1¶m2=value2, 如果参数中提供了instancId,会尝试打开已有页面 |
success | function | 否 | 调用成功的回调函数 |
fail | function | 否 | 调用失败的回调函数 |
complete | function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
示例代码:
my.navigateToMiniProgram({ appId: "", path: "pages/index/index", extraData: { foo: "bar" }, envVersion: "develop", success(res) { // 打开成功 } })wx.navigateBackMiniProgram(OBJECT)
返回到上一个小程序,只有在当前小程序是被其他小程序打开时可以调用成功
OBJECT参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
extraData | String | 否 | 需要返回给上一个小程序的数据,上一个小程序可在 App.onShow(e) 中获取到这份数据。参数e格式为:{path: "", query: query},其中query 为extraData,仅支持一层字典 |
success | function | 否 | 调用成功的回调函数 |
fail | function | 否 | 调用失败的回调函数 |
complete | function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
alert 警告框。
OBJECT参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
title | String | 否 | alert框的标题 |
content | function | 否 | alert框的内容 |
buttonText | function | 否 | 按钮文字,默认确定 |
success | function | 否 | 调用成功的回调函数 |
fail | function | 否 | 调用失败的回调函数 |
complete | function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
confirm 确认框。
OBJECT参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
title | String | 否 | alert框的标题 |
content | function | 否 | alert框的内容 |
confirmButtonText | function | 否 | 确认按钮文字,默认‘确定’ |
cancelButtonText | function | 否 | 确认按钮文字,默认‘取消’ |
success | function | 否 | 调用成功的回调函数 |
fail | function | 否 | 调用失败的回调函数 |
complete | function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
confirm 确认框。
OBJECT参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
content | String | 否 | alert框的标题 |
type | function | 否 | alert框的内容 |
success | function | 否 | 调用成功的回调函数 |
fail | function | 否 | 调用失败的回调函数 |
complete | function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
示例代码:
my.showToast({ type: "success", content: "操作成功", duration: 3000, success: () => { my.alert({ title: "toast 消失了", }); }, });my. hideToast()
隐藏弱提示。
示例代码:
my.hideToast()my. showLoading()
显示加载提示。
OBJECT参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
content | String | 否 | alert框的标题 |
delay | Integer | 否 | 延迟显示,单位 ms,默认 0。如果在此时间之前调用了 my.hideLoading 则不会显示 |
success | function | 否 | 调用成功的回调函数 |
fail | function | 否 | 调用失败的回调函数 |
complete | function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
示例代码:
my.showLoading({ content: "加载中...", delay: 1000, });my. hideLoading()
隐藏加载提示。
示例代码:
my.hideLoading();my. datePicker(OBJECT)
打开日期选择列表。
OBJECT参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
format | String | 否 | 返回的日期格式,yyyy-MM-dd(默认)HH:mm yyyy-MM-dd HH:mm yyyy-MM yyyy |
currentDate | String | 否 | 初始选择的日期时间,默认当前时间 |
startDate | String | 否 | 最小日期时间 |
endDate | String | 否 | 最大日期时间 |
success | function | 否 | 调用成功的回调函数 |
fail | function | 否 | 调用失败的回调函数 |
complete | function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
success返回参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
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()
隐藏键盘。
示例代码:
my. hideKeyboard();SDK API +startWithAppKey:
传入在平台申请的 appKey,启动 JSPatch SDK。同时会自动执行已下载到本地的 patch 脚本。建议在 -application:didFinishLaunchingWithOptions: 开头处调用。
+sync与 OpenApplus 平台后台同步,询问是否有包更新,如果有更新会自动下载并执行。
!!注意 +startWithAppKey: 并不会询问后台包更新,必须调用 +sync 方法。
每调用一次 +sync 就会请求一次后台,对于实时性要求不高的 APP,只需在 -application:didFinishLaunchingWithOptions: 处调用一次,这样用户会在启动时去同步 patch 信息。对于实时性要求高的 APP,可以在 -applicationDidBecomeActive: 处调用这个接口,这样会在每次用户唤醒 APP 时去同步一次后台,请求次数会增多,但有包更新时用户会及时收到。
后台使用 发布指南 应用指南 收银台文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/68335.html
摘要:不过在小程序中,这就不是我们需要考虑的了,微信已经帮我们处理好了。而在新手阶段,暂时只需要关注两个参数指定一个块级布局,它其内的元素,总是起一个新行来显示,而微信小程序的很多视图容器组件,默认的就是,例如等。 showImg(https://segmentfault.com/img/remote/1460000015285633?w=750&h=562); 一、序 Hi,大家好,我是承...
摘要:所以为了在小程序开发中更方便地布局,有必要来详细了解下布局在小程序的使用。本文将针对布局的各个属性进行介绍,并直接使用来编写例子,运行环境是小程序的开发者工具。在容器使用会导致布局失效。 一篇旧文,上手小程序时做的一些探索 Flex布局是一种十分灵活方便的布局方式,目前主流的现代浏览器基本都实现了对Flex布局的完全支持。而在微信小程序中,IOS端使用的渲染引擎WKWebView和安卓...
摘要:正在学习,留着看看转自的大坑小洼成为云计算领域的新宠儿已经是不争的事实,作为高速发展的开源项目,难免存在这样或那样的瑕疵。话不多说,一起来领略的大坑小洼。原因回归至上文的第一个坑。如此一来,只要内部涉及到域名解析,则立即受到影响。 正在学习Docker,留着看看 转自Docker的大坑小洼 Docker成为云计算领域的新宠儿已经是不争的事实,作为高速发展的开源项目,难免存在这样或那样...
摘要:报告划重点和领跑企业容器云市场在此次发布的企业级容器平台的类似的魔力象限中,和是企业级容器管理平台市场的卓越领导者。 showImg(https://segmentfault.com/img/remote/1460000016766848?w=1268&h=365); 全球著名的调研机构Forrester Research近日发布了《The Forrester New Wave: En...
阅读 1821·2021-11-25 09:43
阅读 3650·2021-11-24 10:32
阅读 1038·2021-10-13 09:39
阅读 2267·2021-09-10 11:24
阅读 3308·2021-07-25 21:37
阅读 3447·2019-08-30 15:56
阅读 816·2019-08-30 15:44
阅读 1390·2019-08-30 13:18