主頁 > 移動端開發 > Android發布庫(jar/aar)到MavenCentral

Android發布庫(jar/aar)到MavenCentral

2021-06-16 08:03:50 移動端開發

一、前言:
由于Jcenter已經停止服務了,所以我們現在發布庫一般是要發布到Maven Central;Maven Central和Jcenter一樣也是一個公共的倉庫,發布在上面的庫可供自己和他人使用;Android Studio 4.2開始,Google已經把MavenCentral作為gradle中的默認倉庫配置;

二、發布庫(jar/aar)到MavenCentral的流程

1.Sonatype Jira相關設定
我們首先要在 Sonatype Jira上注冊一個賬號;
然后在https://issues.sonatype.org/projects
上創建一個issure

在這里插入圖片描述
在這里插入圖片描述
groupId:我們最好是使用自己的gtihub地址,這樣比較容易驗證,如果是自己的個人的域名也可以;我填寫的是:io.github.maqing-programmer

Project URL:我們在自己的GitHub上面新建一個倉庫即可,這里填寫這個倉庫的地址即可;我這里填寫的是:https://github.com/maqing-programmer/openlibrary

SCM url:上面的Project URL加上.gi即可,我這里填寫的是:https://github.com/maqing-programmer/openlibrary.git

創建完issure以后,會有管理員處理你的這個issue,等待管理員回復你的issue,他會告訴你,要在你的github創建一個repo,repo的名字是這個issue的id,比如我的是OSSRH-69933,管理員回復我的如下圖:

在這里插入圖片描述
創建好之后,你需要添加評論,回復管理員已經創建好倉庫;

在這里插入圖片描述
回復管理員之后,等待這個issue的狀態變成已解決RESOLVED狀態,

在這里插入圖片描述
這樣,你就創建好了一個issue,用來承接對應group id下所有的庫,Sonatype Jira
基本配置就完成了;

2.簽名秘鑰申請

下載gpg4win:

去GPG官網https://www.gpg4win.org/get-gpg4win.html 下載gpg4win-3.1.14.exe;
官網最新的版本是gpg4win-3.1.15,但是下載之后,后面打開kleopatra.exe
總是報錯,所以就改成下載gpg4win-3.1.14了,打開kleopatra.exe也沒有報錯了;
下載之后,點擊,進行安裝即可;

安裝完之后,桌面應該會出現kleopatra圖示,我們點擊打開,或者在gpg4win-3.1.14的安裝目錄下/bin/下找到kleopatra.exe點擊打開也可;

打開kleopatra之后,新建秘鑰

在這里插入圖片描述
然后選擇創建個人秘鑰:
在這里插入圖片描述
然后輸入你的賬號、郵箱,并且勾選Protect the generated key with a passphrase.(使用密碼保護生成的密鑰)在高級設定里可以設定更詳細的,例如過期時間,但過期時間不可以太長,或報錯,

在這里插入圖片描述
點擊新建,會要求設定一個密碼,這個密碼是私鑰密碼,后面會用到;
在這里插入圖片描述
密碼輸入之后,點擊下一步,就會創建成功;

新建完成之后在kleopatra界面會看到你創建的秘鑰:

在這里插入圖片描述

雙擊可查看

在這里插入圖片描述
紅框中的8位字母,后面是是要用的;
點擊生成吊銷證書按鈕,保存下來你的吊銷證書,

然后我們進入gpg4win-3.1.14的安裝目錄下/bin/,打開cmd,或者打開CMD,然后
定位到gpg4win-3.1.14的安裝目錄下/bin/下,然后輸入
gpg --export-secret-keys -o secring.gpg命令接下來創建secring.gpg檔案
這個secring.gpg檔案,后面會用到;

然后回到主界面點擊右鍵,在服務器發布:

在這里插入圖片描述
3.gradle準備

我們進入Android Studio中,比如我們要上傳的是一個Java Library,我們肯定是事先準備好了Android工程,然后在Android 工程中又新建了一個Java Library Module,Java Library Module下撰寫好庫的代碼之后,準備上傳;
我們要準備一個上傳的gradle腳本檔案,在Android工程的根目錄下,新建一個gradle檔案,這里我們取名為publish_jar.gradle;

