马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?免费注册
x
本帖最后由 3055303804 于 2024-1-27 22:44 编辑 5 F5 |. g9 }+ [. m5 b. o(欢迎访问老王论坛:laowang.vip)
! u. p) T2 f8 f/ s0 @/ }; A7 p(欢迎访问老王论坛:laowang.vip)
写在前面 之前有群友说不太清楚TapTap应用的上架流程,这里以Unity引擎、个人开发者的身份为例子,默认没有软著和版号,不接SDK的情况,给大家仔细唠唠,注意!这不是教程,只是鄙人的片面之言,经验之谈。本人水平有限,文章中有误的内容欢迎大家指出,谢谢! 1.注册TapTap个人开发者账户 注册TapTap开发者需要1-2天时间认证,所以我们先注册开发者账户,开发者账户审核阶段,我们再对Unity工程进行相关操作,这样更节约时间。: R% s+ _/ P0 U( }$ a3 e# ?(欢迎访问老王论坛:laowang.vip)
TapTap开发者入驻页面:https://developer.taptap.cn/developer-apply/ 在注册TapTap开发者及之后在该平台上架应用时,请务必仔细阅读平台对物料的要求! https://article.biliimg.com/bfs/article/6ddaddf3376f70db1b84a3b4cef0e426483438496.png 在此特别声明一下我们是以个人开发者的身份,没有软著和版号的前提下,只能正式上线试玩版应用,如果你的应用含有内购或者是买断制的游戏,是需要软著和版号的。按照正常流程来说,应该注册企业级开发者,TapTap目前是不支持个人开发者和企业开发者账户之间相互转换的。所以在注册开发者账户之前要确定清楚。 https://article.biliimg.com/bfs/article/9a5cbc8ef69318b83f0a3e9dc1d18ab2483438496.png 这里的厂商名称必须是中文,XXX工作室这种格式。后面的内容按照要求填写后,等待审核即可。 2.项目打包以及隐私政策弹窗
* i; ^0 H) Q ^' _ 根据国家相关部门规定: https://article.biliimg.com/bfs/article/ad7e1d39ceaf482868b5d074e3b5e6b9483438496.png
- k. x% J7 r( b. E& Khttps://article.biliimg.com/bfs/article/2c3cb34c04966c110e151b39c6521bdd483438496.png说人话就是你的应用在访问用户设备权限和信息的时候,需要以弹窗等显著形式告诉用户。所以我们要在应用启动时增加一个类似于弹窗的功能,用户同意后才能跳转到我们的应用。 具体操作如下:
5 _4 ^8 g% e# s1 \ Project Settings=>Player=>Publishing Settings=>Custom Main Manifest 勾选 https://article.biliimg.com/bfs/article/ebc55a79c76e0d4bc52e9349ee00942c483438496.png 勾选之后,Unity编辑器会在Assets/Plugins/Andorid文件夹下生成AndroidManifest.xml文件,如图: https://article.biliimg.com/bfs/article/1accafeadcc85cf2427daae512c65b4c483438496.png打开文件并修改代码,下面是修改之后的代码块:
( v9 g5 H* L) z/ d: J- U! ]$ _+ g <?xml version="1.0" encoding="utf-8"?>% A: w3 N! ]1 l' _- p3 E(欢迎访问老王论坛:laowang.vip)
<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
' y( l: K; m+ J- X1 G# {8 I<manifest
4 k W' g) |2 U7 _! x7 [- _. t xmlns:android="http://schemas.android.com/apk/res/android"
! ]' J: u' B4 s+ s2 N. k package="com.unity3d.player"
5 x& C; S- m8 k( b- J: w0 r xmlns:tools="http://schemas.android.com/tools">
) Z5 Z3 @2 g) b1 \8 O2 s7 K <application>
- l2 _ V* Q2 V2 Y" U, h: c <activity android:name="com.unity3d.player.PrivacyActivity">" o* b! e1 m5 e6 v. O/ _3 z- y4 `(欢迎访问老王论坛:laowang.vip)
<intent-filter>- j8 e2 K, I3 i+ A(欢迎访问老王论坛:laowang.vip)
<action android:name="android.intent.action.MAIN" />4 ~( K- k3 n4 J6 p) X! L0 D(欢迎访问老王论坛:laowang.vip)
<category android:name="android.intent.category.LAUNCHER" />
, ~# b& k* H8 y4 `+ b </intent-filter>
; |$ Z/ B/ Q0 C& I5 B! x <meta-data android:name="useLocalHtml" android:value="false" />1 z6 M4 L5 n* p# }) R$ o(欢迎访问老王论坛:laowang.vip)
<meta-data android:name="privacyUrl" android:value="https://blog.csdn.net/final5788" />) E" b) G7 K7 G) A5 f(欢迎访问老王论坛:laowang.vip)
</activity>
6 F5 L! X4 r4 y* }1 \1 P <activity android:name="com.unity3d.player.UnityPlayerActivity" I" I1 n( z, @- g# t(欢迎访问老王论坛:laowang.vip)
android:theme="@style/UnityThemeSelector">
, N1 x; f' p0 ^& l( J <meta-data android:name="unityplayer.UnityActivity" android:value="true" />- G( C/ T& h4 s( A6 F(欢迎访问老王论坛:laowang.vip)
</activity> f$ d# `1 Q& J9 D(欢迎访问老王论坛:laowang.vip)
</application>1 ]; h4 P* N$ Z7 s1 q2 J' R! ~(欢迎访问老王论坛:laowang.vip)
<uses-permission android:name="android.permission.INTERNET"/>
! j: ~# Y- M+ c3 C</manifest> 继续创建文件目录Android/com/unity3d/player,在player文件下下创建PrivacyActivity.java文件,如图:
( w* ]$ b8 w4 Q" Z6 t https://article.biliimg.com/bfs/article/b123ed83488007cb2c3266154f86a332483438496.pngPrivacyActivity.java文件代码如下: package com.unity3d.player;
4 x) A% \) Y% U, n' O: V' Ximport android.app.Activity;& S+ u5 T3 e, `: Q(欢迎访问老王论坛:laowang.vip)
import android.app.AlertDialog;
% `" F( d- W- B8 x6 Timport android.content.DialogInterface;* x- I" u: P* c; E8 k(欢迎访问老王论坛:laowang.vip)
import android.content.Intent;, ]) _- m9 V" P(欢迎访问老王论坛:laowang.vip)
import android.content.SharedPreferences;
2 q( e0 C) c; }7 @) [) a& x* zimport android.content.pm.ActivityInfo;
) j* |* D% D7 w% f$ ]0 ?, ^import android.content.pm.PackageManager;+ Z' e. Y# q) i5 l(欢迎访问老王论坛:laowang.vip)
import android.os.Bundle;
6 k" Z* a, Y4 x3 B0 \$ h0 m6 x% K3 Iimport android.webkit.WebResourceError;; v5 O z# T1 _; T$ h(欢迎访问老王论坛:laowang.vip)
import android.webkit.WebResourceRequest;# H' ]" s: p6 i% P$ ~- {(欢迎访问老王论坛:laowang.vip)
import android.webkit.WebView;3 o a( ^& M& q; T) W. [4 `(欢迎访问老王论坛:laowang.vip)
import android.webkit.WebViewClient;1 K# E. K4 r8 u% A7 P(欢迎访问老王论坛:laowang.vip)
6 @& p) T. L+ ]6 K% `+ E2 _public class PrivacyActivity extends Activity implements DialogInterface.OnClickListener {2 ^% X0 }7 N ?+ x! T* U(欢迎访问老王论坛:laowang.vip)
boolean useLocalHtml = true;3 M$ B) N, t4 j- e* N5 y/ ~(欢迎访问老王论坛:laowang.vip)
String privacyUrl = "https://blog.csdn.net/final5788";
. J7 }# n4 A" i9 K7 G+ V% p9 C final String htmlStr = "欢迎使用本游戏,在使用本游戏前,请您充分阅读并理解<a href=\"https://blog.csdn.net/final5788\">《用户协议》</a>和<a href=\"https://blog.csdn.net/final5788\">《隐私政策》</a>各条\n" +9 X4 B" P0 s/ F" s( z! l(欢迎访问老王论坛:laowang.vip)
"款,了解我们对于个人信息的处理规则和权限申请的目的,特别提醒您注意前述协议中关于\n" +6 j' ? I* P; C(欢迎访问老王论坛:laowang.vip)
"我们免除自身责任,限制您的权力的相关条款及争议解决方式,司法管辖等内容。我们将严\n" +$ O! R+ @" x6 l2 ~(欢迎访问老王论坛:laowang.vip)
"格遵守相关法律法规和隐私政策以保护您的个人隐私。为确保您的游戏体验,我们会向您申请以下必要权限,您可选择同意或者拒绝,拒绝可能会导致无法进入本游戏。同时,我们会根据本游戏中相关功能的具体需要向您申请非必要的权限,您可选择同意或者拒绝,拒绝可能会导致部分游戏体验异常。其中必要权限包括:设备权限(必要):读取唯一设备标识 (AndroidID、mac),生成帐号、保存和恢复游戏数据,识别异常状态以及保障网络及运营安全。存储权限(必要):访问您的存储空间,以便使您可以下载并保存内容、图片存储及上传、个人设置信息缓存读写、系统及日志文件创建。\n";
' ]3 _6 J. }, R; t
8 _/ P/ H1 M. [2 n @Override
+ I/ u, K. m8 b4 ?# P- V protected void onCreate(Bundle savedInstanceState) {
+ k) g6 G( x( ^ super.onCreate(savedInstanceState);
/ v$ W" n6 y' T `3 v
" Q9 ]4 ]) x s+ V ActivityInfo actInfo = null;
8 i0 d% H5 v7 q: G/ i* D+ ~ try {
; f* m U2 l! n6 P% t //获取AndroidManifest.xml配置的元数据, L, U# s p7 I: o* e" Z9 }% R(欢迎访问老王论坛:laowang.vip)
actInfo = this.getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);& `2 ]/ H8 f% S! o% i d(欢迎访问老王论坛:laowang.vip)
useLocalHtml = actInfo.metaData.getBoolean("useLocalHtml");
* r! J8 E$ E2 v, m0 q4 X( G privacyUrl = actInfo.metaData.getString("privacyUrl");
6 s$ H- S( l- `) X! b } catch (PackageManager.NameNotFoundException e) {: @: f7 j# o( R7 f(欢迎访问老王论坛:laowang.vip)
e.printStackTrace();% l. W$ _( R; c8 T0 [0 i(欢迎访问老王论坛:laowang.vip)
}# a7 o8 M# \1 a0 ]+ o% i3 h(欢迎访问老王论坛:laowang.vip)
; W. {/ h) v# Q. U, }3 `2 V //如果已经同意过隐私协议则直接进入Unity Activity' N' v9 G* M+ k(欢迎访问老王论坛:laowang.vip)
if (GetPrivacyAccept()){6 `, n" F# C! S(欢迎访问老王论坛:laowang.vip)
EnterUnityActivity();8 d( M" B" \$ U2 G+ p( ~/ A* @* `(欢迎访问老王论坛:laowang.vip)
return;: B: ^" x$ O/ ]. U3 l5 l( x(欢迎访问老王论坛:laowang.vip)
}
+ v- Y2 r2 e" g$ S ShowPrivacyDialog();//弹出隐私协议对话框
" t3 z' `: g) u) B }
8 z% u% t4 g0 S/ Y
' D1 m$ T- ~% M' d @Override
& }# V' R, {9 j3 X; P# Y) z$ z public void onClick(DialogInterface dialogInterface, int i) {
! T& D/ f$ B" g: ? switch (i){( Z: T! @& e$ ^) U4 }& T(欢迎访问老王论坛:laowang.vip)
case AlertDialog.BUTTON_POSITIVE://点击同意按钮' j1 D2 B. c" S6 g1 Z" ], B/ q(欢迎访问老王论坛:laowang.vip)
SetPrivacyAccept(true);
% p/ F# y' K9 X/ Q EnterUnityActivity();//启动Unity Activity7 L2 C9 U8 z3 _1 a; L( B(欢迎访问老王论坛:laowang.vip)
break;
5 P7 q% L h- G" A9 `6 P2 v case AlertDialog.BUTTON_NEGATIVE://点击拒绝按钮,直接退出App/ ?! T% U) w7 C% y(欢迎访问老王论坛:laowang.vip)
finish();* \* G. T( m) r0 N(欢迎访问老王论坛:laowang.vip)
break;0 A' l ?, V4 }+ L(欢迎访问老王论坛:laowang.vip)
}
, ]# y4 u( H& s9 s }
8 B8 z& N0 Q$ o2 _* A& L private void ShowPrivacyDialog(){1 @( i0 ^% l) V3 A c8 T: Q( y. ~(欢迎访问老王论坛:laowang.vip)
WebView webView = new WebView(this);& R9 [8 Y @2 {: X9 X4 d(欢迎访问老王论坛:laowang.vip)
if (useLocalHtml){- h+ j+ `( d5 m! _( w(欢迎访问老王论坛:laowang.vip)
webView.loadDataWithBaseURL(null, htmlStr, "text/html", "UTF-8", null);, G# ^. B: W+ W! X, n. R# g# N(欢迎访问老王论坛:laowang.vip)
}else{
% Z% D, ~1 r# e7 R webView.loadUrl(privacyUrl);6 s9 Z& t1 b7 C3 \' |(欢迎访问老王论坛:laowang.vip)
webView.setWebViewClient(new WebViewClient(){
+ F3 x" C7 {5 a, A' Y @Override
. P2 T: V, N0 R5 U) c1 F0 p. i+ {" B/ b) v public boolean shouldOverrideUrlLoading(WebView view, String url) {+ I* b6 G" k) Y(欢迎访问老王论坛:laowang.vip)
view.loadUrl(url);6 G! F1 X( {8 c; P1 J(欢迎访问老王论坛:laowang.vip)
return true;1 c( j. m+ B, h0 B1 N(欢迎访问老王论坛:laowang.vip)
}. R& t) O( A4 e" d3 g: W(欢迎访问老王论坛:laowang.vip)
9 P* `& E/ @8 \5 {1 s$ \" ~(欢迎访问老王论坛:laowang.vip)
@Override" ~% a8 A% C0 f4 ^) f+ V(欢迎访问老王论坛:laowang.vip)
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {7 l8 D4 f1 U6 d8 C! X(欢迎访问老王论坛:laowang.vip)
view.reload();
4 ?! D. N |# @7 d- K/ V# v/ u }0 K) T8 _" {! H. c: c A8 ?! G(欢迎访问老王论坛:laowang.vip)
+ X! u5 h- L% o9 L& z1 f @Override- m8 `& ?! @: B @' w; U(欢迎访问老王论坛:laowang.vip)
public void onPageFinished(WebView view, String url) {' q) n+ t+ r7 s! f2 ^& x(欢迎访问老王论坛:laowang.vip)
super.onPageFinished(view, url);, Y4 N! s' @' Y+ N8 c(欢迎访问老王论坛:laowang.vip)
}
! [7 l" o) f8 R; N) @ });
, p+ h6 U. l& N, w; |! m7 K# N }! m$ c* l, ]- d) Y(欢迎访问老王论坛:laowang.vip)
, O* O4 s; J/ N7 c4 H AlertDialog.Builder privacyDialog = new AlertDialog.Builder(this);
2 \, b9 l8 ~ E; M5 w2 J6 B privacyDialog.setCancelable(false);
( {2 q9 _9 p3 i9 Q2 w privacyDialog.setView(webView);! y6 Z7 I8 w; u2 y) f3 s2 q(欢迎访问老王论坛:laowang.vip)
privacyDialog.setTitle("User Terms & Privacy");
# h3 h5 y& Y7 y( @8 g( X privacyDialog.setNegativeButton("Exit",this);: V( A% Y# D6 K% Y- _& X(欢迎访问老王论坛:laowang.vip)
privacyDialog.setPositiveButton("Agree",this);0 M4 c# P: `* D/ U(欢迎访问老王论坛:laowang.vip)
privacyDialog.create().show();- q0 R2 f: g" u: \. h( X1 w' x(欢迎访问老王论坛:laowang.vip)
}
% x6 q* O7 |: ~//启动Unity Activity& [, V0 C5 J0 D2 f, t(欢迎访问老王论坛:laowang.vip)
private void EnterUnityActivity(){; |1 _% I7 @) h4 H(欢迎访问老王论坛:laowang.vip)
Intent unityAct = new Intent();- x$ M1 H0 l& P" u; k; O% M( \% R(欢迎访问老王论坛:laowang.vip)
unityAct.setClassName(this, "com.unity3d.player.UnityPlayerActivity");( g2 C7 S0 p0 x7 T( P; ^; k/ X/ f(欢迎访问老王论坛:laowang.vip)
this.startActivity(unityAct);
; K: }+ Y% T$ K$ e }% K4 `+ t+ ?2 u; J(欢迎访问老王论坛:laowang.vip)
//保存同意隐私协议状态 Z5 `0 G& \9 C7 S* x B(欢迎访问老王论坛:laowang.vip)
private void SetPrivacyAccept(boolean accepted){ c% y+ F: i- [" f9 m(欢迎访问老王论坛:laowang.vip)
SharedPreferences.Editor prefs = this.getSharedPreferences("PlayerPrefs", MODE_PRIVATE).edit();
) i- l. Q i1 ? v; r# p( o prefs.putBoolean("PrivacyAccepted", accepted);+ {$ S! z4 B& u8 X1 J( ?) Y(欢迎访问老王论坛:laowang.vip)
prefs.apply();
2 p) O E) \- Z- _. i7 f }
% g0 H2 m+ O5 B' P private boolean GetPrivacyAccept(){& Q" q3 f7 {! {; E0 P(欢迎访问老王论坛:laowang.vip)
SharedPreferences prefs = this.getSharedPreferences("PlayerPrefs", MODE_PRIVATE);8 f1 j3 v4 v6 G1 g(欢迎访问老王论坛:laowang.vip)
return prefs.getBoolean("PrivacyAccepted", false);
4 M( r$ a' r$ _7 }! k& w+ C }6 q8 k6 a e6 J# q( R; d9 N(欢迎访问老王论坛:laowang.vip)
}( M# `, H! }. t8 W0 Y(欢迎访问老王论坛:laowang.vip)
接下来,我们用Unity编辑器自带的打包功能,将项目打包成一个后缀名为apk的文件,Unity打包到安卓平台需要安装的一些支持,我在这里就不过多赘述了。在打包之前,我们要根据TapTap的官方文档对项目进行一些设置,具体如下:" l& y" n6 K' k6 f& Y# T( v- b(欢迎访问老王论坛:laowang.vip)
https://article.biliimg.com/bfs/article/6451d6fe7c8200afafbe44d8cae69e5b483438496.png
5 N9 w" o: }2 a2 phttps://article.biliimg.com/bfs/article/e5c8a1c75e8a7677339f6080b20722e5483438496.png$ t7 t3 D" P8 e0 Z& a1 i(欢迎访问老王论坛:laowang.vip)
Project Settings=>Player=>Other Settings=>Configuration=>Scripting Backend 切换成 IL2CPP。 Target Architectures =>ARMv7、ARM64 同时勾选8 e% a( q8 m" [# S1 L(欢迎访问老王论坛:laowang.vip)
打包成功后会生成一个后缀名为apk的文件,接下来就可以开始应用上架的流程了。
, l. [- G' T7 F$ S* V https://article.biliimg.com/bfs/article/7ed22b7e323c885d3021b28f8f2e8edc483438496.png3.创建应用并正式发布 特别声明: 以下只是个人认为比较重要或易错的部分应用上架流程,不是全部流程!!! 进入厂商资料页面: https://article.biliimg.com/bfs/article/3745c10bfc1f26c9b15ae4890d82d930483438496.png 根据要求填写,这里的厂商网址,我填的我Github的个人主页。 下面我们可以开始创建应用了: https://article.biliimg.com/bfs/article/0205c631153d7c47ecafb51faed11bcd483438496.png 这里创建的应用仅限中国大陆地区。' Z# k. q. i- _$ Z! Z(欢迎访问老王论坛:laowang.vip)
https://article.biliimg.com/bfs/article/7b381eb94fedcf4761a5ee57465ab21b483438496.png 后续资料正常按要求填写,这里补充几点需要注意的地方: 所有物料必须按照要求上传,不要抱有侥幸心理,不符合要求会被官方打回!!* _; l$ v! {+ U" m7 ?; ^# k2 {! m(欢迎访问老王论坛:laowang.vip)
https://article.biliimg.com/bfs/article/a6e13e57d3b46e586dae8d73f96cd1ea483438496.png+ ]+ M/ c# {/ e, b7 x U2 ~4 \- t(欢迎访问老王论坛:laowang.vip)
https://article.biliimg.com/bfs/article/6ca08628d769b6e4d3d3155e7ed6ae07483438496.png 这里的详情页不能是游戏内的截图!可以参考官方在右侧给出的截图:4 }5 T) p" T2 L; w$ W(欢迎访问老王论坛:laowang.vip)
https://article.biliimg.com/bfs/article/eff18b4aa3fd1aec8007dc384d2c3005483438496.png 试玩版应用也可以分测试和正式等几个阶段,我的个人建议是先进入测试阶段,让玩家测一测你上架应用中的一些Bug由于不同移动设备硬件参数不同,导致UI适配、帧率表现出与理想不一致的问题。
+ i8 o7 Y h3 _. G3 P2 m https://article.biliimg.com/bfs/article/3e430dc88e096832e8ecb77b95624261483438496.png 将应用状态更改成正式上线(试玩版)时,隐私政策链接是必填的。( ]* k1 L3 A* V3 t(欢迎访问老王论坛:laowang.vip)
https://article.biliimg.com/bfs/article/2a7228496021d5e9f524fe315c48e67c483438496.png 说人话就是要根据自己的应用写一篇隐私政策的小作文,然后把小作文的网址填进去。 参考官方文档:0 F+ q7 e0 S* G/ C) |(欢迎访问老王论坛:laowang.vip)
https://article.biliimg.com/bfs/article/635c45e44a70348a37c3ee4172bca2d3483438496.png 参考链接: http://www.oga.org.cn/newsinfo/1688274.html 打开后页面如下,点击下载链接后会下载隐私政策的模板文献,然后根据自己应用的实际情况修改即可: $ L% i" S5 O7 p(欢迎访问老王论坛:laowang.vip)
https://article.biliimg.com/bfs/article/3c1bc529229a0896df484c9e3f142cae483438496.png 不过我本人比较笨懒,所以给大家推荐一个自动生成隐私政策文献的工具:
7 Z1 z9 I4 T. P! T) a https://toolbox.yolo.blue/privacy-policy-gen ,填写对应信息之后即可生成相关隐私政策文献。 https://article.biliimg.com/bfs/article/5fc0897603ef42ab83679fb5d7140f8f483438496.png 由于我们个人开发者可能没有官网,所以可以把生成好的隐私政策文献转移到有道云笔记,并将其笔记进行分享,分享之后得到的链接填入上方即可,2024/1/25亲测有效。 https://article.biliimg.com/bfs/article/5a737cafabaf338e18609c199a7537f3483438496.png% h5 Y; G7 t: w U" V6 C(欢迎访问老王论坛:laowang.vip)
https://article.biliimg.com/bfs/article/6757423ec7293eabb1dd84f9173126e2483438496.png 点击网页最下方的状态修改按钮,打开状态修改页面: https://article.biliimg.com/bfs/article/1cbbd1ff7f637ecb8eea58b203247c9e483438496.png' K; I B* Y: K! A l# C(欢迎访问老王论坛:laowang.vip)
https://article.biliimg.com/bfs/article/c994c36570daffff6f4ac0c4a864ea89483438496.png 根据自己的实际情况选择应用的发布状态和时间,然后再提交审核。到此整个试玩版应用的上架流程就介绍完了,等待审核通过就可以在TapTap平台下载你上架的应用了(其实发布测试的时候用户就可在TapTap上试玩你上架的应用)。
8 \7 }5 Q- w8 Z* L1 m4 t: D% w" g) l 4.个人总结 以上文章内容有遗漏关键点或者错误的地方欢迎大家在评论区指出哦! 个人认为TapTap上架应用主要是得把隐私政策弹窗和隐私政策链接搞定,因为普通小白可能没接触过这一方面,我个人认为TapTap应用上架的流程还是有点繁琐的,不过......... https://article.biliimg.com/bfs/article/c358f27b7e606e36c60d53d6770bcda8483438496.png就当我没说吧,溜了...............
2 e/ ?( `' r" J+ p r' ~( H |