AppLinkingManager.ets 5.86 KB
import { Logger } from 'wdKit'
import { Want } from '@kit.AbilityKit'
import { url } from '@kit.ArkTS'
import { AppInnerLinkGenerator } from './AppInnerLinkGenerator'
import { ContentType } from '../common/ContentType'
import { AppInnerLink } from './AppInnerLink'
import { HttpBizUtil, HttpUrlUtils, ResponseDTO } from 'wdNetwork'
import { ContentDetailDTO } from 'wdBean'

const TAG = "AppLinkingManager"

// 系统AppLinking拉起管理类
export class AppLinkingManager {
  static readonly TEST_HOST = "pd-people-uat.pdnews.cn"
  static readonly PRODUCT_HOST = "www.peopleapp.com"

  private hasEnterMain = false
  private lastUrlObj?: url.URL

  private static manager: AppLinkingManager
  private constructor() {
  }
  public static sharedInstance() {
    if (!AppLinkingManager.manager) {
      AppLinkingManager.manager = new AppLinkingManager()
    }
    return AppLinkingManager.manager
  }

  onWant(want: Want) {
    this.onNewWant(want, true)
  }
  onNewWant(want: Want, startup: boolean = false) {
    Logger.debug(TAG, "want: " + JSON.stringify(want))
    let uri = want?.uri
    if (!uri) {
      return
    }

    let urlObject = url.URL.parseURL(want?.uri);
    if (urlObject.protocol != "https:") {
      return
    }

    if (urlObject.host != AppLinkingManager.PRODUCT_HOST && urlObject.host != AppLinkingManager.TEST_HOST) {
      return
    }

    this.lastUrlObj = urlObject
    if (this.hasEnterMain) {
      this.comsumeLastUriContent()
    }
  }

  // 首次进入主页,即可解析跳转推送
  onReachMainPage() {
    this.hasEnterMain = true
    this.comsumeLastUriContent()
  }

  comsumeLastUriContent() {
    Logger.debug(TAG, "尝试消费拉起链接: " + this.lastUrlObj?.toString())
    if (!this.lastUrlObj) {
      return
    }
    let path = this.lastUrlObj?.pathname ?? ""

    if (this.dealWithRMHArticle()
      || this.dealWithNormalArticle()
      || this.dealWithCreator()
      || this.dealWithTopic()) {
      this.lastUrlObj = undefined
      return
    }
    Logger.debug(TAG, "未处理path: " + path)
    this.lastUrlObj = undefined
  }

  dealWithRMHArticle() {
    let path = this.lastUrlObj?.pathname ?? ""
    if (path.startsWith("/rmharticle")) {
      let contentId = path.split("/").pop()
      let innerLink = AppInnerLinkGenerator.generate(ContentType.ImageText, contentId, undefined, undefined)
      this.jumpInnerLink(innerLink)
      return true
    }
    if (path.startsWith("/rmhphotos")) {
      let contentId = path.split("/").pop()
      let innerLink = AppInnerLinkGenerator.generate(ContentType.Pictures, contentId, undefined, undefined)
      this.jumpInnerLink(innerLink)
      return true
    }
    if (path.startsWith("/rmhmoments")) {
      let contentId = path.split("/").pop()
      let innerLink = AppInnerLinkGenerator.generate(ContentType.DynamicImageText, contentId, undefined, undefined)
      this.jumpInnerLink(innerLink)
      return true
    }
    if (path.startsWith("/rmhvideo")) {
      let contentId = path.split("/").pop()
      let innerLink = AppInnerLinkGenerator.generate(ContentType.Video, contentId, undefined, undefined)
      this.jumpInnerLink(innerLink)
      return true
    }
    if (path.startsWith("/column")) {
      let contentId = path.split("/").pop()
      if (!contentId || contentId.includes("-")) {
        return false
      }
      let innerLink = AppInnerLinkGenerator.generate(ContentType.Live, contentId, undefined, undefined)
      this.jumpInnerLink(innerLink)
      return true
    }
    return false
  }

  dealWithCreator() {
    let path = this.lastUrlObj?.pathname ?? ""
    if (path.startsWith("/author")) {
      let creatorId = path.split("/").pop()
      let innerLink = AppInnerLinkGenerator.generateCreatorPage(creatorId ?? "")
      this.jumpInnerLink(innerLink)
      return true
    }
    return false
  }

  dealWithTopic() {
    let path = this.lastUrlObj?.pathname ?? ""
    let idArray = path.split("/").pop()?.split("-")
    if (idArray?.length != 2) {
      return false
    }
    let pageId = idArray[0]
    let topicId = idArray[1]
    let url = `${this.lastUrlObj!.protocol}//${this.lastUrlObj!.host}/h${path}`
    if (path.startsWith("/votetopic")) {
      let innerLink = AppInnerLinkGenerator.generateH5Topic(pageId, url)
      this.jumpInnerLink(innerLink)
      return true
    }
    if (path.startsWith("/articletopic")) {
      let innerLink = AppInnerLinkGenerator.generateH5Topic(pageId, url)
      this.jumpInnerLink(innerLink)
    }
    if (path.startsWith("/livetopic")) {
      let innerLink = AppInnerLinkGenerator.generateH5Topic(pageId, url)
      this.jumpInnerLink(innerLink)
    }
    if (path.startsWith("/timelinetopic")) {
      let innerLink = AppInnerLinkGenerator.generateH5Topic(pageId, url)
      this.jumpInnerLink(innerLink)
    }
    return false
  }

  dealWithNormalArticle() {
    let path = this.lastUrlObj?.pathname ?? ""
    if (!path.startsWith("/column")) {
      return false
    }
    let idArray = path.split("/").pop()?.split("-")
    if (idArray?.length != 2) {
      return false
    }
    let contentId = idArray[0]
    let relId = idArray[1]

    let url = HttpUrlUtils.getHost() + HttpUrlUtils.DETAIL_PATH
    url = url + "?&contentId=" + contentId + "&relId=" + relId  // + "&relType=" + relType

    HttpBizUtil.get<ResponseDTO<ContentDetailDTO[]>>(url).then((data: ResponseDTO<ContentDetailDTO[]>) => {
      if (data.code != 0) {
        Logger.warn(TAG, "error " + JSON.stringify(data))
        return
      }
      if (!data.data || data.data.length == 0) {
        Logger.warn(TAG, "empty data!!!")
        return
      }
      let innerLink = AppInnerLinkGenerator.generateDeepLinkWithConent(data.data[0])
      this.jumpInnerLink(innerLink)
    }, (error: Error) => {
      Logger.warn(TAG, "error " + JSON.stringify(error))
    })
    return true
  }

  jumpInnerLink(innerLink: string) {
    Logger.debug(TAG, "即将跳转链接: " + innerLink)
    AppInnerLink.jumpWithLink(innerLink)
  }
}