apply plugin: 'maven-publish'
apply plugin: 'signing'
task sourceJar(type: Jar) {
    classifier "sources"
    from   sourceSets.main.groovy.srcDirs
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier "javadoc"
    from javadoc.destinationDir
}

javadoc {
    description = "生成jar格式的javadoc,"
    // 只顯示 protected 和 public 的類和成員
    options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED
    options.author = true
    options.version = true
    options.header = project.name
    // 靜默javadoc檢查(比如不支持@date會報錯等),jdk 8+
    options.addStringOption('Xdoclint:none', '-quiet')
    // 防止本地打開中文亂碼
    options.addStringOption("charset", "UTF-8")
    // suppress warnings due to cross-module @see and @link references;
    // note that global 'api' task does display all warnings.
    logging.captureStandardError LogLevel.INFO
    // suppress "## warnings" message
    logging.captureStandardOutput LogLevel.INFO
    // 編碼一定要配置否則直接出錯
    options.encoding = "UTF-8"
    options.charSet = "UTF-8"
}



ext {
    PUBLISH_GROUP_ID = "io.github.maqing-programmer" //
    PUBLISH_ARTIFACT_ID = 'plugin'            //專案名
    PUBLISH_VERSION = 2.2                   //版本號
}

ext["signing.keyId"] = ''
ext["signing.password"] = ''
ext["signing.secretKeyRingFile"] = ''
ext["ossrhUsername"] = ''
ext["ossrhPassword"] = ''

File secretPropsFile = project.rootProject.file('local.properties')
if (secretPropsFile.exists()) {
    println "Found secret props file, loading props"
    Properties p = new Properties()
    p.load(new FileInputStream(secretPropsFile))
    p.each { name, value ->
        ext[name] = value
    }
} else {
    println "No props file, loading env vars"
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            groupId = 'io.github.maqing-programmer'//Sonatype Jira上設定的groupId 
            artifactId = 'plugin'
            version = '2.2'
            from components.java

            artifact sourceJar
            artifact javadocJar

            pom {
                name = 'plugin'
                description = 'jiagu plugin'
                url = 'https://github.com/maqing-programmer/openlibrary'
                licenses {
                    license {
                        name = 'Apache License, Version 2.0'
                        url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                        distribution = 'repo'
                        comments = 'A business-friendly OSS license'
                    }
                }
                developers {
                    developer {
                        id = 'maqing'  //Sonatype Jira上的username
                        name = 'maqing' //Sonatype Jira上的username
                        email = '2856992713@qq.com'
                    }
                }
                scm {
                    //修改成你的Git倉庫地址: https://github.com/maqing-programmer/openlibrary.git
                    connection = 'scm:git:github.com/maqing-programmer/openlibrary.git'
                    developerConnection = 'scm:git:ssh://github.com/maqing-programmer/openlibrary.git'
                    //分支地址:
                    url = 'https://github.com/maqing-programmer/openlibrary/tree/master'
                }
            }
        }
    }

    repositories {
        maven {
            // any other name that's descriptive for you
            name = "Releases"

            def releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
            def snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
            // You only need this if you want to publish snapshots, otherwise just set the URL
            // to the release repo directly
            url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl

            // The username and password we've fetched earlier
            credentials {
                username ossrhUsername
                password ossrhPassword
            }
        }
    }
}

signing {
    sign publishing.publications.mavenJava
}

然后在Android工程的根目錄下的local.properties里面添加如下內容;

signing.keyId=新建的秘鑰的后8位
signing.password=新建密鑰時設定的密碼
signing.secretKeyRingFile=D\:\\key\\secring.gpg(生成的secring.gpg的位置)
ossrhUsername=Sonatype注冊的用戶名
ossrhPassword=Sonatype注冊的密碼

然后在你要提交的module下的build.gradle檔案中,尾部追加如下代碼:

 apply from: '../publish_jar.gradle'

然后同步(Sync)即可

4.執行打包和上傳

上傳之前首先要打包我們的Java Library的原始碼為jar檔案,在Android Studio中右側的gradle視窗中的task中找到想要提交的Module;然后執行build任務
在這里插入圖片描述
build任務執行完畢之后,在Java Library目錄下build/libs/目錄下會有打包好的jar檔案

