首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenApplus小程序容器

OpenApplus小程序容器

原创
作者头像
linwaiwai
发布2018-01-23 16:04:37
2.5K0
发布2018-01-23 16:04:37
举报
文章被收录于专栏:小程序容器小程序容器

概述

OpenApp+ (https://www.openapplus.com)一个小程序容器,配置简单、功能完善、界面流畅、开箱即用!使用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文件中添加如下项
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
   <true/>
</dict>

运行

在 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,必须参数。

添加相关权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_LOGS"/>
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

<uses-permission android:name="android.permission.ACCESS_GPS"/>

<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>

<uses-permission android:name="getui.permission.GetuiService.com.bmdoctor.jyt"/>

<!--amap额外权限-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>

代码混淆

如果您的应用使用了混淆, 请添加

-keep class com.openapplus.** {*;}

添加Activty入口

在AndroidManifest.xml中添加

<activity android:name="com.openapplus.activity.OATinyProgramActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>

        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="com.benmu.weex.example.categoty.page"/>

        <data android:scheme="http"/>
        <data android:scheme="https"/>
    </intent-filter>
</activity>

启动小程序容器

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的过期时间

二、小程序接入

第一步:获取小程序的JsAppKey、JsAppsecret

在进行OpenApp+ OAuth2授权登录接入之前,在开放平台注册【http://www.openapplus.com/】开发者帐号,并拥有一个已审核通过的小程序项目,并获得相应的服务端的JsAppKey、JsAppsecret,将其授权到应用后,可开始接入流程。

第二步:前端调用登录API

my.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的过期时间

第五步:通过session调用接口

能调用的接口有以下:

接口

接口URL

接口说明

/auth/jsapp/getUser

http://www.openapplus.com/auth/jsapp/getUser

获取用户个人信息

客户端

my. getAuthCode(OBJECT)

调用接口获取登录凭证(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&param2=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

调用结束的回调函数(调用成功、失败都会执行)

my.alert(OBJECT)

alert 警告框。

OBJECT参数说明:

参数

类型

必填

说明

title

String

alert框的标题

content

function

alert框的内容

buttonText

function

按钮文字,默认确定

success

function

调用成功的回调函数

fail

function

调用失败的回调函数

complete

function

调用结束的回调函数(调用成功、失败都会执行)

my.confirm(OBJECT)

confirm 确认框。

OBJECT参数说明:

参数

类型

必填

说明

title

String

alert框的标题

content

function

alert框的内容

confirmButtonText

function

确认按钮文字,默认‘确定’

cancelButtonText

function

确认按钮文字,默认‘取消’

success

function

调用成功的回调函数

fail

function

调用失败的回调函数

complete

function

调用结束的回调函数(调用成功、失败都会执行)

my. showToast(OBJECT)

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 时去同步一次后台,请求次数会增多,但有包更新时用户会及时收到。

后台使用

发布指南

应用指南

收银台

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 集成SDK
    • 获得 AppKey
      • iOS集成
        • Cocoapods 安装
        • OpenApplus 安装
        • 运行
      • Android集成
        • Android Studio集成
        • 运行
        • 添加相关权限
        • 代码混淆
        • 添加Activty入口
        • 启动小程序容器
    • 小程序 API
      • 授权登录流程
        • 一、App接入
        • 第三步:用户认证
        • 二、小程序接入
        • 第二步:前端调用登录API
        • 第三步:通过jsToken获取获取后台session
        • 第五步:通过session调用接口
      • 客户端
        • my. getAuthCode(OBJECT)
        • my. navigateToMiniProgram(OBJECT)
        • wx.navigateBackMiniProgram(OBJECT)
        • my.alert(OBJECT)
        • my.confirm(OBJECT)
        • my. showToast(OBJECT)
        • my. hideToast()
        • my. showLoading()
        • my. hideLoading()
        • my. datePicker(OBJECT)
        • my. hideKeyboard()
    • SDK API
      • +startWithAppKey:
        • +sync
        • 后台使用
          • 发布指南
          • 应用指南
            • 收银台
            相关产品与服务
            云开发 CloudBase
            云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档