I am currently inegrating the connection phamtom wallet in my app being built using react -native but not getting a response from phamtom currently using the latest versions for IOS and Android.
// Handle a `connect` response from Phantom
if (/onConnect/.test(url.pathname)) {
const sharedSecretDapp = nacl.box.before(
bs58.decode(params.get('phantom_encryption_public_key')!),
dappKeyPair.secretKey,
);
const connectData = decryptPayload(
params.get('data')!,
params.get('nonce')!,
sharedSecretDapp,
);
setSharedSecret(sharedSecretDapp);
setSession(connectData.session);
setPhantomWalletPublicKey(new PublicKey(connectData.public_key));
console.log(`connected to ${connectData.public_key.toString()}`);
}
Response with data from phantom
Related
I've the following code to send a message:
function sendMessage(data) {
data.version = clientVersion;
var message = { data: CryptoJS.AES.encrypt(JSON.stringify(data), system.Authentication.SendAuth, { mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, iv: system.Authentication.Sendiv }).toString() };
return JSON.stringify(message);
}
This works just fine on dev mode. Expo app sends the encrypted message and gets decrypted properly. However, in production mode, the encrypted code gets sent and received no problem, but when decrypted by the server we get a negative sigBytes number. So the decryption failed.
This happened when updation from SDK 27 to SDK 31 of expo.
Push Notifications works perfectly side loaded to my iOS phone. I can fetch the token and successfully save it to and recall it from my Google Firestore db. Recalling it to send out notifications also work as expected. If I'm not in the App, I get a notification. If I am in the app, my Notification Listener works well.
After building to iOS and deploying the stand alone app to TestFlight on Apple's servers, Push Notifications no longer work.
This is my build.
Adrians-MBP:xxxxx abarthol$ expo build:ios -c
Checking if there is a build in progress...
Removed existing credentials from expo servers
Please enter your Apple Developer Program account credentials. These
credentials are needed to manage certificates, keys and provisioning profiles
in your Apple Developer account.
The password is only used to authenticate with Apple and never stored.
? Apple ID: xxxxx
? Password (for xxxxx): [hidden]
Trying to authenticate with Apple Developer Portal...
Authenticated with Apple Developer Portal successfully!
Only 1 team associated with your account, using Apple Team with ID: xxxxx
We do not have some credentials for you: Apple Distribution Certificate, Apple Push Notifications service key, Apple Provisioning Profile
? How would you like to upload your credentials? Expo handles all credentials, y
ou can still provide overrides
? Will you provide your own Apple Distribution Certificate? Let Expo handle the
process
✔ Didn't find any previously uploaded Apple Distribution Certificate
? Will you provide your own Apple Push Notifications service key? I want to uplo
ad my own file
Please provide your Apple Push Notifications service key:
? Path to P8 file: ~/Sites/certs/aps.cer
? Key ID: xxxxx
✔ App ID found on Apple Developer Portal.
We're going to generate:
- Apple Distribution Certificate
- Apple Provisioning Profile
✔ Generated Apple Distribution Certificate
✔ Generated Apple Provisioning Profile
Encrypted credentials and saved to the Expo servers
Publishing to channel 'default'...
Building iOS bundle
Building Android bundle
Analyzing assets
Uploading assets
No assets changed, skipped.
Processing asset bundle patterns:
- ~/Sites/Personal/xxxxx/**/*
Uploading JavaScript bundles
Published
Your URL is
https://exp.host/#xxxxx/xxxxx
Checking if this build already exists...
Build started, it may take a few minutes to complete.
You can check the queue length at https://expo.io/turtle-status
You can monitor the build at
https://expo.io/builds/xxxxx
Waiting for build to complete. You can press Ctrl+C to exit.
✔ Build finished.
Successfully built standalone app: https://expo.io/artifacts/xxxxx
Here is my component:
componentDidMount() {
this.registerForPushNotifications();
}
componentWillUnmount() {
if (!this.subscription) return;
this.subscription.remove();
}
registerForPushNotifications = async () => {
const PNToken = await this.props.MainStore.getLocal("PNToken");
if (!PNToken) {
try {
const { status } = await Permissions.getAsync(
Permissions.NOTIFICATIONS
);
let finalStatus = status;
if (status !== "granted") {
const { status } = await Permissions.askAsync(
Permissions.NOTIFICATIONS
);
finalStatus = status;
if (finalStatus !== "granted") {
throw "Notification permission not granted";
}
const token = await Notifications.getExpoPushTokenAsync();
this.props.MainStore.setPNToken(token);
this.subscription = Notifications.addListener(
this.handleNotification
);
}
} catch (err) {
console.warn("Permissions check error: ", err);
}
} else {
this.props.MainStore.setPNToken(PNToken);
this.subscription = Notifications.addListener(this.handleNotification);
}
};
handleNotification = notification => {
const store = this.props.NotificationStore;
const sortedNotifications = sortMessages([
...store.state.notifications,
{ ...notification, read: false }
]);
store.setState({
notifications: sortedNotifications
});
};
I had a lot of frustration with push finally solved the issue.
1) Enable Push notifications in Developer portal > Certificates, Identifiers & Profiles > Identifier (of your app)
2) Create your APNS key file as described here
https://fluffy.es/p8-push-notification/
3) Delete existing provisioning profile
4) expo build:ios --clear-credentials, upload your P8 file to expo
From the look of it you're providing the old APNS cert to Expo when it's asking for the new P8 format.
You should be able to generate a new P8 file from the Apple member center.
In addition to having the correct "Apple Distribution Certificate", "Apple Provisioning File" & "Apple Push Key" at expo.io, you also have to have the correct device token.
First, find experienceId of your app by executing expo credentials:manager
It is shown as
Experience: #user/slug, bundle identifier: com.xxx.xxx
Then get your token as below
const token = (
await Notifications.getExpoPushTokenAsync({
experienceId: '#user/slug', // <-- Experience shown above
})
).data;
console.log('EXPO TOKEN: ', token); // Store this in the backend
Put this device token in the expo test tool (https://expo.io/notifications) and see if you get the notification.
I have a server where I can make a WebSocket connection. When a device makes a WebSocket connection (when the app starts/splash screen), the server looks for the query parameter in the URL, which has the auth token of the user and if the token is correct, the connection is approved, else connection is rejected.
This is how the code looks on the react native client side:
const socket = new WebSocket(`ws://${website}/?token=${value}`);
socket.onmessage = (messageEvent) => {
console.log('>>> socket on message:', messageEvent.data);
};
socket.onopen = function () {
socket.send("hello world connection");
};
socket.onclose = () => {
console.log('Socket disconnected');
};
This works fine in my iOS emulator, and the iOS emulator has a WebSocket connection to mine server. However, I have an android phone (testing via LAN), and when I open the app, I get an error saying:
Unable to set ws://192.xxx.xx.xx/token=aut sfiseft2sefsefs..... as default origin header
But, if I remove the query param from the URL
const socket = new WebSocket(`ws://${website}`);
This works fine, but since I cannot pass the token in the query params, I get an error from the server.
How can I pass query parameters to the WebSocket connection in android? What am I doing wrong?
I have the same issue. Solve the issue by using encodeURI() before passing the url to WebSocket.
const uri = encodeURI(`ws://${website}/?token=${value}`);
const socket = new WebSocket(uri);
This works for me.
I am developing a simple app using React Native. I am testing it on Genymotion Android Emulator. I have created local web server to listen to the requests, it is running at http://localhost:8082/API/.
I have tested the api and is working right. Then I make a fetch request from index.android.js.
here's the API sample request from the React Native code :
var api = { getUser(){
var url = "http://127.0.0.1:8082/API/";
return fetch(url)
.then((res) => res.json())
.catch(
(error)=>{
console.log('error' + error.message);
throw error;
}
);
}
}
module.exports = api;
here's the code from Api Server (built with flightPHP)
Flight::route('GET /',function(){
try{
$db = new PDO('mysql:host=localhost;port=3307;dbname=testapp', 'root','');
$stmt = $db->prepare("SELECT * FROM user LIMIT 1");
$stmt->execute();
header('Content-type: application/json');
echo json_encode($stmt->fetchAll(PDO::FETCH_ASSOC));
$db = null;
}catch(Pdoexception $e){
echo $e->getMessage();
}
});
after execute this call i receive Network Request Failed(). it seems android simulator not recognized the api url. any suggestion ? thanks before
i already solved. just change the API url var url = "http://127.0.0.1:8082/API/ in the React Code. to var url = "http://local-ip-address:8082/API/
to check your local ip just run ipconfig from command line / cmd
You can use ngrok to overwrite network requests.
Android is an emulator, and when you fetch 127.0.0.1, it goes to the local phone.
ngrok will create a link that is accessible from the web and redirect to the local web server.
Hello it's my first time doing a sign in process in a mobile app with Titanium and I wonder what information should I save and the best practice to do it?
My server is configured in this way:
The server requires I send a user and password and if the information match it will provide a token session.
This is the code I use for signing in:
function signIn(e) {
//function to use HTTP to connect to a web server and transfer the data.
var sendit = Ti.Network.createHTTPClient({
onerror : function(e) {
Ti.API.debug(e.error);
alert('There was an error during the connection');
},
timeout : 100000,
});
//Here you have to change it for your local ip
sendit.open('POST', 'http://myserver');
var params = {
user : $.txtUsuario.value,
password : $.txtPassword.value
};
sendit.send(params);
//Function to be called upon a successful response
sendit.onload = function() {
var json = this.responseText;
var response = JSON.parse(json);
if (response.success == "true")
{
var landing = Alloy.createController("menu").getView();
$.index.close();
landing.open();
}
else
{
alert(response);
}
};
};
the code above is working, however I do not know how to manage the sign out. I would like my application works like the most apps do, e.g:
You sign in once and after that if you do not close the app you are able to continues using it and even making a request.
Thank you for any explanation.
It depends on your app requirements. for exemple if you will use the token in your app later you can save it as an AppProperty :
Ti.App.Properties.setString('token',yourTokenGoHere);
and in the app starting you can get it back :
var myToken = Ti.App.Properties.getString('token');
and then you can make a test for example if the token is still valid or not :
if(myToken === 'invalidtoken')
youSholdLogin();
else
youCanGoFurther();
and when the user disconnect rest the token to be invalid :
Ti.App.Properties.setString('token', 'invalidtoken');