ããã«ã¡ã¯ãHabrïŒç§ã®ååã¯ã¢ã³ãã¬ã€ã§ããAndroidçšã®ããŠã©ã¬ãããã¢ããªã±ãŒã·ã§ã³ãäœæããŠããŸãã 6ãæ以äžåãããHuaweiã¹ããŒããã©ã³ãŠãŒã¶ãŒãNFCãä»ããŠéè¡ã«ãŒãã䜿ã£ãŠéæ¥è§Šã§è³Œå ¥ä»£éãæ¯æãã®ãæ¯æŽããŠããŸããããããè¡ãã«ã¯ãHMSã®ãµããŒããè¿œå ããå¿ èŠããããŸããïŒããã·ã¥ãããããããããããããã³å®å šæ€åºãã«ããã®äžã§ãéçºäžã«è§£æ±ºããªããã°ãªããªãã£ãåé¡ããã®çç±ãšãã®åå ã説æãããããã¯ã«ãã°ãã没é ããããã®ãã¹ããããžã§ã¯ããå ±æããŸãã
æ°ããHuaweiã¹ããŒããã©ã³ã®ãã¹ãŠã®ãŠãŒã¶ãŒã«ãç®±ããåºããŠããã«éæ¥è§Šã§æ¯æãæ©èœãæäŸããä»ã®ã·ããªãªã§ããè¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããããã«ã2020幎1æã«ãæ°ããããã·ã¥éç¥ãã«ãŒããã»ãã¥ãªãã£ãã§ãã¯ã®ãµããŒãã«çæããŸããããã®çµæãHuaweié»è©±ã«ãã€ãã£ããªã¢ãã€ã«ãµãŒãã¹ãåããããŒãžã§ã³ã®WalletãAppGalleryã«è¡šç€ºãããã¯ãã§ããã
ããããæåã®èª¿æ»ã®æ®µéã§ç§ãã¡ãäœãšãèŠã€ãããã®ã§ãã
- Huaweiã¯AppGalleryãšHMSãå¶éãªãã§é åžããŠããŸããä»ã®ã¡ãŒã«ãŒã®ããã€ã¹ã«ããŠã³ããŒãããŠã€ã³ã¹ããŒã«ã§ããŸãã
- Xiaomi Mi A1ã«AppGalleryãã€ã³ã¹ããŒã«ããåŸãæåã«ãã¹ãŠã®æŽæ°ãæ°ãããµã€ããããã«ã¢ããããå§ããŸãããAppGalleryã«ã¯ã競åä»ç€Ÿãããæ©ãã¢ããªã±ãŒã·ã§ã³ãæŽæ°ããæéããããŸãã
- Huaweiã¯çŸåšãAppGalleryãã§ããã ãæ©ãã¢ããªã±ãŒã·ã§ã³ã§æºããããåªããŠããŸããHMSãžã®ç§»è¡ãã¹ããŒãã¢ããããããã«ã圌ãã¯éçºè ã«ãã§ã«äœ¿ãæ £ããïŒGMSã«é¡äŒŒããïŒAPIãæäŸããããšã«ããŸããã
- æåã¯ãHuaweiéçºè ãšã³ã·ã¹ãã ãå®å šã«æ©èœãããŸã§ãGoogleãµãŒãã¹ã®æ¬ åŠãæ°ããHuaweiã¹ããŒããã©ã³ã®ãŠãŒã¶ãŒã«ãšã£ãŠäž»ãªåé¡ã§ããå¯èœæ§ãé«ãã圌ãã¯å¿ ãããããã€ã³ã¹ããŒã«ããããšããŸãã
ãã¹ãŠã®é åžãµã€ãã§ãã¢ããªã±ãŒã·ã§ã³ã®1ã€ã®å ±éããŒãžã§ã³ãäœæããããšã«ããŸããã圌女ã¯ãå®è¡æã«é©åãªã¿ã€ãã®ã¢ãã€ã«ãµãŒãã¹ãèå¥ããŠäœ¿çšã§ããå¿ èŠããããŸãããã®ãªãã·ã§ã³ã¯ããµãŒãã¹ã®çš®é¡ããšã«åå¥ã®ããŒãžã§ã³ãããå®è£ ã«æéããããããã«èŠããŸããããå¥ã®ããŒãžã§ã³ã§åã€ããšãæãã§ããŸããã
- Huaweiããã€ã¹ã§GooglePlayçšã®ããŒãžã§ã³ãååŸãããªã¹ã¯ãããã³ãã®éã®ãªã¹ã¯ãæé€ãããŸãã
- æ©èœãã°ã«ã®äœ¿çšãå«ããã¢ãã€ã«ãµãŒãã¹ãéžæããããã®ä»»æã®ã¢ã«ãŽãªãºã ãå®è£ ã§ããŸãã
- 1ã€ã®ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãã¯ã2ã€ã®ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ããããç°¡åã§ãã
- åãªãªãŒã¹ã¯ããã¹ãŠã®é åžãµã€ãã«ã¢ããããŒãã§ããŸãã
- éçº/å€æŽäžã«ãã³ãŒãã®èšè¿°ãããããžã§ã¯ãã®ãã«ãã®ç®¡çã«åãæ¿ããå¿ èŠã¯ãããŸããã
ã¢ããªã±ãŒã·ã§ã³ã®1ã€ã®ããŒãžã§ã³ã§ã¢ãã€ã«ãµãŒãã¹ã®ããŸããŸãªå®è£ ãæäœããã«ã¯ã次ã®ããšãè¡ãå¿ èŠããããŸãã
- æœè±¡åã®ãã¹ãŠã®èŠæ±ãé衚瀺ã«ããŠãGMSã§ã®äœæ¥ãç¯çŽããŸãã
- HMSã®å®è£ ãè¿œå ããŸãã
- å®è¡æã«ãµãŒãã¹ã®å®è£ ãéžæããããã®ã¡ã«ããºã ãéçºããŸãã
PushKitãšSafetyDetectã®ãµããŒããå®è£ ããæ¹æ³ã¯ãMap Kitãšã¯å€§å¹ ã«ç°ãªããããåå¥ã«æ€èšããŸãã
ããã·ã¥ããããšå®å šæ€åºã®ãµããŒã
ãã®ãããªå Žåã«ããã¯ããªã®ã§ãçµ±åããã»ã¹ã¯ããã¥ã¡ã³ãã®èª¿æ»ããå§ãŸããŸãããèŠåã»ã¯ã·ã§ã³ã§æ¬¡ã®ç¹ãèŠã€ãããŸããã
- Huaweiããã€ã¹ã§EMUIããŒãžã§ã³ã10.0以éã®å ŽåãããŒã¯ã³ã¯getTokenã¡ãœãããä»ããŠè¿ãããŸããgetTokenã¡ãœããã®åŒã³åºãã«å€±æããå ŽåãHUAWEIããã·ã¥ãããã¯ããŒã¯ã³èŠæ±ãèªåçã«ãã£ãã·ã¥ããã¡ãœãããå床åŒã³åºããŸãããã®åŸãonNewTokenã¡ãœãããä»ããŠããŒã¯ã³ãè¿ãããŸãã
- Huaweiããã€ã¹ã®EMUIããŒãžã§ã³ã10.0ããåã§ãããgetTokenã¡ãœããã䜿çšããŠããŒã¯ã³ãè¿ãããªãå ŽåãããŒã¯ã³ã¯onNewTokenã¡ãœããã䜿çšããŠè¿ãããŸãã
- For an app with the automatic initialization capability, the getToken method does not need to be called explicitly to apply for a token. The HMS Core Push SDK will automatically apply for a token and call the onNewToken method to return the token.
ãããã®èŠåããåãé€ãäž»ãªããšã¯ãEMUIã®ç°ãªãããŒãžã§ã³ã§ããã·ã¥ããŒã¯ã³ãååŸããããšã«éãããããšããããšã§ããgetTokenïŒïŒã¡ãœãããåŒã³åºããåŸããµãŒãã¹ã®onNewTokenïŒïŒã¡ãœãããåŒã³åºãããšã§å®éã®ããŒã¯ã³ãè¿ãããšãã§ããŸããå®éã®ããã€ã¹ã§ã®ãã¹ãã§ã¯ãEMUI <10.0ã®é»è©±ã¯ãgetTokenã¡ãœãããåŒã³åºãããåŸããµãŒãã¹ã®onNewTokenïŒïŒã¡ãœãããåŒã³åºããããšãnullãŸãã¯ç©ºã®æååãè¿ãããšã瀺ãããŠããŸããEMUI> = 10.0ã®é»è©±ã¯ãåžžã«getTokenïŒïŒã¡ãœããããããã·ã¥ããŒã¯ã³ãè¿ããŸããã
ãã®ãããªããŒã¿ãœãŒã¹ãå®è£ ããŠãäœæ¥ã®ããžãã¯ãåäžã®åœ¢åŒã«ããããšãã§ããŸãã
class HmsDataSource(
private val hmsInstanceId: HmsInstanceId,
private val agConnectServicesConfig: AGConnectServicesConfig
) {
private val currentPushToken = BehaviorSubject.create<String>()
fun getHmsPushToken(): Single<String> = Maybe
.merge(
getHmsPushTokenFromSingleton(),
currentPushToken.firstElement()
)
.firstOrError()
fun onPushTokenUpdated(token: String): Completable = Completable
.fromCallable { currentPushToken.onNext(token) }
private fun getHmsPushTokenFromSingleton(): Maybe<String> = Maybe
.fromCallable<String> {
val appId = agConnectServicesConfig.getString("client/app_id")
hmsInstanceId.getToken(appId, "HCM").takeIf { it.isNotEmpty() }
}
.onErrorComplete()
}
class AppHmsMessagingService : HmsMessageService() {
val onPushTokenUpdated: OnPushTokenUpdated = Di.onPushTokenUpdated
override fun onMessageReceived(remoteMessage: RemoteMessage?) {
super.onMessageReceived(remoteMessage)
Log.d(LOG_TAG, "onMessageReceived remoteMessage=$remoteMessage")
}
override fun onNewToken(token: String?) {
super.onNewToken(token)
Log.d(LOG_TAG, "onNewToken: token=$token")
if (token?.isNotEmpty() == true) {
onPushTokenUpdated(token, MobileServiceType.Huawei)
.subscribe({},{
Log.e(LOG_TAG, "Error deliver updated token", it)
})
}
}
}
éèŠãªæ³šæäºé ïŒ
- . , , AppGallery -, . , HmsMessageService.onNewToken() , , , . ;
- , HmsMessageService.onMessageReceived() main , ;
- com.huawei.hms:push, com.huawei.hms.support.api.push.service.HmsMsgService, :pushservice. , , Application. , , , Firebase Performance. -Huawei , AppGallery HMS.
-
- ãµãŒãã¹ã®çš®é¡ããšã«åå¥ã®ããŒã¿ãœãŒã¹ãäœæããŸãã
- ã¢ãã€ã«ãµãŒãã¹ã®ã¿ã€ããå ¥åãšããŠåãå ¥ããç¹å®ã®ããŒã¿ãœãŒã¹ãéžæããããã·ã¥éç¥ãšã»ãã¥ãªãã£ã®ãªããžããªãè¿œå ããŸãã
- ããžãã¹ããžãã¯ã®äžéšã®ãšã³ãã£ãã£ã¯ãç¹å®ã®å Žåã«äœ¿çšããã®ã«é©åãªïŒå©çšå¯èœãªãµãŒãã¹ããã®ïŒã¢ãã€ã«ãµãŒãã¹ã®ã¿ã€ãã決å®ããŸãã
å®è¡æã«ãµãŒãã¹ã®å®è£ ãéžæããããã®ã¡ã«ããºã ã®éçº
ããã€ã¹ã«1çš®é¡ã®ãµãŒãã¹ããã€ã³ã¹ããŒã«ãããŠããªãå ŽåããŸãã¯ãŸã£ããã€ã³ã¹ããŒã«ãããŠããªãå Žåã¯ã©ãããã°ããã§ããããã ããGoogleãµãŒãã¹ãšHuaweiãµãŒãã¹ã®äž¡æ¹ãåæã«ã€ã³ã¹ããŒã«ãããŠããå Žåã¯ã©ãããã°ããã§ããã
ãããç§ãã¡ãèŠã€ãããã®ãšç§ãã¡ãå§ããå Žæã§ãïŒ
- æ°ãããã¯ãããžãŒãå°å ¥ããå ŽåããŠãŒã¶ãŒã®ããã€ã¹ããã¹ãŠã®èŠä»¶ãå®å šã«æºãããŠããå Žåã¯ããããåªå äºé ãšããŠäœ¿çšããå¿ èŠããããŸãã
- EMUI >= 10.0 - ;
- Huawei Google- EMUI 10.0 ;
- Huawei Google-, . , Google- ;
- AppGallery Huawei-, , .
ã¢ã«ãŽãªãºã ã®éçºã¯ãããããæãç²ããããžãã¹ã§ããããšãå€æããŸãããå€ãã®æè¡çããã³ããžãã¹çèŠå ãããã«åæããŸããããæçµçã«ã¯ãåœç€Ÿã®è£œåã«æé©ãªãœãªã¥ãŒã·ã§ã³ãæãã€ãããšãã§ããŸãããã¢ã«ãŽãªãºã ã®æãè°è«ãããŠããéšåã®èª¬æã1ã€ã®æã«åãŸãã®ã¯å°ãå¥åŠã§ãããæçµçã«ã¯åçŽã«æ¬¡ã®ããã«ãªã£ãããšãå¬ããæããŸãã
äž¡æ¹ã®ã¿ã€ãã®ãµãŒãã¹ãããã€ã¹ã«ã€ã³ã¹ããŒã«ãããŠããŠãEMUIããŒãžã§ã³ã10æªæºã§ãããšå€æã§ããå Žåã¯ãGoogleã䜿çšããŸãããã以å€ã®å Žåã¯ãHuaweiã䜿çšããŸãã
æçµçãªã¢ã«ãŽãªãºã ãå®è£ ããã«ã¯ããŠãŒã¶ãŒã®ããã€ã¹ã§EMUIããŒãžã§ã³ãå€å¥ããæ¹æ³ãèŠã€ããå¿ èŠããããŸãã
ãããè¡ã1ã€ã®æ¹æ³ã¯ãã·ã¹ãã ããããã£ãèªã¿åãããšã§ãã
class EmuiDataSource {
@SuppressLint("PrivateApi")
fun getEmuiApiLevel(): Maybe<Int> = Maybe
.fromCallable<Int> {
val clazz = Class.forName("android.os.SystemProperties")
val get = clazz.getMethod("getInt", String::class.java, Int::class.java)
val currentApiLevel = get.invoke(
clazz,
"ro.build.hw_emui_api_level",
UNKNOWN_API_LEVEL
) as Int
currentApiLevel.takeIf { it != UNKNOWN_API_LEVEL }
}
.onErrorComplete()
private companion object {
const val UNKNOWN_API_LEVEL = -1
}
}
ã»ãã¥ãªãã£ãã§ãã¯ãæ£ããå®è¡ããã«ã¯ããµãŒãã¹ã®ç¶æ ãæŽæ°ããå¿ èŠããªãããšãèæ ®ããå¿ èŠããããŸãã
ãµãŒãã¹ãéžæãããæäœã®ã¿ã€ããèæ ®ããããã€ã¹ã®EMUIããŒãžã§ã³ã決å®ãããã¢ã«ãŽãªãºã ã®æçµçãªå®è£ ã¯ã次ã®ããã«ãªããŸãã
sealed class MobileServiceEnvironment(
val mobileServiceType: MobileServiceType
) {
abstract val isUpdateRequired: Boolean
data class GoogleMobileServices(
override val isUpdateRequired: Boolean
) : MobileServiceEnvironment(MobileServiceType.Google)
data class HuaweiMobileServices(
override val isUpdateRequired: Boolean,
val emuiApiLevel: Int?
) : MobileServiceEnvironment(MobileServiceType.Huawei)
}
class SelectMobileServiceType(
private val mobileServicesRepository: MobileServicesRepository
) {
operator fun invoke(
case: Case
): Maybe<MobileServiceType> = mobileServicesRepository
.getAvailableServices()
.map { excludeEnvironmentsByCase(case, it) }
.flatMapMaybe { selectEnvironment(it) }
.map { it.mobileServiceType }
private fun excludeEnvironmentsByCase(
case: Case,
envs: Set<MobileServiceEnvironment>
): Iterable<MobileServiceEnvironment> = when (case) {
Case.Push, Case.Map -> envs
Case.Security -> envs.filter { !it.isUpdateRequired }
}
private fun selectEnvironment(
envs: Iterable<MobileServiceEnvironment>
): Maybe<MobileServiceEnvironment> = Maybe
.fromCallable {
envs.firstOrNull {
it is HuaweiMobileServices
&& (it.emuiApiLevel == null || it.emuiApiLevel >= 21)
}
?: envs.firstOrNull { it is GoogleMobileServices }
?: envs.firstOrNull { it is HuaweiMobileServices }
}
enum class Case {
Push, Map, Security
}
}
ããããããã®ãµããŒã
å®è¡æã«ãµãŒãã¹ãéžæããããã®ã¢ã«ãŽãªãºã ãå®è£ ããåŸããããã®åºæ¬æ©èœã®ãµããŒããè¿œå ããããã®ã¢ã«ãŽãªãºã ã¯ç°¡åã«èŠããŸãã
- ãããã衚瀺ããããã®ãµãŒãã¹ã®ã¿ã€ãã決å®ããŸãã
- é©åãªã¬ã€ã¢ãŠããèšããŸããç¹å®ã®ãããå®è£ ã§äœæ¥ããŸãã
ãã ããããã§èª¬æãããæ©èœã1ã€ãããŸããRx of the brainã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³å šäœãæžãçŽããªã¹ã¯ãªãã«ãã»ãŒã©ãã«ã§ãéåææäœãè¿œå ã§ããŸãããç¬èªã®å¶éããããŸããããšãã°ããã®å Žåãé©åãªã¬ã€ã¢ãŠãã決å®ããã«ã¯ãã»ãšãã©ã®å Žåãã¡ã€ã³ã¹ã¬ããã®ã©ããã§.blockingGetïŒïŒãåŒã³åºãå¿ èŠããããŸãããããã¯ãŸã£ããé©åã§ã¯ãããŸããããã®åé¡ã¯ãããšãã°ãåãã©ã°ã¡ã³ãã䜿çšããŠè§£æ±ºã§ããŸãã
class MapFragment : Fragment(),
OnGeoMapReadyCallback {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
ViewModelProvider(this)[MapViewModel::class.java].apply {
mobileServiceType.observe(viewLifecycleOwner, Observer { result ->
val fragment = when (result.getOrNull()) {
Google -> GoogleMapFragment.newInstance()
Huawei -> HuaweiMapFragment.newInstance()
else -> NoServicesMapFragment.newInstance()
}
replaceFragment(fragment)
})
}
}
override fun onMapReady(geoMap: GeoMap) {
geoMap.uiSettings.isZoomControlsEnabled = true
}
}
class GoogleMapFragment : Fragment(),
OnMapReadyCallback {
private var callback: OnGeoMapReadyCallback? = null
override fun onAttach(context: Context) {
super.onAttach(context)
callback = parentFragment as? OnGeoMapReadyCallback
}
override fun onDetach() {
super.onDetach()
callback = null
}
override fun onMapReady(googleMap: GoogleMap?) {
if (googleMap != null) {
val geoMap = geoMapFactory.create(googleMap)
callback?.onMapReady(geoMap)
}
}
}
class HuaweiMapFragment : Fragment(),
OnMapReadyCallback {
private var callback: OnGeoMapReadyCallback? = null
override fun onAttach(context: Context) {
super.onAttach(context)
callback = parentFragment as? OnGeoMapReadyCallback
}
override fun onDetach() {
super.onDetach()
callback = null
}
override fun onMapReady(huaweiMap: HuaweiMap?) {
if (huaweiMap != null) {
val geoMap = geoMapFactory.create(huaweiMap)
callback?.onMapReady(geoMap)
}
}
}
ããã§ãåã ã®ãã©ã°ã¡ã³ãããšã«ããããæäœããããã®åå¥ã®å®è£ ãäœæã§ããŸããåãããžãã¯ãå®è£ ããå¿ èŠãããå Žåã¯ã䜿ãæ £ããã¢ã«ãŽãªãºã ã«åŸãããšãã§ããŸããMapFragment.onMapReadyïŒïŒã§è¡ãããããã«ã1ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ã§åã¿ã€ãã®ãããã®äœæ¥ã調æŽãããã®ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ã®1ã€ã芪ãã©ã°ã¡ã³ãã«æž¡ããŸãã
äœãèµ·ãã£ãã®ã
ã¢ããªã±ãŒã·ã§ã³ã®æŽæ°ããŒãžã§ã³ã®ãªãªãŒã¹åŸã®æåã®æ°æ¥ã§ãã€ã³ã¹ããŒã«æ°ã¯100äžã«éããŸãããããã¯ãAppGalleryã®æ³šç®ã®æ©èœãšãããã€ãã®ã¡ãã£ã¢ãããã¬ãŒã«ãã£ãŠãªãªãŒã¹ã匷調ããããšããäºå®ã«äžéšèµ·å ããŠããŸãããŸããã¢ããªã±ãŒã·ã§ã³ã®æŽæ°é床ãåäžããŸãããçµå±ã®ãšãããversionCodeãæãé«ãããŒãžã§ã³ãAppGalleryã«2é±éååšããŠããŸããã
w3bsit3-dns.comã®ã¹ã¬ããã§ãã¢ããªã±ãŒã·ã§ã³å šè¬ãç¹ã«éè¡ã«ãŒãã®ããŒã¯ã³åã«é¢ããæçãªãã£ãŒãããã¯ããŠãŒã¶ãŒããåãåããŸãã Huaweiã®æææ©èœã®ãªãªãŒã¹åŸããã©ãŒã©ã ã®èšªåè æ°ãå¢å ãã圌ããçŽé¢ããåé¡ãå¢ããŠããŸããç§ãã¡ã¯ãã¹ãŠã®ã¢ããŒã«ã«åãçµã¿ç¶ããŠããŸããã倧ããªåé¡ã¯èŠãããŸããã
äžè¬ã«ãAppGalleryã§ã®ã¢ããªã±ãŒã·ã§ã³ã®ãªãªãŒã¹ã¯æåããåé¡ã解決ããããã®ã¢ãããŒããæ©èœããŠããããšãå€æãããšçµè«ä»ããããšãã§ããŸããéžæããå®è£ æ¹æ³ã®ãããã§ãGooglePlayãšAppGalleryã®äž¡æ¹ã§ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ãªãªãŒã¹ãã¢ããããŒãããããšãã§ããŸãã
ãã®æ¹æ³ã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³Analytics Kitã«APMãè¿œå ããAccount Kitã®ãµããŒãã«åãçµãã§ããŸãããããã§åæ¢ããäºå®ã¯ãããŸãããæ°ããããŒãžã§ã³ãå©çšå¯èœã«ãªããã³ã«ãHMSã«ã¯ããã«å€ãã®æ©äŒããããŸãã
ããšãã
AppGalleryãžã®éçºè ã¢ã«ãŠã³ãã®ç»é²ã¯Googleãããã¯ããã«è€éã§ããããšãã°ã身å ã確èªããã®ã«9æ¥ããããŸãããããããã¹ãŠã®äººã«èµ·ãããšã¯æããŸããããé ãããšæ¥œèŠ³äž»çŸ©ã倱ãããå¯èœæ§ããããŸãããããã£ãŠãèšäºã§èª¬æãããŠãããã¢ãœãªã¥ãŒã·ã§ã³å šäœã®å®å šãªã³ãŒããšãšãã«ããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ããŒããªããžããªã«ã³ãããããŸãããããã«ããããœãªã¥ãŒã·ã§ã³å šäœãè©äŸ¡ããã ãã§ãªããææ¡ãããã¢ãããŒãããã¹ãããŠæ¹åããæ©äŒãåŸãããŸãã
ãããªãã¯ã¹ããŒã¹ãžã®åºå£ã䜿çšããŠããŠã©ã¬ããããŒã å šäœãç¹ã«æè¬ããããšæããŸãumpteenthdevãArtemKulakovãšEgorAganinã¯ãHMSããŠã©ã¬ããã«çµ±åããããã®è²Žéãªè²¢ç®ãããŠãããŸããã
䟿å©ãªãªã³ã¯
- GitHubã®å®å šãªãã¢ãããžã§ã¯ãã³ãŒãã
- AppGallery . HMS-Core AppGallery;
- Push Kit codelab;
- Map Kit codelab;
- Safety Detect codelab;
- - Huawei. AppGallery Connect;
- «» 4PDA.