在這里插入圖片描述
然后再點擊該module下的publishReleasePublicationToReleasesRepository任務

在這里插入圖片描述
發布任務執行完畢之后,進入Nexus Repository Manager 上,登錄,登錄的賬號就是sonatype的賬號,登錄之后左側的選單中找到Staging Repositories,點擊該選單,會看到我們的groupId對應的該庫的臨時倉庫,并且會有編號,如果有個多個臨時倉庫,就會有多個groupId-編號的臨時倉庫

在這里插入圖片描述
在這里插入圖片描述
然后選中我們的庫對應的臨時倉庫,點擊close關閉該庫

在這里插入圖片描述
close成功之后,然后再點擊release,釋放該包,釋放該包成功之后,這個臨時倉庫就會不存在了;然后等待兩個小時候之后,然后我們在https://search.maven.org/ 上就可以搜索到我們的這個庫了,我么可以通過groupId,
或者通過庫名來搜索;

在這里插入圖片描述
5.使用該庫

如果是一個普通的Java Library庫,你可以直接
implementation 'io.github.maqing-programmer:plugin:2.0’來使用該庫;

我們其實可以點擊MavenCentral上的這個庫的版本號,進入這個庫的詳情,
右邊是有這個庫在各個構建工具中如何參考的方法:

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
如上圖所示在gradle中就是
implementation ‘io.github.maqing-programmer:plugin:2.0’
使用這種參考方式;

上面就是上傳一個Java Library(jar)庫到MavenCentral庫中的程序;

上傳一個aar庫到MavenCentral

上傳aar庫到mavenCentral基本步驟和上傳jar庫是一樣的,不同的是我們上傳的 moule型別以及gradle準備中的上傳腳本不一樣;

1.新建要上傳的Android Library Module

首先我們要新建一個Android工程,然后新建一個Android Library Module,新建的Android Library Module好像默認是沒有res資源目錄,我么可以自己在src/main下新建一個res資源目錄,或者直接將Android工程主Module下的res資源目錄拷貝到Android Library Module下src/main下;
然后撰寫我們的庫代碼,撰寫好庫代碼之后,我們在Android Studio右側gradle task
視窗,找到我們的Android Library Module下的Tasks下的build中的build任務,執行完畢之后,在Android Library Module中的build/outputs/aar目錄下就會生成我們的aar庫檔案;

在這里插入圖片描述
2.gradle準備

我們要準備一個上傳的gradle腳本檔案,在Android工程的根目錄下,新建一個gradle檔案,這里我們取名為publish_aar.gradle;

apply plugin: 'maven-publish'
apply plugin: 'signing'

task androidSourcesJar(type: Jar) {
    classifier = 'sources'
//    from sourceSets.main.java.source
    from android.sourceSets.main.java.source
}

ext {
    PUBLISH_GROUP_ID = "io.github.maqing-programmer" //專案包名
    PUBLISH_ARTIFACT_ID = 'mylibrary'            //專案名
    PUBLISH_VERSION = 2.0                   //版本號
}

ext["signing.keyId"] = ''
ext["signing.password"] = ''
ext["signing.secretKeyRingFile"] = ''
ext["ossrhUsername"] = ''
ext["ossrhPassword"] = ''

File secretPropsFile = project.rootProject.file('local.properties')
if (secretPropsFile.exists()) {
    println "Found secret props file, loading props"
    Properties p = new Properties()
    p.load(new FileInputStream(secretPropsFile))
    p.each { name, value ->
        ext[name] = value
    }
} else {
    println "No props file, loading env vars"
}


