原生应用剪辑检测
创建一个本地 Expo 模块,使 JS 可以检测应用程序是否在 App Clip 中运行,并显示完整应用程序的安装提示。
bunx create-expo-module--localSwift 模块
importExpoModulesCoreimportStoreKitinternalclassMissingCurrentWindowSceneException:Exception{overridevarreason:String{"Cannot determine the current window scene in which to present the modal for requesting a review."}}internalclassMissingContainerURLException:Exception{overridevarreason:String{"Cannot determine the container URL."}}publicclassAppClipModule:Module{privatestaticletisAppClip:Bool={ifletinfoPlist=Bundle.main.infoDictionary,let_=infoPlist["NSAppClip"]as?[String:Any]{returntrue}returnfalse}()publicfuncdefinition()->ModuleDefinition{Name("AppClip")Constant("isAppClip"){AppClipModule.isAppClip}// Display overlay to advertise full app.// https://developer.apple.com/documentation/app_clips/recommending_your_app_to_app_clip_usersAsyncFunction("prompt"){if#available(iOS16,*){guardletcurrentScene=UIApplication.shared.connectedScenes.firstas?UIWindowSceneelse{throwMissingCurrentWindowSceneException()}letconfig=SKOverlay.AppClipConfiguration(position:.bottom)letoverlay=SKOverlay(configuration:config)overlay.present(in:currentScene)}}.runOnQueue(DispatchQueue.main)}}TypeScript 接口
import{NativeModule,requireOptionalNativeModule}from"expo";declareclassAppClipModuleextendsNativeModule<{}>{prompt():void;isAppClip?:boolean;}constAppClipNative=requireOptionalNativeModule<AppClipModule>("AppClip");if(AppClipNative?.isAppClip){navigator.appClip={prompt:AppClipNative.prompt,};}declareglobal{interfaceNavigator{/** * Only available in an App Clip context. * @expo */appClip?:{/** Open the SKOverlay */prompt:()=>void;};}}export{};使用
- 检测 App Clip 上下文:
if (navigator.appClip) { ... } - 提示安装完整应用:
navigator.appClip?.prompt()