UTS iOS插件

打印 上一主题 下一主题

主题 806|帖子 806|积分 2418

1、使用时插件无法出现,内容显示不出来的原因



  • 再uniapp x中使用时,必须给这个插件高度和宽度,否则出不来!
  1. ///uniapp x 中使用
  2. <uts-hello-view buttonText="点击按钮内容" style="width:375px;height: 375px;background-color: aqua;"></uts-hello-view>
复制代码


  • 在IOS中编写这个插件的内容时间,不能全用self.bounds,有大概出不来啊!!!!必要直接写死frame,或者使用束缚;
  • 同时,在didMoveToSuperview中获取view的frame不可,都是0,必要在layoutSubviews方法中获取view的frame才可以
  • 每次添加新的自界说UTS组件后最好重新走一遍自界说基座
2、无法运行



  • 检查是否都已经Podfile文件中版本修改为12
  • 问题:Sandbox: bash(72928) deny(1) file-write-create
方法:build settings->User Script Sandboxing 修改为NO

3、使用第三方库时,不能在.h文件中导入这个内容第三方库 !!!

4、swift 如果类添加了public前缀,那么无法添加协议MAMapViewDelegate,会报错!!!

5、怎样在uts插件中调用swift的方法

首先,swift必须是public 或者open修饰,好比 public class NHT_DemoView
但是高德舆图又不能用这个修饰,以是将高德舆图添加到一个view上,然后将这个view添加到另一个通过
public修饰的类上,通过这个类调用高德舆图的api;
6、怎样在UTS插件中使用swift的闭包

官网链接参考

  • 使用
swift:
@objc open var SelectLocationChangeBlock: (([String:Any])->Void)?
UTS插件:
  1. NVLoad() : NHT_DemoView {
  2.                         // -----NHT_AMAPView
  3.                         let button = new NHT_DemoView()
  4.                         button.SelectLocationChangeBlock = (res : any) => {
  5.                                 this.$emit('fetchgis', res)
  6.                         };
  7.         return button
  8.                 },
复制代码


  • 原生中有些方法的闭包参数是逃逸闭包,此时就要在闭包前面添加 @escaping 标记:
    // 在闭包参数前添加@escaping
  1. **在.ust文件中定义使用**
  2. let blockMine : ((res : string) => void) | null = null;
  3. // 逃逸闭包使用,在闭包参数前添加@escaping
  4. export function testVariableBlock(@escaping completion : (res : string) => void) {
  5.         // 在闭包参数前添加@escaping
  6.         blockMine = completion
  7.         setTimeout(function () {
  8.                 blockMine?.("xxxx111")
  9.         }, 5000);
  10. };
复制代码
7、 this.$emit传值报错,error: cannot convert value of type ‘String’ to expected argument type ‘[String : Any]?’

因为传值范例不对,可以本身声明一个变量,然后当参数传值
  1. const map1 = new Map<string,any>()
  2.                         map1.set('a', 'alpha');
复制代码
或者改变相应回调的写法(必须按照你实际的返回内容),
  1. button.SelectLocationChangeBlock = (res : Map<string, any>) => {
  2.                                 this.$emit('fetchgis', res)
  3.                         };
复制代码
8、error: uni_modules/nhyt-texs/utssdk/app-ios/src/index.swift:61:9: error: contextual closure type ‘(Any, Any) -> Void’ expects 2 arguments, but 1 was used in closure body

大概是watch中出现的问题
好比监听下面的值
“enableLocation”: {//允许定位
type: Boolean,
default: false
},
watch: {
//这样写对,必须有newValue : boolean, oldVel : boolean,只有newValue会报这个错误
“enableLocation”: {
handler(newValue : boolean, oldVel : boolean) {
// if (!this.isInitLocation && newValue && !this.innerEnableLocation) {
// this.isInitLocation = true
// this.innerEnableLocation = newValue
// this.initLocation()
// }
},
immediate: false
},
}
9、emit

只能全部小写,有大写的不可,好比下面fetchGis就不可,而fetchgis可以
emits: [‘fetchGis’, “locate”, “hhhh”, “fetchgis”],
10、插件中使用关照