publishing{
    publications{
        release(MavenPublication) {
            // The coordinates of the library, being set from variables that
            // we'll set up in a moment
            groupId "io.github.maqing-programmer"
            artifactId "mylibrary"
            version '2.0'

            // Two artifacts, the `aar` and the sources
            artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
            artifact androidSourcesJar
            // Self-explanatory metadata for the most part
            pom {
                name = PUBLISH_ARTIFACT_ID
                description = '你的專案描述'
                // If your project has a dedicated site, use its URL here
                url = 'https://github.com/maqing-programmer/openlibrary'
                licenses {
                    license {
                        //協議型別,一般默認Apache License2.0的話不用改:
                        name = 'The Apache License, Version 2.0'
                        url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                developers {
                    developer {
                        id = 'maqing'
                        name = 'maqing'
                        email = '2856992713@qq.com'
                    }
                }
                // Version control info, if you're using GitHub, follow the format as seen here
                scm {
                    //修改成你的Git地址: https://github.com/maqing-programmer/openlibrary.git
                    connection = 'scm:git:github.com/maqing-programmer/openlibrary.git'
                    developerConnection = 'scm:git:ssh://github.com/maqing-programmer/openlibrary.git'
                    //分支地址:
                    url = 'https://github.com/maqing-programmer/openlibrary/tree/master'
                }
                // A slightly hacky fix so that your POM will include any transitive dependencies
                // that your library builds upon
                withXml {

                    def dependenciesNode = asNode().appendNode('dependencies')

                    project.configurations.implementation.allDependencies.each {
                        def dependencyNode = dependenciesNode.appendNode('dependency')
                        dependencyNode.appendNode('groupId', it.group)
                        dependencyNode.appendNode('artifactId', it.name)
                        dependencyNode.appendNode('version', it.version)
                    }

                }
            }
        }
    }
    repositories {
        // The repository to publish to, Sonatype/MavenCentral
        maven {
            // This is an arbitrary name, you may also use "mavencentral" or
            // any other name that's descriptive for you
            name = "Releases"

            def releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
            def snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
            // You only need this if you want to publish snapshots, otherwise just set the URL
            // to the release repo directly
            url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl

            // The username and password we've fetched earlier
            credentials {
                username ossrhUsername
                password ossrhPassword
            }
        }
    }
}

signing {
    sign publishing.publications
}

然后我們在Android根目錄下的gradle.properties下增加如下配置:

VERSION_NAME=1.0.2
VERSION_CODE=2
GROUP_ID=io.github.maqing-programmer

POM_DESCRIPTION=Android Download Library
POM_URL=https://github.com/maqing-programmer/openlibrary
POM_SCM_URL=https://github.com/maqing-programmer/openlibrary/tree/master
POM_SCM_CONNECTION=scm:git:github.com/maqing-programmer/openlibrary.git
POM_SCM_DEV_CONNECTION=scm:git:ssh://github.com/maqing-programmer/openlibrary.git
POM_LICENCE_NAME=The Apache Software License, Version 2.0
POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
POM_LICENCE_DIST=Apache 2.0
POM_DEVELOPER_ID=maqing
POM_DEVELOPER_NAME=maqing

當然和上傳jar庫一樣,也要在Android工程根目錄下的local.properties下添加如下配置

signing.keyId=新建的秘鑰的后8位
signing.password=新建密鑰時設定的密碼
signing.secretKeyRingFile=D\:\\key\\secring.gpg(生成的secring.gpg的位置)
ossrhUsername=Sonatype注冊的用戶名
ossrhPassword=Sonatype注冊的密碼

然后在Android Library Module的build.gradle尾部添如下代碼

apply from: "${rootProject.projectDir}/publish_aar.gradle"

然后同步(sync)一下;

3.上傳aar庫到mavenCentral

我們在Android Studio右側的gradle task視窗中,找到我們這個Android Library Module,然后找到該Module下的Tasks下的publishing任務,然后點擊該任務下的publishReleasePublicationToReleasesRepository;

在這里插入圖片描述
任務執行完畢之后,后續步驟就和上傳jar庫中的后續步驟是一樣的,去Nexus Repository Manager上執行相應的close、release操作,然后等待2個小時,然后我們在https://search.maven.org/ 上就可以搜索到我們的這個庫了,我么可以通過groupId,或者通過庫名來搜索;然后就可以使用該aar庫了,gradle中使用方式同jar庫;

    implementation 'io.github.maqing-programmer:mylibrary:2.0'

以上就是aar庫上傳至mavenCentral的程序;

注意:發布到MavenCentral上的庫是無法洗掉的,你也無法重新發布一個相同版本號的庫,你只能發布一個其他版本號的庫

文章內容參考:

發布Android庫到MavenCentral教程

Android庫發布到Maven Central全攻略

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/287637.html

標籤:其他

上一篇:Element ui+Vue+SSM-簡易學生資訊管理系統-請求封裝

下一篇:Android企業級實戰-界面篇-1

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more