美文网首页
OpenApplus小程序容器

OpenApplus小程序容器

作者: linwaiwai | 来源:发表于2017-10-08 21:01 被阅读162次

    概述

    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文件中添加如下项

    <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

    
    wx.login({
      scope: 'auth_user',
      success: (loginResponse) => {
            let sessionData = null;
        if (!loginResponse.error){
            sessionData = {
                token: loginResponse.authCode,
                jsAppKey: that.config.jsAppKey
          }
            sessionData = this.commonSign(sessionData);
            wx.request({
              url: 'http://www.openapplus.com/auth/jscode2session',
              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/jscode2session
    

    请求方式:

    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参数说明:

    参数 类型 必填 说明
    sessionKey String 授权会话
    expired String 为session的过期时间

    客户端

    wx. login(OBJECT)

    调用接口获取登录凭证(jsAppToken)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)。用户数据的加解密通讯需要依赖会话密钥完成。

    OBJECT参数说明:

    参数 类型 必填 说明
    scope String 默认为'auth_user'
    success function 调用成功的回调函数
    fail function 调用失败的回调函数
    complete function 调用结束的回调函数(调用成功、失败都会执行)

    CALLBACK返回参数说明:

    参数 类型 必填 说明
    authCode String 授权码,用户允许登录后,回调内容会带上 authCode(有效期五分钟),开发者需要将 authCode 发送到开发者服务器后台,使用code 换取 session_key api,将 authCode 换成 openid 和 session_key
    expired Timestamp 过期时间

    示例代码:

    wx.login({
      scope: 'auth_user',
      success: (res) => {
        wx.alert({
        content: res.authCode,
      });
      },
    });
    

    wx. 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 调用结束的回调函数(调用成功、失败都会执行)

    示例代码:

      wx.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 调用结束的回调函数(调用成功、失败都会执行)

    wx.alert(OBJECT)

    alert 警告框。

    OBJECT参数说明:

    参数 类型 必填 说明
    title String alert框的标题
    content function alert框的内容
    buttonText function 按钮文字,默认确定
    success function 调用成功的回调函数
    fail function 调用失败的回调函数
    complete function 调用结束的回调函数(调用成功、失败都会执行)

    wx.confirm(OBJECT)

    confirm 确认框。

    OBJECT参数说明:

    参数 类型 必填 说明
    title String alert框的标题
    content function alert框的内容
    confirmButtonText function 确认按钮文字,默认‘确定’
    cancelButtonText function 确认按钮文字,默认‘取消’
    success function 调用成功的回调函数
    fail function 调用失败的回调函数
    complete function 调用结束的回调函数(调用成功、失败都会执行)

    wx. showToast(OBJECT)

    confirm 确认框。

    OBJECT参数说明:

    参数 类型 必填 说明
    content String alert框的标题
    type function alert框的内容
    success function 调用成功的回调函数
    fail function 调用失败的回调函数
    complete function 调用结束的回调函数(调用成功、失败都会执行)

    示例代码:

      wx.showToast({
      type: 'success',
      content: '操作成功',
      duration: 3000,
      success: () => {
        wx.alert({
          title: 'toast 消失了',
        });
      },
    });
    

    wx. hideToast()

    隐藏弱提示。

    示例代码:

    wx.hideToast()
    

    wx. showLoading()

    显示加载提示。

    OBJECT参数说明:

    参数 类型 必填 说明
    content String alert框的标题
    delay Integer 延迟显示,单位 ms,默认 0。如果在此时间之前调用了 wx.hideLoading 则不会显示
    success function 调用成功的回调函数
    fail function 调用失败的回调函数
    complete function 调用结束的回调函数(调用成功、失败都会执行)

    示例代码:

    wx.showLoading({
      content: '加载中...',
      delay: 1000,
    });
    

    wx. hideLoading()

    隐藏加载提示。

    示例代码:

    wx.hideLoading();
    

    wx. 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 选择的日期

    示例代码:

    wx.datePicker({
      format: 'yyyy-MM-dd',
      currentDate: '2012-12-12',
      startDate: '2012-12-10',
      endDate: '2012-12-15',
      success: (res) => {
        wx.alert({
        content: res.date,
      });
      },
    });
    

    wx. hideKeyboard()

    隐藏键盘。

    示例代码:

    wx.hideKeyboard();
    

    SDK API

    +startWithAppKey:

    传入在平台申请的 appKey,启动 JSPatch SDK。同时会自动执行已下载到本地的 patch 脚本。建议在 -application:didFinishLaunchingWithOptions: 开头处调用。

    +sync

    与 OpenApplus 平台后台同步,询问是否有包更新,如果有更新会自动下载并执行。

    !!注意 +startWithAppKey: 并不会询问后台包更新,必须调用 +sync 方法。

    每调用一次 +sync 就会请求一次后台,对于实时性要求不高的 APP,只需在 -application:didFinishLaunchingWithOptions: 处调用一次,这样用户会在启动时去同步 patch 信息。对于实时性要求高的 APP,可以在 -applicationDidBecomeActive: 处调用这个接口,这样会在每次用户唤醒 APP 时去同步一次后台,请求次数会增多,但有包更新时用户会及时收到。

    相关文章

      网友评论

          本文标题:OpenApplus小程序容器

          本文链接:https://www.haomeiwen.com/subject/hikedxtx.html