如今的问题是无法获取关照发过来的信息内容
插件.uts文件中使用关照
  1. import { NotificationCenter, NSNotification, Notification } from 'Foundation';
  2. import { UIApplication } from "UIKit"
  3. // 响应通知方法
  4. class NotificationListener {
  5.         // 按钮点击回调方法
  6.         @objc notificationAction() {
  7.                 console.log("通知")
  8.         }
  9. }
  10. let listsner = new NotificationListener()
  11. // 启动监听推送消息事件
  12. export function onPushMessage() {
  13.         const method = Selector("notificationAction")
  14.         NotificationCenter.default.addObserver(listsner, selector = method, name = NSNotification.Name('testNNNN'), object = null)
  15.         NotificationCenter.default.addObserver(listsner, selector = method, name = UIApplication.userDidTakeScreenshotNotification, object = null)
  16.         setTimeout(function () {
  17.                 NotificationCenter.default.post(name = NSNotification.Name(rawValue = 'testNNNN'), object = { "2": "xxx32" } as any)
  18.                 offPushMessage()
  19.         }, 3000);
  20. };
复制代码
11、插件中iOS推送功使用

前提是,你的app已经在苹果开发者中心设置了推送证书


  • 设置权限描述:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3. <plist version="1.0">
  4.         <dict>
  5.                 <key>UIBackgroundModes</key>
  6.                 <array>
  7.                         <string>remote-notification</string>
  8.                 </array>
  9.                 <key>NSUserNotificationsUsageDescription</key>
  10.                 <string>打开XXX通知权限</string>
  11.         </dict>
  12. </plist>
复制代码


  • UTS.entitlements
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3. <plist version="1.0">
  4. <dict>
  5.         <key>aps-environment</key>
  6.         <string>development</string>
  7. </dict>
  8. </plist>
复制代码


  • 吸收远程推送消息的方法
    applicationDidReceiveRemoteNotificationCompletionHandler(application : UIApplication, userInfo : Map<AnyHashable, any>, completionHandler : ((res : Int) => void)) {}
  1. export class MyPluginClass implements UTSiOSHookProxy {
  2.         // uts 插件创建时的回调。
  3.         onCreate() {
  4.         }
  5.         // 应用正常启动时 (不包括已在后台转到前台的情况)的回调函数。
  6.         applicationDidFinishLaunchingWithOptions(application : UIApplication | null, launchOptions : Map<UIApplication.LaunchOptionsKey, any> | null = null) : boolean {
  7.                 nowApplication = application
  8.                 // console.log("===============applicationDidFinishLaunchingWithOptions")
  9.                 return true
  10.         }
  11.         // 当应用程序接收到与用户活动相关的数据时调用此方法,例如,当用户使用 Universal Link 唤起应用时。
  12.         applicationContinueUserActivityRestorationHandler(application : UIApplication | null, userActivity : NSUserActivity | null, restorationHandler : ((res : [any] | null) => void) | null = null) : boolean {
  13.                 console.log("===============applicationContinueUserActivityRestorationHandler")
  14.                 return true
  15.         }
  16.         // 远程通知注册成功时的回调函数。(打自定义基座时需要勾选 push 模块)
  17.         didRegisterForRemoteNotifications(deviceToken : Data | null) {
  18.                 console.log("===============didRegisterForRemoteNotifications:", deviceToken)
  19.                 const token = PushObject.share().getHexString(for = deviceToken!)
  20.                 console.log("token----", token);
  21.                 NHTPushService.shareNHTPush().application(nowApplication!, didRegisterForRemoteNotificationsWithDeviceToken = deviceToken!);
  22.         }
  23.         // 远程通知注册失败时的回调函数。(打自定义基座时需要勾选 push 模块)
  24.         didFailToRegisterForRemoteNotifications(error : NSError | null) {
  25.                 console.log("===============didFailToRegisterForRemoteNotifications:", error)
  26.                 NHTPushService.shareNHTPush().application(nowApplication!, didFailToRegisterForRemoteNotificationsWithError = error!);
  27.         }
  28.         /* 接收到远程推送消息
  29.         如果想在后台的时候收到远程推送的时候能调用这个方法
  30.          那么推送时后台必须加上参数
  31.          "content-available":1 */
  32.                 applicationDidReceiveRemoteNotificationCompletionHandler(application : UIApplication, userInfo : Map<AnyHashable, any>, completionHandler : ((res : Int) => void)) {
  33.                 NHTPushService.shareNHTPush().application(application, didReceiveRemoteNotification = userInfo, fetchCompletionHandler = (res : UIBackgroundFetchResult) => {
  34.                         completionHandler(0);
  35.                 });
  36.         }
  37.         // 通过 url scheme 方式唤起 app 时的回调函数。(iOS9 之前的系统回调此方法,iOS9 之后的系统请使用 applicationOpenURLOptions)
  38.         applicationHandleOpenURL(application : UIApplication | null, url : URL | null) : boolean {
  39.                 console.log("===============applicationDidFinishLaunchingWithOptions")
  40.                 return true
  41.         }
  42.         // 通过 url scheme 方式唤起 app 时的回调函数。
  43.         applicationOpenURLOptions(app : UIApplication | null, url : URL, options : Map<UIApplication.OpenURLOptionsKey, any> | null = null) : boolean {
  44.                 console.log("===============applicationDidFinishLaunchingWithOptions")
  45.                 return true
  46.         }
  47.         // 当应用从活动状态主动变为非活动状态的时的回调函数。
  48.         applicationWillResignActive(application : UIApplication | null) {
  49.                 // console.log("===============applicationWillResignActive")
  50.         }
  51.         // 应用完全激活时的回调函数。
  52.         applicationDidBecomeActive(application : UIApplication | null) {
  53.                 // console.log("===============applicationDidBecomeActive")
  54.         }
  55.         // 应用程序进入后台时的回调函数。
  56.         applicationDidEnterBackground(application : UIApplication | null) {
  57.                 console.log("===============did enter background")
  58.         }
  59.         // 当应用在后台状态,将要进入到前台运行时的回调函数。
  60.         applicationWillEnterForeground(application : UIApplication | null) {
  61.                 console.log("===============applicationWillEnterForeground")
  62.         }
  63.         // 应用程序的 main 函数。
  64.         applicationMain(argc : Int32, argv : UnsafeMutablePointer<UnsafeMutablePointer<CChar> | null>) {
  65.                 console.log("applicationMain")
  66.         }
  67. }
复制代码
12、常见几种iOS原生函数在uniapp x中的使用示例

UTS中使用时的留意点


  • 参数之间用=毗连
  • OC写的方法,在uniapp x中使用样式和在swift中类似,可以参考
  1. //oc中的方法
  2. -(void)checkIsHavePower_Microphone:(void (^)(NSInteger status))allowBlock;
  3. //UTS文件中使用
  4. export function checkIsHavePower_Microphone(callBack : (res : number) => void) {
  5.         NHTFunction.share().checkIsHavePower_Microphone((state : Int) => {
  6.                 callBack(Number(state))
  7.         });
  8. };
复制代码
  1. //oc中的方法
  2. -(void)startChangeTextToSpeech:(NSString *)text repeatPlay:(BOOL)repeatPlay;
  3. //UTS文件中使用
  4. export function startChangeText(speechText : string, repeatPlay : boolean) {
  5.         NHTFunction.share().startChangeText(toSpeech = speechText, repeatPlay = repeatPlay);
  6. };
复制代码
13、范例转换



  • swift 中的 Dictionary 范例,在 uts 中使用 Map 范例代替
  1. let resultInfo = res as Map<string, any | null>
复制代码


  • Int转number
  1. Number(res)
复制代码
14.部门原生数据范例问题

部门范例(好比:CBCharacteristic),不能单独从数据中取出并使用,会直接瓦解,console也不可
  1. export function notifyBLECharacteristicValueChange(options : NotifyBLECharacteristicValue) {
  2.         NHT_Bluetooth.share().notifyBLECharacteristicValueChange((res : any) => {
  3.                 var resultInfo = res as Map<string, any | null>
  4.                 console.log("----订阅特征值--notifyBLECharacteristicValueChange", res);//这个可以
  5.                 const characteristic = resultInfo.get('characteristic') ?? "xxx"; //CBCharacteristic
  6.                 if (characteristic != null) {
  7.                         //不能打印characteristic(类型是CBCharacteristic),也不能使用,会崩溃
  8.                         console.log("----订阅特征值--notifyBLECharacteristicValueChange",characteristic);
  9.                 }
  10.                 options.success(characteristic)//这样也会崩溃
  11.         });
  12. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表